2013-05-30 49 views
2

我已经使用ptrace(2)编写了一个调试器,主要用于审计系统调用和重定向子进程的标准IO。我也想用这个调试器来检测内存泄漏。实现内存调试器

我认为这可能与统计对系统调用brk(2)的引用一样容易,但事实并非如此。不幸的是(或者幸运的是),Linux似乎在程序结束时调用brk(2),无论内存是否被正确释放。

我已经看到了这个在调用malloc(3)free(3)程序,并只是调用malloc(3)程序 - 它们都具有的brk(2)调用该程序已呼吁exit_group(2)的时间,它等于计数发生在回报(也许是我可能会错误地解释这些结果?)。

或者,也许exit_group(2)不等同于从主返回,我应该设置一个不同的中断点来审计brk(2)的呼叫计数。

我发现了一个类似的问题here,但我仍然没有找到答案。

据我所知,Valgrind是一个完美的工具,但它会造成相当大的开销。

有没有人有检测到与ptrace(2)内存泄漏有用的信息? ptrace(2)可能吗?有没有更实用的方法?是否有内存调试子进程的API?

编辑:

如果有涉及与其他功能分配内存时,我就指望这些呢。在malloc的页面上,它表示mmap(2)也用于内存分配。所以,我也会这样。

+2

BRK()不会被调用使用malloc。我相信这是为了给进程提供空间而被调用(aka,brk()是什么给你的进程地址空间)。我认为,malloc调用然后大块这个brked区域,这就是为什么你不能只计算呼叫brk()。 – Magn3s1um

+0

只需注意 - 在进程终止时,OS释放进程的所有内存。这可能是你看到的最后的呼叫。所以你可能想在'exit_group()'之前寻找一个地方来检查这些调用。 –

+0

@DanFego,我知道,我在我的问题中写道。 – tay10r

回答

1

使用gdb的堆扩展。它会做你想做的。如果你想以编程方式使用它,只是管的结果,您的应用程序做后期处理:

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

+0

看起来很有用,但我不要认为这对我的使用会很实际。我想避免运行一个单独的进程。也许如果我使用了一些源代码,它会有所帮助,但是在查看其他人的代码时,我感到非常可怕 – tay10r