c++ - Valgrind 标志,调试与发布编译
问题描述
在 Jenkins 实例上,我需要 Valgrind 来检查 C++ 编译的二进制文件中是否存在特定问题。但是,我只需要一个是/否的答案,而不是堆栈跟踪。如果它们有任何问题,我将在错误代码上启动 valgrind,并在我的个人计算机上激活调试标志。在 Linux 运行机器上使用 CMake 管理构建(以 gcc 为目标)。
如果我在 Jenkins 实例上编译我的代码-DCMAKE_BUILD_TYPE=Release
,Valgrind 会在二进制文件中检测到与 with 相同的问题-DCMAKE_BUILD_TYPE=Debug
吗?
解决方案
Valgrind 通过在运行时检测和替换部分代码来工作,例如将调用重定向到内存分配函数。为此,它不依赖调试信息,但可能会被优化代码弄糊涂:
如果您计划使用 Memcheck:在极少数情况下,编译器优化(在 -O2 及更高版本,有时是 -O1)会生成代码,使 Memcheck 错误地报告未初始化的值错误,或丢失未初始化的值错误。我们已经详细研究了如何解决这个问题,不幸的是,这样做会进一步显着减缓已经是一个缓慢的工具。所以最好的解决方案是完全关闭优化。(来自Valgrind 手册)
由于Release
构建类型使用优化,因此不适合您的情况。
推荐阅读
- css - 为什么我必须重写 webkit 样式表来为锚链接创建 css 规则?
- firebase - 是否可以限制 firebase 项目的用户仅从控制台编辑特定文档和集合?
- c - `utsname` 的字段 `nodename` 和 `gethostname()` 的 `name` 指向的输出字符串有什么区别?
- polybase - 在 Polybase 中更改表
- python - 文件读取嵌套循环不会循环多次
- rest - 使用 Restbird 对使用授权代码授予类型 Oauth 2.0 保护的 API 进行自动化测试
- python - Python:如何使 Pillow 和 Tkinter 兼容?
- python - 如何从 anacoda 中删除 python 模块
- python - 类在 SQLalchemy 中没有名为“x”的映射列
- actions-on-google - 在 Google Home Mini 上测试 Google Action