【发布时间】:2015-12-17 01:44:07
【问题描述】:
我正在尝试修复一个非常大的项目中的内存泄漏。基准测试已经确认内存泄漏是一个严重的问题,我正在努力寻找它们的根源。
在一个非常简单的案例上运行该项目,我报告了大约 850 个潜在的内存泄漏。除了大约 5 个之外,所有这些看起来都像:
==83597== 768 bytes in 3 blocks are possibly lost in loss record 743 of 864
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48)
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so)
==83597== by 0x1101: ???
==83597== by 0xF7: ???
==83597== by 0x64D4D87: ???
==83597== by 0xFFFFFFFFFFFFFFFD: ???
==83597== by 0x6: ???
==83597== by 0x4F03BB0: ??? (in /path/to/project/library-version.so)
==83597== by 0xFFFFFFFFFFFFFFFD: ???
==83597== by 0x64D4D87: ???
==83597== 920 bytes in 1 blocks are possibly lost in loss record 750 of 864
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48)
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so)
==83597== by 0xFFEFFFD5F: ???
==83597== by 0x38F: ???
==83597== by 0xFFEFFFE5F: ???
==83597== by 0xF: ???
==83597== by 0x54542FF: ??? (in /path/to/project/library-version.so)
==83597== by 0x4F536CA: ??? (in /path/to/project/library-version.so)
==83597== by 0x64B981F: ???
==83597== by 0xF: ???
==83597== by 0x54542FF: ??? (in /path/to/project/library-version.so)
==83597== 1,360 bytes in 1 blocks are possibly lost in loss record 789 of 864
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48)
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so)
==83597== by 0x1101: ???
==83597== by 0x547: ???
==83597== by 0x1F: ???
==83597== by 0x6584267: ???
==83597== by 0x547: ???
==83597== by 0x4F13808: ??? (in /path/to/project/library-version.so)
==83597== by 0x6584267: ???
==83597== by 0x6584527: ???
==83597== by 0x65805FF: ???
我正在努力让 valgrind 提供真实、有用的输出而不是 ???,但这可能是不可能的,我希望能够从 memcheck 获得有用的输出,直到发生这种情况。
一个有用的报告有 > 1 个函数调用来自真实源文件而不是 .so 文件报告(因为每个输出都将 myproject_malloc 报告为潜在的泄漏源)。我可以从输出中删除所有垃圾并在我的 emacs 编译缓冲区中仍将其显示为纯文本的最简单方法是什么?
我知道我可以编写一个几十行长的 Python 脚本来完成这项工作,方法是检查每次输入新的错误报告并计算我看到“.c:\d+”的次数,但是我更喜欢更简单的。
有没有用命令行工具做这件事的好方法?还是我不知道的 valgrind 选项?
【问题讨论】:
标签: shell parsing emacs valgrind