内存泄漏调试

时间:2009-09-24 19:10:14

标签: c memory-leaks embedded

如果没有跟踪工具,有哪些检测/调试内存泄漏的技术?

6 个答案:

答案 0 :(得分:7)

拦截分配和释放内存的所有函数(取决于平台,列表可能如下所示:malloc,calloc,realloc,strdup,getcwd,free),除了执行这些函数最初执行的操作外,还保存有关在一个动态增长的全局数组中,某些地方的调用可能受到多线程程序的同步原语的保护。

此信息可能包括函数名称,请求的内存量,成功分配的块的地址,可以让您弄清楚调用者是什么的堆栈跟踪等等。在free()中,从数组中删除相应的元素(如果没有,则将错误的指针传递给free,这也是一个很好的早期检测错误)。当程序结束时,转储数组的其余元素 - 它们将是泄漏的块。不要忘记分别在main()之前和之后分配和释放资源的全局对象。要正确计算这些资源,您需要在最后一个全局对象被销毁后转储剩余的资源,因此可能需要对编译器运行时进行小规模的攻击

答案 1 :(得分:4)

  1. 查看你的循环
  2. 看看你在哪里分配变量 - 你有没有取消分配它们?
  3. 尝试使用一小部分可疑代码重现泄漏。
  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非常友好,允许内存覆盖/双重释放。它可以检测到这些异常并优雅地避免任何崩溃。

相关问题