2012-12-21 86 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報告中的所有錯誤,例如無效的讀/寫錯誤。修復這些錯誤應該可以解決您的分段故障問題。