在我开始发明轮子之前,我决定做一些搜索,看看我想要的功能是否已经在某个地方实现了。通常,我想分析我的 macOS kext 并查找任何内存问题(尤其是内存泄漏)。
更具体地说,我希望找到一个基于代码的分析器(因为外部分析器不支持调试内核模块),它用作 malloc/free 的包装器。
1. on every malloc it record where you allocated the memory (file/line)
2. on every free, it remove this meta data (along with the memory itself).
3. on tear-down, it scans for all left dynamic memory regions
and prints them out (along with their corresponding meta-data).
This analysis may be called when unloading the driver, which is the point
where all memory should be free.
这是一个使用双向链表的实现选项,根据具有一些输入大小的分配请求,实际的 malloc 为 size +overhead
其中第二部分旨在包含指向上一个分配和下一个分配的链接,以及元数据本身(获取文件名使用FILE宏和使用LINE宏的代码行,可能还有更多信息),返回地址是overhead
实际分配的偏移量,因此用户可以只处理读取的数据。
在 之后free
,我们使用输入地址 -offset
作为实际输入,free
因为这是原始分配的内存,但在释放本身之前,应该从链表中正确删除该项目。
经过分析,我们迭代列表并打印每个元素。
请注意,有一些实现细节,例如通过锁定代码段和从链表中插入/删除项目来支持多线程环境。
或者,也许有一个 GDB/LLDB 插件可以扫描所有动态分配的内存(并打印其大小)......
附言
在 Windows 中,有一个这样的模块driver verifier
,它为您的内核模块提供了上述功能,并且您不需要重新编译任何东西(它在运行时标志上被激活)...... macOS 上有没有这样的工具?