如何分析未使用-g GCC選項編譯的核心轉儲(使用gdb) ?編譯時不帶-g選項的調用堆棧(gcc編譯器)
3
A
回答
6
生成映射文件。地圖文件會告訴你每個函數的起始地址(作爲從exe開始的偏移量,所以你需要知道它的加載的基地址)。然後你看看指令指針並查看它在映射文件中的位置。這給你一個在給定函數中的位置的好主意。
但是,手動展開堆棧是一種黑色藝術,因爲您不知道編譯器執行了哪些優化。當你知道,粗略地說,你在代碼中的位置通常可以計算出應該在棧上應該是什麼,並通過內存掃描找到返回指針。但它相當涉及。實際上,你花費大量時間來讀取內存數據並尋找看起來像內存地址的數字,然後檢查它是否合乎邏輯。它是完全可行的,我,我相信很多人,已經做了很多次:)
1
這應該不是一個問題,你可以用-g選項再次編譯源代碼,並通過gdb核心和新的編譯調試二進制文件,它應該沒有任何問題。
順便說一句,可以生成在GCC
GCC -Wl,-Map = system.map與下面命令的映射文件file.c
上面一行應生成地圖文件system.map,生成地圖文件後,您可以如上所述映射地址,但我不確定您將如何映射共享庫,這非常困難
+0
你也可以看看http:// yusufonlinux .blogspot.com/2010/11 /調試核 - 使用 - gdb.html – 2010-11-24 10:19:19
2
使用ELF二進制文件可以將調試符號分隔爲單獨的文件。引用自objcopy man pages:
- 正常鏈接可執行文件(使用-g標誌)。假設這是所謂的foo然後...
- 運行objcopy - 只有保持調試foo foo.dbg創建一個包含調試信息的文件。
- 運行objcopy --strip-debug foo創建一個剝離的可執行文件。
- 運行objcopy --add-gnu-debuglink = foo.dbg foo將調試信息的鏈接添加到剝離的可執行文件中。
相關問題
- 1. 編譯器堆棧溢出
- 2. 編譯編譯器錯誤編譯GCC
- 3. gcc與complex.h的編譯器選項
- 4. 用g ++編譯器編譯Multi2Sim
- 5. 使用g ++編譯器編譯boost.asio
- 6. 調用用g ++編譯的庫的C/C++函數,用gcc編譯的程序
- 7. gcc/g ++:編譯大文件時出錯
- 8. Gcc編譯器命令和選項
- 9. g ++編譯失敗,Cmake不編譯
- 10. 相當於VS2010 cl編譯器的g ++的-g選項?
- 11. strncpy_s使用G ++編譯器
- 12. 使用gcc編譯帶-D選項的多個文件
- 13. 使用Windows編譯器之間的編譯庫編譯器,cygwin和linux g ++
- 14. 如何恢復g ++/gcc編譯信息
- 15. g ++編譯和鏈接選項
- 16. MonoDevelop的G ++編譯器
- 17. Windows GCC和MSVC編譯器之間的編譯時間比較
- 18. 錯誤的堆棧跟蹤與GCC +預編譯頭
- 19. 舊的gcc編譯器
- 20. 用gcc編譯.c
- 21. C++編譯器g ++ 11
- 22. G ++ 4.1.2編譯器錯誤
- 23. 「g ++」和「C++」編譯器
- 24. GCC中是否有編譯選項在編譯時檢查內存錯誤?
- 25. 使用G ++編譯器編譯GTK +應用程序
- 26. Typescript編譯器選項alwaysStrict不可用?
- 27. 如何在Windows編譯器和GCC編譯器中使用SSE?
- 28. GNU GCC編譯器優化和調試
- 29. JIT編譯器 - 編譯器選擇選項
- 30. 使用不同版本的gcc和g ++編譯問題
我們如何在Linux中生成映射文件?你可以在這個.. ..提示一些提示.... – 2010-11-13 14:57:56
http://www.cygwin.com/ml/cygwin/1999-09/msg00327.html – Goz 2010-11-13 14:59:23