valgrind是否会阻止我想要调试的段错误?

时间:2012-12-21 00:55:15

标签: debugging segmentation-fault valgrind heisenbug

我想确定导致段错误的原因,我正在尝试使用valgrind来执行此操作。

https://gist.github.com/4349869是一个要点,当我运行没有valgrind的东西时,我会遇到段错误,但是当我使用valgrind时,我没有得到段错误。 (我重复了几次,结果相同)

这是否意味着该bug是一个heisenbug,当我使用valgrind时不会发生,因此valgrind在这里没有任何用处?

2 个答案:

答案 0 :(得分:5)

  

这是否意味着该bug是一种在我使用时不会发生的heisenbug   valgrind,因此valgrind在这里没有用吗?

不,您仍应使用Valgrind并修复所有报告的错误。您描述的行为相当普遍,并在Valgrind FAQ中记录:

  

当一个程序在Valgrind下运行时,它的环境是轻微的   不同于它本地运行时。例如,内存布局是   不同,线程的安排方式也不同。

     

大部分时间这没有任何区别,但它可以,   特别是如果你的程序是错误的。例如,如果你的程序   崩溃,因为它错误地访问了无法寻址的内存,   运行时,这个内存不可能无法寻址   在Valgrind。或者,如果您的程序有数据竞争,那么这些   可能不会在Valgrind下出现。

答案 1 :(得分:2)

在使用调试信息进行编译时或在valgrind下运行时更改内存放置时,可能会隐藏分段错误。当然,这并不意味着您不能使用valgrind来调试您的应用程序。您应该修复valgrind报告的所有错误,例如无效的读/写错误。修复这些错误应该可以解决您的分段错误问题。