【发布时间】:2013-05-30 17:41:54
【问题描述】:
我使用ptrace(2) 编写了一个调试器,主要用于审计系统调用和重定向子进程的标准IO。我也想用这个调试器检测内存泄漏。
我认为这可能就像计算对系统调用 brk(2) 的引用一样简单,但事实并非如此。不幸的是(或幸运的是),Linux 似乎在程序结束时调用了brk(2),无论内存是否被正确释放。
我在一个调用malloc(3) 和free(3) 的程序以及一个只调用malloc(3) 的程序中看到了这一点——当程序调用exit_group(2) 时,它们的brk(2) 调用次数相等,这是在返回时发生的(也许我可能错误地解释了这些结果?)。
或者,exit_group(2) 可能不等于从 main 中“返回”,我应该设置一个不同的断点来审核 brk(2) 的调用计数。
我发现了一个类似的问题here,但我仍然没有找到答案。
我知道 Valgrind 是一个完美的工具,但它会导致相当大的开销。
有没有人有关于使用ptrace(2) 检测内存泄漏的有用信息? ptrace(2) 可以吗?有没有更实用的方法?有没有内存调试子进程的API?
编辑:
如果还有其他与分配内存有关的功能,我也会计算这些功能。在malloc 的页面上,它说 mmap(2) 也用于内存分配。所以,我也会数那个。
【问题讨论】:
-
brk() 不会被 malloc 调用。我相信调用它是为了给进程提供空间(也就是 brk() 是给你进程地址空间的东西)。我认为 malloc 调用然后将这个 brked 区域分块,这就是为什么你不能只计算对 brk() 的调用。
-
请注意——在进程终止时,操作系统会为进程释放所有内存。这可能是您看到的最后的电话。所以你可能想在
exit_group()之前找一个地方来检查这些电话。 -
@DanFego,我知道,我在我的问题中写了。
-
@Magn3s1um,我读到 malloc 将在这里调用 brk(2) 或 mmap(2),linux.die.net/man/3/malloc。你能再给我解释一下吗?
-
真正的 malloc() 实现通常会维护一个可用的本地池来满足来自的小请求,因此它们不必在每种情况下都去操作系统获取更多内存。
标签: c linux debugging memory-leaks