Valgrind 标志,调试与发布编译

Valgrind flags, debug vs release compilation

本文关键字:编译 布编译 标志 调试 Valgrind      更新时间:2023-10-16

在 Jenkins 实例上,我需要 Valgrind 来检查C++编译的二进制文件中是否存在特殊问题。但是,我只需要一个是/否的答案,而不是例如堆栈跟踪。如果它们有任何问题,我将在我的个人机器上激活调试标志,在错误的代码上启动 valgrind。该构建在运行 Linux 的计算机上使用 CMake 进行管理(针对 gcc)。

如果我在 Jenkins 实例上使用-DCMAKE_BUILD_TYPE=Release编译代码,Valgrind 会检测到二进制文件中与-DCMAKE_BUILD_TYPE=Debug相同的问题吗?

Valgrind 的工作原理是在运行时检测和替换部分代码,例如将调用重定向到内存分配函数。为此,它不依赖于调试信息,但它可能会被优化的代码混淆:

如果您打算使用Memcheck:在极少数情况下,编译器 已观察到优化(在 -O2 及以上,有时为 -O1) 生成欺骗 Memcheck 错误报告的代码 未初始化的值错误,或缺少未初始化的值错误。我们 已经详细研究了解决此问题,不幸的是结果 这样做会使 已经是一个缓慢的工具。因此,最好的解决方案是关闭优化 完全。 (来自瓦尔格林德手册)

由于Release构建类型是使用优化,因此不适合您的情况。