Valgrind错误在操作系统中有所不同

Posted

技术标签:

【中文标题】Valgrind错误在操作系统中有所不同【英文标题】:Valgrind error differ in operating systems 【发布时间】:2011-10-31 15:50:31 【问题描述】:

我使用 valgrind 来调试我的应用程序。我有两台机器,我想在其中运行代码而不会出错。 一种是运行 valgrind 3.7.0 的 ubuntu 11.10,一种是运行 valgrind 3.6.0 和 valgrind 3.8.0 的 Mac OS X 10.7.2。

我运行以下 valgrind 命令:

 valgrind --track-origins=yes ./my_program

在 Linux 机器上,我没有收到任何错误报告。在 Mac 上 valgrind 抱怨

==35723== Conditional jump or move depends on uninitialised value(s)
==35723==    at 0x10004DCAF: boost::spirit ...

由于在 boost 库中报告了错误,我认为 boost 库中可能没有错误(两台机器 1.46.1 上的 boost 版本相同)。

不同错误报告的原因可能是什么?

【问题讨论】:

目前的Boost版本是1.47,怎么会有3.6.1? 您为什么要关心它们有何不同?相反,解决一个版本指示的问题,然后两个都会通过。 3.6.1 是 Valgrind 的当前版本,@tune2fs 请解决您的问题。 对不起,我已将版本更改为 1.46.1 【参考方案1】:

Valgrind 不是静态分析工具,而是运行时工具,即 valgrind 在虚拟机上运行程序。许多应用程序中的大量代码并不是由每台机器触发或编译的,这解释了它们之间的差异。

【讨论】:

【参考方案2】:

您是否在两台计算机上使用不同的编译器?在访问未初始化的变量时,可能不同的编译器或不同的编译器版本会生成具有不同行为的代码。

【讨论】:

它们是两台机器上两个不同版本的gcc,我尝试用相同的版本编译。【参考方案3】:

我有过这种形式的陈述

if (A && B) 
  do_stuff

其中B 仅在A 为真时才被初始化。当我没有使用优化时,程序(如预期的那样)首先检查A,然后,如果是真的,检查B。优化时,编译器发现先检查B 是有利可图的; 因为AB 都没有任何副作用或依赖于易失性内存,这是等价的。后一种行为导致valgrind 给了我你所看到的警告类型,即使代码没有任何问题。我的猜测是这里正在发生类似的事情。

【讨论】:

以上是关于Valgrind错误在操作系统中有所不同的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind 内存分析器结果

内存泄露检测工具Valgrind

Valgrind 自动测试——它们在某处使用过吗?

“gdb”和“valgrind”以不同的方式执行二进制文件?

在 Solaris 上找到错误的内存访问

Valgrind:致命错误:memcheck.h:没有这样的文件或目录