2012-12-21 54 views
4

我想确定是什么导致段错误,我试图用valgrind来做到这一点。是否valgrind防止发生段错误我想调试发生?

https://gist.github.com/4349869是当我运行没有valgrind的东西时出现段错误,但在使用valgrind时没有出现段错误。 (我已经重复了几次,结果相同)

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

+0

如果这是一个竞争条件或其他多线程问题,valgrind执行速度很慢可能会改变结果。你使用多线程? –

回答

4

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

不,您应该仍然使用Valgrind并修复所有报告的错误。您所描述的行为是相当常见的,它是在Valgrind FAQ记载:

当一个程序Valgrind的下运行,它的环境是当它在本地运行略有不同 。例如,内存布局是 不同,并且线程被调度的方式是不同的。

大多数情况下,这并没有什么区别,但它可以,特别是如果你的程序有问题。例如,如果程序 因为错误地访问了不可寻址的内存而崩溃,则可能在Valgrind下运行 时,该内存不可能无法寻址。或者,如果您的程序有数据竞赛,则这些 可能不会在Valgrind下显示。

2

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