实现内存调试器

时间:2013-05-30 17:41:54

标签: c linux debugging memory-leaks

我使用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)也用于内存分配。所以,我也算数。

1 个答案:

答案 0 :(得分:1)

使用gdb的堆扩展名。它会做你想要的。如果您想以编程方式使用它,只需将结果传递给您的应用程序进行后期处理:

https://fedorahosted.org/gdb-heap/