如果没有跟踪工具,有哪些检测/调试内存泄漏的技术?
答案 0 :(得分:7)
拦截分配和释放内存的所有函数(取决于平台,列表可能如下所示:malloc,calloc,realloc,strdup,getcwd,free),除了执行这些函数最初执行的操作外,还保存有关在一个动态增长的全局数组中,某些地方的调用可能受到多线程程序的同步原语的保护。
此信息可能包括函数名称,请求的内存量,成功分配的块的地址,可以让您弄清楚调用者是什么的堆栈跟踪等等。在free()中,从数组中删除相应的元素(如果没有,则将错误的指针传递给free,这也是一个很好的早期检测错误)。当程序结束时,转储数组的其余元素 - 它们将是泄漏的块。不要忘记分别在main()之前和之后分配和释放资源的全局对象。要正确计算这些资源,您需要在最后一个全局对象被销毁后转储剩余的资源,因此可能需要对编译器运行时进行小规模的攻击
答案 1 :(得分:4)
答案 2 :(得分:4)
一种可能性是编译代码并在可以利用内置工具的系统上执行它(例如Solaris上的libumem或Linux上的libc capability
答案 3 :(得分:3)
分而治之是最好的方法。如果您已经系统地编写了代码,那么调用代码的子集应该很容易。你最好的办法是一遍又一遍地执行每段代码,看看你的内存使用量是否稳步攀升,如果没有继续下一段代码。
此外,关于内存泄漏的wikipedia article在参考部分中有几个很好的链接,用于检测不同系统(窗口,macos,linux等)的内存泄漏
答案 4 :(得分:2)
关于SO的类似问题:
除了其他人提到的手动检查技术外,您还应该考虑使用代码分析工具,例如valgrind
。
来自他们网站的介绍:
Valgrind是一个屡获殊荣的人 建筑仪器框架 动态分析工具。有 Valgrind工具可以自动完成 检测许多内存管理和 线程错误,并分析您的 节目详细。你也可以使用 Valgrind建立新工具。
目前Valgrind发行 包括六个生产质量的工具: 内存错误检测器,两个线程 错误检测器,缓存和 分支预测分析器,a 调用图生成缓存分析器, 和一个堆分析器。它还包括 两个实验工具:a 堆/堆栈/全局数组溢出 检测器和SimPoint基本块 矢量发电机。它运行在 以下平台:X86 / Linux, AMD64 / Linux,PPC32 / Linux,PPC64 / Linux, 和X86 / Darwin(Mac OS X)。
答案 5 :(得分:0)
我使用了memtrace http://www.fpx.de/fp/Software/MemTrace/ http://sourceforge.net/projects/memtrace/
如果有任何泄漏,您可能需要调用统计功能打印输出。最好的方法是在执行模块或代码之前和之后调用此统计函数。 *警告* Memtrace非常友好,允许内存覆盖/双重释放。它可以检测到这些异常并优雅地避免任何崩溃。