1

在我开始发明轮子之前,我决定做一些搜索,看看我想要的功能是否已经在某个地方实现了。通常,我想分析我的 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 上有没有这样的工具?

4

0 回答 0