2009-05-22 59 views
2

我有一個核心轉儲坐在盤,通過一個失敗的斷言和終止應用程序創建的。該應用程序在Linux/g ++上以調試模式編譯。我懷疑在堆棧頂部的堆棧框架中,我的this對象已被delete'd(我認爲this不再是有效的ptr)。但是,重現這種中止可能需要幾天或更長的時間。在c + + gdb核心轉儲,我可以看到指針是否仍然分配?

有沒有辦法讓我從gdb(或其他地方)查詢新的/免費的實現,並驗證給定的內存地址是否是有效的分配內存?換句話說,我可以看到,如果我的this仍被分配,或者它可能已經被deleted「d?它必須是靜態的,因爲我只有一個核心轉儲,而不是正在運行的可執行文件。

+0

在windows中,我會看看這個指向的內存並在調試器中尋找「feeefeee」。在調試模式下,在Windows中,將其寫入刪除的內存以幫助您進行調試。任何機會gcc/linux都有類似的功能? – 2009-05-22 16:20:42

回答

1

這不是不可能的,但如果你使用標準的malloc/free/new/delete調用,它會非常接近。如果您認爲幾天內可以再次重現問題,那可能是更快的路線。

在此期間您可以做的是爲下一個事件做好準備,以便您更好地分析它。

Dmalloc是一個免費的實用程序,您可以使用該實用程序將默認的C/C++內存函數替換爲可執行額外檢查和簿記的版本。

LD_PRELOAD=libdmalloc.so your_program_here將使用dmalloc運行程序,您可以設置標誌擦除內存,以便您知道是否有任何內存已被刪除。

0

核心轉儲包含退出時程序的完整狀態(包括進程內存分配的狀態)。但是,您必須深入瞭解內存分配的工作原理,以確定對象是否仍然有效。但是,即使不知道確切的內存分配策略,在調試器中檢查程序狀態也可能導致發現問題。你是否檢查了所有線程的堆棧以顯示「壞」值?他們可能會給你非常有價值的提示。

另一個非常好的主意是在valgrind上運行你的應用程序。