访问员 - 如果您没有工具来检查如何检测内存泄漏问题?
答案 - 我将阅读代码,看看我分配的所有内存是否已被代码本身释放。
采访者不满意。有没有其他方法可以这样做?答案 0 :(得分:5)
对于下面定义的所有实现,需要为malloc
()&编写包装器。 free
()函数。
为了简单起见,请跟踪malloc()&的计数。自由()。如果不相等则会发生内存泄漏。
更好的版本是跟踪地址malloc()'ed& free()'ed这样你可以识别哪些地址是malloc()'ed但不是free()'ed。但是这也无济于事,因为你无法将地址与源代码联系起来,特别是当你有一个大的源代码时它会成为一个挑战。
所以在这里,你可以再添加一个功能。例如,我为FreeBSD Kernel编写了一个类似的工具,你可以修改malloc
()调用来存储模块/文件信息(给每个模块/文件一个no,你可以在某个头文件中定义它),导致此stack trace
()的函数调用malloc
并将其存储在数据结构中,只要malloc
()或free
(),就会将上述信息存储在上面叫做。使用malloc
()返回的地址与free
()匹配。因此,当他们的内存泄漏时,您可以获得有关哪个地址不是free
()'的信息,在哪个文件中,调用它的确切函数是什么(通过stack trace
)。< / p>
这个工具的方式是,在崩溃时,我曾经得到一个核心转储。我在内核内存空间中定义了globals(这是我收集数据的数据结构),我可以使用gdb
访问它并检索信息。
修改强>
最近在调试linux内核中的内存泄漏时,我遇到了一个名为kmemleak
的工具,它实现了我在上面第3点中描述的类似算法。请阅读此处的Basic Algorithm
部分:https://www.kernel.org/doc/Documentation/kmemleak.txt
答案 1 :(得分:0)
当我必须真正做到这一点时,我的回答是构建工具......一个调试堆层,包裹在C堆中,以及宏来切换代码以针对这些调用运行而不是直接访问普通堆库。该层包括一些用于检测数组边界违规的fencepost逻辑,一些用于监视堆正在执行操作的工具,可选地记录了确切分配和释放每个块的人员...
另一种方法当然是“分而治之”。构建单元测试以尝试缩小导致泄漏的操作,然后进一步细分该代码。
根据“无工具”的含义,核心转储有时也很有用;例如,看到堆的内容可能会告诉你泄漏了什么。
依旧......