2013-08-20 64 views
1

我的項目中有一個嚴重的錯誤。當我使用gdb來打開它爲我喜歡的東西。核心的(我並沒有把所有的GDB輸出爲了便於閱讀):在gdb中找到哪個函數導致「地址越界」

這是代碼::

非常非常可疑,新寫的部分
0x00000000004579fe in http_chunk_count_loop 
(f=0x82e68dbf0, pl=0x817606e8a Address 0x817606e8a out of bounds) 

這是該工作了很長一段時間沒有問題::

0x000000000045c8a5 in packet_handler_http 
(f=0x82e68dbf0, pl=0x817606e8a Address 0x817606e8a out of bounds) 

OK現在什麼弄亂我的頭腦是pl=0x817606e8a Address 0x817606e8a out of bounds代碼非常成熟的部分,GDB顯示它已經出界則達到了新的前書面代碼。這讓我想到由功能引起的問題,它調用packet_handler_http

但是packet_handler_http非常成熟,工作很長一段時間沒有問題。這讓我誤會了gdb輸出。

問題是與packet_handler_http我猜,但由於這是已經工作的代碼我很困惑,我正確的我的猜測還是我錯過了什麼?

+3

工作代碼並不意味着正確的代碼。 – alk

+1

它可能是一個參數,就像ex的緩衝區指針,它被傳遞到導致錯誤的這些函數中。如果'packet_handler_http'成熟了,那麼打破它的可能是一個無效的輸入?很難說沒有更多的代碼訪問... – Jimbo

+0

我想分享代碼,但項目很大,它不可讀。我很好奇,如果它在推出的代碼中表示「超出界限」,因爲gdb在暗戀那一刻獲取了內存的快照,或者那時它真的「超出界限」。 –

回答

2

感謝你們的反應,甚至gdb說對面它結果指針是好的。

在導致出界問題的新代碼中有一部分。

有一行像::(goodpointer + offset),這個偏移量是http塊大小,我從網絡(數據嗅探)中獲取它。而且這種偏移非常大,會導致整數溢出。這導致了界限問題。

我的結論是:不要從網絡推送參數從不,gdb可能並不總是在coredump上正確指出參數,因爲在壓碎的時刻,事情可能會變得雜亂無章。

+1

+1有關的代碼的一些部分,以便得出結論:**至少** *外部*數據應始終**進行完整性檢查(「輸入驗證」 )在被處理之前! – alk

4

爲了檢測「內存錯誤」,你可能會喜歡Valgrind的下運行的程序:http://valgrind.org

如果已經編譯符號(-g海合會)的程序,你可以很準確地檢測「出界」的條件下,以發生錯誤的代碼行以及分配內存的代碼行(如果有的話)。

2

問題是與packet_handler_http我猜

這猜測是不太可能是正確的:如果packet_handler_http真的收到了無效的指針,那麼腐敗的發生,從它的「上游」。

這是該工作了很長一段時間沒有問題

經常找到代碼中的bug工作「沒有問題」了10多年,代碼非常成熟的部分。此外,腐敗可能發生在新添加的代碼中,但在別處造成問題。堆和堆棧緩衝區溢出通常就是這樣。

按照alk的建議,運行ValgrindAddress Sanitizer(也包含在GCC-4.8中)的可執行文件,並解決他們發現的任何問題。