Valgrind 标志,调试与发布编译

Posted

技术标签:

【中文标题】Valgrind 标志,调试与发布编译【英文标题】:Valgrind flags, debug vs release compilation 【发布时间】:2018-05-17 08:05:40 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

如果您打算使用 Memcheck:在极少数情况下,编译器 已观察到优化(在 -O2 及以上,有时为 -O1) 生成欺骗 Memcheck 错误报告的代码 未初始化的值错误,或缺少未初始化的值错误。我们 已经详细研究过解决这个问题,不幸的是结果 这样做是否会进一步显着放缓 已经是一个缓慢的工具。所以最好的解决办法是关闭优化 共。 (来自Valgrind manual)

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

【讨论】:

以上是关于Valgrind 标志,调试与发布编译的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind 错误 - 无法执行二进制文件

如何根据 Valgrind 输出进一步调试

Valgrind

使用 g++ 在 Linux 上使用 Valgrind 拦截全局函数

C编译器中是不是有调试模式编译标志的标准?

valgrind - 检查程序中的内存泄漏问题