一個C++程序在FreeBSD 6.2和OS上崩潰,足以創建核心轉儲。是否有可能截斷一些堆棧幀,重置指令指針並重新啓動gdb中的進程,以及如何?從核心轉儲崩潰中恢復
回答
是的,gdb可以像運行程序一樣調試核心轉儲。假設a.out
是你的程序的可執行文件的名稱和a.core
是你的核心文件的名稱,調用GDB像這樣:
gdb a.out a.core
然後你就可以調試正常人一樣,但你不能以任何方式繼續執行(即使你可以,程序也會再次崩潰)。您可以檢查堆棧跟蹤,寄存器,內存等。
是否可以截斷某些堆棧幀,重置指令指針並重新啓動gdb進程?
我假設你的意思是:改變進程狀態,並將其設置爲再次開始執行(就像它從不首先崩潰一樣)。否則,你如何建議GDB(如果它神奇地擁有這種能力)將處理你的文件描述符(當你的進程死亡時內核自動關閉)?
如果我沒有弄錯GDB有能力調用函數和分配變量,那麼至少在理論上可以在進程重新啓動的地方恢復文件描述符。 – Droopov
「有能力調用函數」 - 只有當你有一個「活的」劣質進程時,當你調試核心時,GDB不能。「恢復文件描述符」:它們可能指向不再存在的文件,或者而且,文件偏移量僅由內核維護,所以GDB無法恢復它們。 –
這可能重複:Best practices for recovering from a segmentation fault
摘要:這是可能的,但不建議使用。這樣做的方法是從信號處理程序中使用setjmp()和longjmp()。 (請看完整的源代碼示例,重複發佈
- 1. GDB核心轉儲:崩潰後恢復argc argv值
- 2. 開啓核心/崩潰轉儲編程
- 3. eclipse從崩潰中恢復
- 4. Erlang:如何禁用「崩潰轉儲」和「核心轉儲」生成?
- 5. 崩潰存儲到核心數據
- 6. 從後臺恢復後訪問核心數據NSManagedObject崩潰應用程序
- 7. Apache Camel - 從JVM崩潰中恢復
- 8. 串行端口程序崩潰(無核心轉儲)
- 9. 進程核心轉儲不會在崩潰後創建
- 10. 核心轉儲,Apport會,不,我使用Ubuntu 12.04崩潰報告
- 11. 崩潰時創建IBM JVM Java核心轉儲
- 12. C++:程序在[memcpy]處發生核心轉儲崩潰
- 13. 核心數據崩潰mergeChangesFromContextDidSaveNotification
- 14. CoreMotion崩潰:CLMotion核心,CLGeomagneticModelProvider_Type
- 15. 核心數據崩潰
- 16. 核心數據崩潰
- 17. iPhone - 核心數據崩潰
- 18. 崩潰與核心數據
- 19. 核心數據崩潰
- 20. 核心電話崩潰
- 21. 奇怪的崩潰從核心數據
- 22. 核心轉儲文件恢復程序的狀態
- 23. 核心轉儲?
- 24. 轉儲崩潰轉儲
- 25. 恢復崩潰的InputStream
- 26. MySQL ...啓動崩潰恢復
- 27. 崩潰恢復Android應用
- 28. 「無法及時恢復」從後臺崩潰恢復
- 29. 從崩潰轉儲中提取變量
- 30. 啓用核心轉儲爲崩潰過程中的MacOS塞拉利昂
GDB不會像調試程序那樣調試核心轉儲,因爲您無法執行任何打印機。請參閱http://yosefk.com/blog/非常有趣gdb-ve-ery-funny.html – ACyclic