在Linux下,如何在预建软件中追踪内存泄漏?

时间:2010-06-21 00:26:25

标签: linux memory-leaks

我有一个新的Ubuntu Linux服务器64位10.04 LTS。

启用了复制的默认Mysql安装似乎是在泄漏内存。 但是,我们已经尝试回到早期版本,内存仍在泄漏,但我无法分辨到哪里。

我可以使用哪些工具/技术来确定内存泄漏的位置,以便我可以解决问题?

4 个答案:

答案 0 :(得分:3)

Valgrind,http://valgrind.org/,在这些情况下非常有用。它运行在未修改的可执行文件上,但如果您可以安装调试符号,它确实有很大帮助。一定要使用--show-reachable = yes标志,因为泄漏的内存仍然可以通过某种方式访问​​,但不是你想要的方式。还有 - 在叉子的情况下跟踪孩子。您可能必须在调用可执行文件的启动脚本中进行跟踪,然后添加如下内容:

 valgrind --show-reachable=yes --trace-children=yes --log-file=/path/to/log SQL-cmdline sqlargs

手册页有许多其他可能有用的选项。

您是否尝试过MySQL邮件列表?如果您能以直接的方式重现它,那么这样的东西肯定会引起他们的兴趣。

答案 1 :(得分:2)

你可以使用Valgrind作为ninjalj建议,但我怀疑你会接近任何有用的东西。即使您看到真正的泄漏(并且它们很难验证),通过C调用堆栈追踪根本原因可能会非常烦人(例如,如果泄漏是由特定的SQL模式或存储过程触发的,您将从结果优化查询中查看调用堆栈,而不是原始调用(可能使用不同语言)。

通常你可能没有追索权,不得不求助于通过callstacks和迭代测试来追踪它,但你有MySQL的源代码(包括确切的默认包安装的来源),所以你可以使用更高级的像MemoryScape这样的工具(或者至少用符号构建,以便为Valgrind提供更多的思考)。

答案 2 :(得分:1)

尝试使用valgrind。

答案 3 :(得分:0)

为大多数发行版安装/可用的非常好且功能强大的工具是Valgrind

它有很多不同的选项,而且(据我所见)是linux系统下的默认探查器。