2013-03-08 74 views
0

我剛剛收到從Valgrind的輸出,我有點不明白:Valgrind輸出地址和問號?

==20290== Invalid read of size 1 
==20290== at 0x8C1D678: ??? 
==20290== by 0x5D74C47: ??? 
==20290== Address 0xee818c7d is not stack'd, malloc'd or (recently) free'd 
==20290== 
==20290== 
==20290== Process terminating with default action of signal 11 (SIGSEGV) 
==20290== Access not within mapped region at address 0xEE818C7D 
==20290== at 0x8C1D678: ??? 
==20290== by 0x5D74C47: ??? 
==20290== If you believe this happened as a result of a stack 
==20290== overflow in your program's main thread (unlikely but 
==20290== possible), you can try to increase the size of the 
==20290== main thread stack using the --main-stacksize= flag. 
==20290== The main thread stack size used in this run was 8388608. 
==20290== 

特別,我對這些問號混淆。通常你在這個地方得到的是valgrind檢測到的錯誤的位置。我之前使用過valgrind,並且所有輸出都如manual中所述。我已經使用了這個valgrind命令:

valgrind --tool=memcheck --leak-check=full --leak-resolution=high --num-callers=20 --track-origins=yes 

程序本身大喊一個分段錯誤。雖然valgrind這次沒有告訴我任何內存泄漏的位置,但是從調試中我已經確定了發生分段錯誤的地方。不幸的是,它位於英特爾ODE解算器庫(dodesol)的ODE求解器函數中,我無法訪問它。我仔細檢查過我多次傳遞給這個函數的所有參數,他們似乎沒問題(至少對應於我之前手動和示例的那些參數)。

+0

用'-g3'或'-g2'編譯確保符號存在。使用「-O1」或「-O0」編譯以確保符號正確。另請參閱Valgrind快速入門指南中的[準備程序](http://valgrind.org/docs/manual/quick-start.html#quick-start.prepare)。 – jww 2018-01-12 17:48:16

回答

2

???幾乎肯定意味着Valgrind無法在所討論地址附近的任何地方找到符號。我懷疑你在沒有代碼的情況下執行代碼。這可能是覆蓋棧上返回地址的結果,例如,可能是由於緩衝區溢出(但其他指針錯誤可觸發它)。Valgrind非常擅長動態分配內存的問題,但它有更多使用局部變量很困難,因爲它不一定可以確定堆棧數組的結束位置。

1

如果您在剝離的二進制/庫上運行Valgrind,並且它在本地符號(例如靜態函數)中發現錯誤,您會得到此結果的一種情況。

使用仍包含所有本地符號信息的二進制/庫的未分割版本將在Valgrind輸出中提供源文件和行號。

+0

不幸的是,事實並非如此,我的程序是自洽的,儘管使用了一些外部庫(gsl和intel ode求解器,問題似乎在這裏)。在我將intel ode解決方案連接到它之前,它運行良好。無論如何,謝謝你的回答! – 2013-03-08 16:10:57