我正在調試一個應用程序,它在一個幾乎不可能確定哪個實例導致段錯誤的位置上進行段錯誤。如何找出使用gdb實例化對象的位置?
我想如果我能夠解決創建對象的位置,我會知道哪個實例導致問題並解決該錯誤。爲了能夠檢索這些信息,gdb(或其他一些應用程序)當然必須重寫默認的malloc/new/new []實現,但是用這個來檢測我的應用程序就沒問題了。
有人可能會說我可以把一個斷點就行了一個之前的段錯誤,並從那裏步入對象,但問題是,這是一個核心消息調度循環用來處理的一個很大的不同消息,並且我無法設置斷點條件來捕捉我的行爲不當的對象。
這不是直接回答你的問題,但你有沒有嘗試在valgrind/memcheck下運行? – 2009-10-15 14:36:22
你可能也想看看http://linux.die.net/man/3/efence,看起來它可以幫助你在這種情況下。 – 2009-10-15 14:39:06
良好的通話。我有,它給了我一個「無效的大小4讀」。但它只指向消息調度程序循環中的迭代器。我懷疑這確實是個問題,即正在迭代的std :: list在循環中被篡改,所以我會更深入地考慮這一點。 – anorm 2009-10-15 14:39:12