我想确定导致段错误的原因,我正在尝试使用valgrind来执行此操作。
https://gist.github.com/4349869是一个要点,当我运行没有valgrind的东西时,我会遇到段错误,但是当我使用valgrind时,我没有得到段错误。 (我重复了几次,结果相同)
这是否意味着该bug是一个heisenbug,当我使用valgrind时不会发生,因此valgrind在这里没有任何用处?
答案 0 :(得分:5)
这是否意味着该bug是一种在我使用时不会发生的heisenbug valgrind,因此valgrind在这里没有用吗?
不,您仍应使用Valgrind并修复所有报告的错误。您描述的行为相当普遍,并在Valgrind FAQ中记录:
当一个程序在Valgrind下运行时,它的环境是轻微的 不同于它本地运行时。例如,内存布局是 不同,线程的安排方式也不同。
大部分时间这没有任何区别,但它可以, 特别是如果你的程序是错误的。例如,如果你的程序 崩溃,因为它错误地访问了无法寻址的内存, 运行时,这个内存不可能无法寻址 在Valgrind。或者,如果您的程序有数据竞争,那么这些 可能不会在Valgrind下出现。
答案 1 :(得分:2)
在使用调试信息进行编译时或在valgrind下运行时更改内存放置时,可能会隐藏分段错误。当然,这并不意味着您不能使用valgrind来调试您的应用程序。您应该修复valgrind报告的所有错误,例如无效的读/写错误。修复这些错误应该可以解决您的分段错误问题。