在我开始发明轮子之前,我决定进行一些搜索,看看我的所需功能是否已在某处实现。 一般来说,我想分析我的macOS kext并查找任何内存问题(特别是泄漏的内存)。
更具体地说,我希望找到一个基于代码的探查器(因为外部探查器不支持调试内核模块),它用作malloc / free的包装器。
get
这是一个使用双向链表的实现选项,在具有一些输入大小的alloc请求时,实际malloc的大小为+ 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.
,其中第二部分用于包含前一个分配和下一个分配的链接,和元数据本身(使用 FILE 宏和代码行使用 LINE 宏获取文件名,可能还有更多信息),返回地址是overhead
的偏移量实际分配,以便用户只能处理读取数据。
在overhead
后,我们使用输入地址 - free
作为offset
的实际输入,因为这是原始分配的内存,但在释放之前,该项应该正确从链表中删除。
经过分析,我们迭代列表并打印每个元素。
请注意,有一些实现细节,例如通过锁定代码部分和从链表中插入/删除项来支持多线程环境。
或者,也许有一个GDB / LLDB插件扫描所有动态分配的内存(并打印其大小)......
P.S
在windows中有一个名为free
的模块,它为你的内核模块提供上述功能,你不需要重新编译任何东西(它在运行时标志上激活)...是否有任何macOS上的这样的工具?