2009-10-15 24 views
0

我正在調試一個應用程序,它在一個幾乎不可能確定哪個實例導致段錯誤的位置上進行段錯誤。如何找出使用gdb實例化對象的位置?

我想如果我能夠解決創建對象的位置,我會知道哪個實例導致問題並解決該錯誤。爲了能夠檢索這些信息,gdb(或其他一些應用程序)當然必須重寫默認的malloc/new/new []實現,但是用這個來檢測我的應用程序就沒問題了。

有人可能會說我可以把一個斷點就行了一個之前的段錯誤,並從那裏步入對象,但問題是,這是一個核心消息調度循環用來處理的一個很大的不同消息,並且我無法設置斷點條件來捕捉我的行爲不當的對象。

+1

這不是直接回答你的問題,但你有沒有嘗試在valgrind/memcheck下運行? – 2009-10-15 14:36:22

+0

你可能也想看看http://linux.die.net/man/3/efence,看起來它可以幫助你在這種情況下。 – 2009-10-15 14:39:06

+0

良好的通話。我有,它給了我一個「無效的大小4讀」。但它只指向消息調度程序循環中的迭代器。我懷疑這確實是個問題,即正在迭代的std :: list在循環中被篡改,所以我會更深入地考慮這一點。 – anorm 2009-10-15 14:39:12

回答

1

您是否嘗試過使用內存調試庫(例如dmalloc)。其中許多已經儀器新等,並記錄分配的地方。雖然有些更容易從gdb訪問。

本產品具有內存調試功能,你想要做什麼:http://www.allinea.com/index.php?page=48

+0

在給出的兩個答案中(截至目前),這在我看來是最好的選擇。謝謝 – anorm 2009-10-16 07:12:56

3

所以,在發生段錯誤的時候,你有這個對象,但是你不知道創建這樣的對象的許多代碼片段中的哪一個創建了它,對吧?

我會測量所有這些對象創建位,並讓它們記錄創建到文件的每個對象的地址,以及文件和行號(__LINE__和__FILE__預定義的宏可以使這個簡單)。

然後在調試器下運行應用程序,讓它捕獲段錯誤並在日誌中查找違規對象的地址以找出它創建的位置。然後剝下洋蔥的下一層。

0

我會當段錯誤發生在gdb使用回溯命令第一次嘗試。如果這並不能讓我知道發生了什麼,那麼我會嘗試使用valgrind來檢查是否有任何內存泄漏發生。以我的經驗來說,這兩個步驟通常足以縮小並在大多數常見情況下找到問題點。

問候。