2012-05-04 32 views
2

我有C/C++代碼給出了段錯誤。它在RH Linux Enterprise服務器上使用gcc/g ++進行編譯。我用Valgrind的內存檢查的可執行文件:如何進一步基於Valgrind輸出進行調試

valgrind --tool=memcheck --leak-check=full --show-reachable=yes 

我得到這個作爲Valgrind的輸出信息之一:

==7053== Invalid read of size 1 
==7053== at 0xDBC96C: func1 (file1:4742) 
==7053== by 0xDB8769: func2 (file1.c:3478) 
==7053== by 0xDB167E: func3 (file1.c:2032) 
==7053== by 0xDB0378: func4 (file1.c:1542) 
==7053== by 0xDB97D8: func5 (file1.c:3697) 
==7053== by 0xDB17A7: func6 (file1.c:2120) 
==7053== by 0xDBD55E: func7 (file2.c:271) 

==7053== Address 0x1bcaf2f0 is not stack'd, malloc'd or (recently) free'd 

我讀到意味着我的代碼已訪問一個無效的內存位置,它是不允許的。

我的問題:

  1. 如何找出哪個緩衝存儲器存取已經無效,其功能上面做了那個。

  2. 如何使用地址0x1bcaf2f0,valgrind所說的無效。我怎樣才能找到該地址的符號(本質上是緩衝區名稱)?內存映射文件,任何其他方式。

  3. 使用Valgrind檢測內存(堆/堆棧損壞)錯誤的任何其他常規指針,valgrind選項或其他工具?

回答

3

廣告1:在你的例子中,這將func1行文件1:4742(1)。以下功能是堆棧跟蹤。分析該行應該會導致無效的內存訪問。

廣告2:嘗試將其拆分爲多個更簡單的行,以防萬一它確實過於複雜並且不明顯哪些確切的調用導致警告。

廣告3:memcheck是用於檢測堆內存錯誤的典型valgrind工具。儘管如此,它不會幫助堆棧損壞。

+0

謝謝。任何關於如何追蹤上述valgrind輸出中顯示的內存位置「0x1bcaf2f0」的變量的指針? – goldenmean

+0

特別是如果顯示的地址來自動態分配的緩衝區? – goldenmean

+0

什麼幫助堆棧損壞? – xaxxon

相關問題