如何在* nix系统上的大型C / C ++代码中跟踪/修复与内存相关的问题


9

在跟踪与内存相关的问题时使用什么策略?您使用什么工具(开放源代码和专有工具)来识别内存泄漏,内存损坏等?如果只有gdb / dbx在系统上可用,您将如何跟踪内存泄漏?

对我来说,仅使用调试器修复内存泄漏非常困难。


2
我个人认为这个问题与程序设计有关,而不是与unix有关。
phunehehe

Answers:


12

如果您可以更改源代码,则Dmalloc很棒。它会列出未释放的指针,以及(对于使用调试符号构建的代码)释放指针的确切位置。

如果您做不到,那么Valgrind几乎就是这种事情的标准。我通常觉得Valgrind有点难用,但它具有更多功能,并且不涉及在代码中添加dmalloc调用


dmalloc在大型系统中表现不佳。Valgrind是一个更好的选择,甚至在那里你会打瓶颈...

valgrind --tool memcheck“ yourapp”将在运行时提供与内存相关的信息(在桌面系统中很有用)。另一个很棒的工具是memwatch,但应与您的源代码一起编译。Memwatch可以将详细信息记录到文件中,因此更适合嵌入式系统。
rajaganesh87 2011年


2

Massif(来自valgrind)是查找内存泄漏的最佳方法之一。重复您的可疑代码(或运行程序足够长的时间),然后使用ms_print转储结果。通常,调用堆栈会为您提供足够的信息来修复它。

使用GDB,您可以尝试附加到正在运行的程序并调用诸如 malloc_stats()

如果您的程序是用其他语言编写的,则可能会更棘手。最近,一些GDB获得了脚本编写能力,人们开始了一些有趣的项目,例如gdb-heap,该项目可以从核心转储中分析Python内存。类似的内存analysys脚本可能适用于C ++对象。

阅读/programming/2564752/examining-cc-heap-memory-statistics-in-gdb



1

我从事Objective-C已有一段时间了,有一个分析器可以处理C级内存管理和类似的事情。Clang Static Analyzer非常好,Apple决定将其与xCode IDE捆绑在一起。我不确定这是否适合您的问题,但是如果您使用的是C语言,那么值得尝试。


次要问题:clang从一开始就被开发用于xcode。参见clang.llvm.org/clang_video-05-25-2007.html
Daniel James

丹尼尔,您好,这可能是正确的,但是直到最近(或者至少没有从我从Apple下载的捆绑软件中),它才包含在
xCode中
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.