2012-05-14 63 views
7

我想訪問保存在沒有調試符號的程序的核心轉儲中的幀(我想在C中執行此操作)。當我打開程序和GDB中的核心轉儲時,我得到一個包含函數名稱的堆棧跟蹤。例如:如何從核心轉儲(無GDB)讀取幀?

(gdb) bt 
#0 0x08048443 in layer3() 
#1 0x08048489 in layer2() 
#2 0x080484c9 in layer1() 
#3 0x0804854e in main() 

所有函數的名稱都存儲在可執行文件的.strtab節中。我如何建立不同幀的堆棧跟蹤?在批處理模式下運行GDB是而不是的一個選項。也只是「從gdb中複製需要的部分」也是一個壞主意,因爲代碼不是獨立編寫的。

所以爲了更準確地提出我的問題:我在哪裏可以找到一個核心轉儲內的點,以便我可以開始讀取堆棧信息?是否有某種類型的圖書館可以訪問這些信息?我可以使用的結構?或者甚至更好,文檔如何在覈心轉儲中構建這些信息?

(我已經看到了這個問題:「how to generate a stack trace from a core dump file in C, without invoking an external tool such as gdb」,但由於沒有有效的答案,我想我會再問吧)

[編輯]我在Linux下的x86這樣

+3

Windows,Linux或MacOS的? x86,x86_64,PPC,Arm ....? – Flexo

+0

哦,天哪,我很抱歉,忘了! Linux,x86 – Uhlo

+0

http://www.kernel.org/doc/man-pages/online/pages/man5/core.5.html – Flexo

回答

7

Coredump也包含堆棧信息。如果您可以在coredump文件中使用此堆棧信息以及EBP和EIP寄存器值,則可以打印堆棧跟蹤。我寫了一個程序來做到這一點。您可以在以下鏈接中找到該程序。

http://www.emntech.com/programs/corestrace.c 

用法:編譯上述程序並在執行時給出核心文件。

 $corestrace core 

如果您還想要打印符號,您可以這樣做:讓我們假設產生核心的程序是'test'。

 $ nm -n test > symbols 
     $ corestrace core symbols 

樣本輸出看起來是這樣的:

 $ ./coretrace core symbols 

     0x80483cd foo+0x9 
     0x8048401 func+0x1f 
     0x8048430 main+0x2d 
+0

這幫了很多,謝謝! – Uhlo

+0

鏈接不再有效,但我在http://emntech.blogspot.com/2012/08/printing-backtracestack-trace-using.html找到了一份副本 – mephi42

+0

爲此添加了一個要點:https://gist.github的.com/root42/c979b037f85dc4b2be1f3735afedeb1d – Arne