据我所知,valgrind可以调用memcheck来执行内存泄漏检查,在这种情况下,编译的C ++可执行程序必须包含调试信息。然后,如果我想使用valgrind / callgrind来执行分析,那么可执行文件是否必须包含调试信息?我运行了一个小测试,似乎valgrind / callgrind可以在没有调试信息的情况下处理发布可执行程序。任何人都可以证实吗?
答案 0 :(得分:4)
从官方Valgrind文档链接中,可以找到以下信息:
<强> 2.2。入门
首先,考虑是否有益 重新编译您的应用程序和支持库,并启用调试信息(-g选项) 。
没有调试信息,最好的 Valgrind 工具将能够做猜测特定代码片段属于哪个函数,< em>这使得错误消息和分析输出几乎无用。使用-g,您将获得直接指向相关源代码行的消息。
您可能要考虑的其他选项,如果您使用的是C ++,则为-fno-inline。这样可以更容易地看到函数调用链,这有助于减少在大型C ++应用程序中导航时的混淆。例如,使用此选项时,使用Memcheck调试OpenOffice.org会更容易一些。您不必这样做,但这样做有助于Valgrind生成更准确,更少混淆的错误报告。如果您打算使用GNU GDB或其他调试来调试程序,那么您可能已经设置了这样的机会。
因此,建议的步骤是使用-g选项重新编译程序以从Valgrind获取最大信息。
答案 1 :(得分:1)
根据valgrind手册:
http://valgrind.org/docs/manual/manual-core.html
如果您打算使用Memcheck:在极少数情况下,编译器优化(在-O2及以上,有时是-O1)已被观察到生成代码,这会使Memcheck错误地报告未初始化的值错误或丢失未初始化的值错误。我们已经仔细研究了这个问题,不幸的是,结果是这样做会使已经很慢的工具进一步显着减速。所以最好的解决方案是完全关闭优化。由于这通常会使事情变得无法缓慢,因此合理的折衷方案是使用-O。这可以让您获得更高优化级别的大部分好处,同时保持Memcheck误报或漏报的可能性相对较小。此外,您应该使用-Wall编译代码,因为它可以识别Valgrind在更高优化级别可能会遗漏的部分或全部问题。 (一般来说,使用-Wall也是一个好主意。)所有其他工具(据我们所知)不受优化级别的影响,对于像Cachegrind这样的分析工具,最好以正常的优化级别编译程序。