【问题标题】:Implementing a Memory Debugger实现内存调试器
【发布时间】: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


【解决方案1】:

使用 gdb 的堆扩展。它会做你想做的事。如果您想以编程方式使用它,只需将结果通过管道传输到您的应用程序以进行后期处理:

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

【讨论】:

  • 看起来很有用,但我认为它对我的使用并不实用。我想避免运行单独的进程。也许如果我使用一些源代码会有所帮助,我只是害怕看其他人的代码
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多