2012-11-13 21 views
2

我有一個應用程序與SIGSEGV崩潰。valgrind無法檢測到什麼樣的錯誤?

--20183-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting 
--20183-- si_code=80; Faulting address: 0x0; sp: 0x409a8de60 

valgrind: the 'impossible' happened: 
    Killed by fatal signal 
==20183== at 0x38039981: vgPlain_arena_free (m_mallocfree.c:245) 
==20183== by 0x38001E84: die_and_free_mem (mc_malloc_wrappers.c:124) 
==20183== by 0x380688C3: vgPlain_scheduler (scheduler.c:1402) 
==20183== by 0x380913F4: run_a_thread_NORETURN (syswrap-linux.c:95) 

它必須某種內存損壞它搞砸的malloc鏈,如墜毀隨機位置會發生 - 釋放時,卻始終。

通常你會看到這樣的消息:

Invalid write of size 8 

這標誌着地方,我損壞記憶,但沒有任何消息,只是立即崩潰。 AFAIK valgrind涵蓋了大部分系統調用,因此它甚至會報告與這些調用相關的問題,所以...

我的理論(*)問題是:我應該尋找什麼樣的錯誤? valgrind無法檢測到什麼樣的無效寫入?

(*):請不要問了實際的代碼,正如我所說,這是一個理論性的問題。

側面的問題:是否有任何其他工具,以趕上這一問題?

回答

2

除非本最近發生了變化,Valgrind的的MEMCHECK工具無法檢測覆蓋堆棧數組邊界。這可能會導致Valgrind可能無法接受的各種有趣問題。

我做了一些挖掘和發現所謂Annelid用戶創建的工具,聲稱能檢測到堆棧變量腐敗。這可能有助於找到這樣的問題。

我的大部分用Valgrind的的內部經驗圍繞其內存檢查系統,所以別人也許能闡述一下它的其他方面和所能做和不能檢測。

3

只檢查堆上的分配,不檢查global/stack變量。

如果緩衝區溢出最終訪問有效內存(另一個分配的塊),則不會捕獲緩衝區溢出。對於下面的例子Valgrind的不報告溢出(當然這一切都取決於你所使用的內存分配器...):

int main() { 
    char* a = malloc(1024); 
    char* b = malloc(1024); 
    *(a+1600) = '!'; 
} 

在我的情況的valgrind的ptrcheck工具(--tool=exp-ptrcheck)發現了這個問題。

+1

工具名稱變更爲EXP-sgcheck爲3.7版本(https://en.wikipedia.org/wiki/Valgrind#Other_tools) – lclark

相關問題