无需任何工具即可调试内存泄漏问题

时间:2014-03-11 04:30:34

标签: c memory-management

访问员 - 如果您没有工具来检查如何检测内存泄漏问题?

答案 - 我将阅读代码,看看我分配的所有内存是否已被代码本身释放。

采访者不满意。有没有其他方法可以这样做?

2 个答案:

答案 0 :(得分:5)

对于下面定义的所有实现,需要为malloc()&编写包装器。 free()函数。

  1. 为了简单起见,请跟踪malloc()&的计数。自由()。如果不相等则会发生内存泄漏。

  2. 更好的版本是跟踪地址malloc()'ed& free()'ed这样你可以识别哪些地址是malloc()'ed但不是free()'ed。但是这也无济于事,因为你无法将地址与源代码联系起来,特别是当你有一个大的源代码时它会成为一个挑战。

  3. 所以在这里,你可以再添加一个功能。例如,我为FreeBSD Kernel编写了一个类似的工具,你可以修改malloc()调用来存储模块/文件信息(给每个模块/文件一个no,你可以在某个头文件中定义它),导致此stack trace()的函数调用malloc并将其存储在数据结构中,只要malloc()或free(),就会将上述信息存储在上面叫做。使用malloc()返回的地址与free()匹配。因此,当他们的内存泄漏时,您可以获得有关哪个地址不是free()'的信息,在哪个文件中,调用它的确切函数是什么(通过stack trace)。< / p>

  4. 这个工具的方式是,在崩溃时,我曾经得到一个核心转储。我在内核内存空间中定义了globals(这是我收集数据的数据结构),我可以使用gdb访问它并检索信息。

    修改

    最近在调试linux内核中的内存泄漏时,我遇到了一个名为kmemleak的工具,它实现了我在上面第3点中描述的类似算法。请阅读此处的Basic Algorithm部分:https://www.kernel.org/doc/Documentation/kmemleak.txt

答案 1 :(得分:0)

当我必须真正做到这一点时,我的回答是构建工具......一个调试堆层,包裹在C堆中,以及宏来切换代码以针对这些调用运行而不是直接访问普通堆库。该层包括一些用于检测数组边界违规的fencepost逻辑,一些用于监视堆正在执行操作的工具,可选地记录了确切分配和释放每个块的人员...

另一种方法当然是“分而治之”。构建单元测试以尝试缩小导致泄漏的操作,然后进一步细分该代码。

根据“无工具”的含义,核心转储有时也很有用;例如,看到堆的内容可能会告诉你泄漏了什么。

依旧......