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

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

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

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

答案1

如果可以修改源代码的话动态分配是很棒的;它将列出哪些指针未被释放以及(对于使用调试符号构建的代码)它们被分配在哪一行。

如果你不能,瓦尔格林德几乎是这类事情的标准。我通常发现 Valgrind 有点难用,但它有更多的功能,并且不涉及在代码中添加 dmalloc 调用

答案2

valgrind 非常有帮助。

答案3

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

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

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

另请阅读https://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb

答案4

我已经使用 Objective-C 有一段时间了,并且有一个分析器可以处理 C 级内存管理之类的东西。Clang 静态分析器非常好,Apple 决定将其与 xCode IDE 捆绑在一起。我不确定这是否适合你的问题,但如果你正在做 C 那么值得一试。

相关内容