2010-11-13 145 views

回答

6

生成映射文件。地圖文件會告訴你每個函數的起始地址(作爲從exe開始的偏移量,所以你需要知道它的加載的基地址)。然後你看看指令指針並查看它在映射文件中的位置。這給你一個在給定函數中的位置的好主意。

但是,手動展開堆棧是一種黑色藝術,因爲您不知道編譯器執行了哪些優化。當你知道,粗略地說,你在代碼中的位置通常可以計算出應該在棧上應該是什麼,並通過內存掃描找到返回指針。但它相當涉及。實際上,你花費大量時間來讀取內存數據並尋找看起來像內存地址的數字,然後檢查它是否合乎邏輯。它是完全可行的,我,我相信很多人,已經做了很多次:)

+1

我們如何在Linux中生成映射文件?你可以在這個.. ..提示一些提示.... – 2010-11-13 14:57:56

+0

http://www.cygwin.com/ml/cygwin/1999-09/msg00327.html – Goz 2010-11-13 14:59:23

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

  1. 正常鏈接可執行文件(使用-g標誌)。假設這是所謂的foo然後...
  2. 運行objcopy - 只有保持調試foo foo.dbg創建一個包含調試信息的文件。
  3. 運行objcopy --strip-debug foo創建一個剝離的可執行文件。
  4. 運行objcopy --add-gnu-debuglink = foo.dbg foo將調試信息的鏈接添加到剝離的可執行文件中。