2011-10-19 194 views
4

一個C++程序在FreeBSD 6.2和OS上崩潰,足以創建核心轉儲。是否有可能截斷一些堆棧幀,重置指令指針並重新啓動gdb中的進程,以及如何?從核心轉儲崩潰中恢復

回答

2

是的,gdb可以像運行程序一樣調試核心轉儲。假設a.out是你的程序的可執行文件的名稱和a.core是你的核心文件的名稱,調用GDB像這樣:

gdb a.out a.core 

然後你就可以調試正常人一樣,但你不能以任何方式繼續執行(即使你可以,程序也會再次崩潰)。您可以檢查堆棧跟蹤,寄存器,內存等。

+1

GDB不會像調試程序那樣調試核心轉儲,因爲您無法執行任何打印機。請參閱http://yosefk.com/blog/非常有趣gdb-ve-ery-funny.html – ACyclic

3

是否可以截斷某些堆棧幀,重置指令指針並重新啓動gdb進程?

我假設你的意思是:改變進程狀態,並將其設置爲再次開始執行(就像它從不首先崩潰一樣)。否則,你如何建議GDB(如果它神奇地擁有這種能力)將處理你的文件描述符(當你的進程死亡時內核自動關閉)?

+0

如果我沒有弄錯GDB有能力調用函數和分配變量,那麼至少在理論上可以在進程重新啓動的地方恢復文件描述符。 – Droopov

+0

「有能力調用函數」 - 只有當你有一個「活的」劣質進程時,當你調試核心時,GDB不能。「恢復文件描述符」:它們可能指向不再存在的文件,或者而且,文件偏移量僅由內核維護,所以GDB無法恢復它們。 –