我使用ptrace(2)
编写了一个调试器,主要用于审核系统调用和重定向子进程的标准IO。我还想使用这个调试器来检测内存泄漏。
我认为它可能像计算对系统调用brk(2)
的引用一样简单,但它不是。不幸的是(或者幸运的是),Linux似乎在程序结束时调用brk(2)
,无论内存是否被正确释放。
我在调用malloc(3)
和free(3)
的程序以及只调用malloc(3)
的程序中看到了这一点 - 他们都有brk(2)
个相同的调用次数当程序调用{{1}}时,这是在返回时发生的(也许我可能会错误地解释这些结果?)。
或者,或许exit_group(2)
不等同于'返回'来自main,我应该设置一个不同的断点来审核exit_group(2)
的呼叫计数。
我发现了一个类似的问题here,但我仍然没有找到答案。
我知道Valgrind是一个完美的工具,但它会带来相当大的开销。
是否有人使用brk(2)
获取有关检测内存泄漏的有用信息?可以使用ptrace(2)
吗?有更实用的方法吗?是否有用于内存调试子进程的API?
修改
如果还有其他涉及分配内存的功能,我也会计算它们。在malloc的页面上,它表示mmap(2)也用于内存分配。所以,我也算数。
答案 0 :(得分:1)
使用gdb的堆扩展名。它会做你想要的。如果您想以编程方式使用它,只需将结果传递给您的应用程序进行后期处理: