2011-12-17 100 views
23

我有一個精簡應用程序,它看起來像這樣產生的堆棧跟蹤:使用gdb進行地址轉換爲線

*** Check failure stack trace: *** 
    @  0x7f0e442d392d (unknown) 
    @  0x7f0e442d7b1f (unknown) 
    @  0x7f0e442d7067 (unknown) 
    @  0x7f0e442d801d (unknown) 
    @  0x7f0e457c55e6 (unknown) 
    @  0x7f0e457c5696 (unknown) 
    @   0x4e8765 (unknown) 
    @   0x4a8b43 (unknown) 
    @  0x7f0e43197ced (unknown) 
    @   0x4a6889 (unknown) 

和我有可執行的和未剝離的版本,所有的庫(編譯與調試信息)。但是,如何將地址轉換爲文件和行號?

這是我曾嘗試:

gdb 
set solib-absolute-prefix /path/to/non-stripped/edition/of/root/filesystem/sysroot/ 
file /path/to/non-stripped/edition/of/root/filesystem/sysroot/usr/bin/my-buggy-app 
info line *0x7f0e457c5696 

當我在文件中鍵入命令只是將其從文件,而不是其使用的所有庫加載符號。有沒有辦法做到這一點?

「信息線」命令說:

用於地址沒有行號信息0x7f0e442d801d

這我假設是因爲該地址在共享庫中的一個,但怎麼也我知道他們中的哪一個?

+3

['addr2line'](http://linuxcommand.org/man_pages/addr2line1.html)? – 2011-12-17 16:10:27

+0

@ another.anon.coward Year,我試過,但我不知道如何查找哪個文件,因爲地址指向共享庫。 – Allan 2011-12-17 17:24:07

+0

@Allan:您可以使用'info sharedlibrary'命令來知道哪個共享庫的地址爲0x7f0e442d801d。 – ks1322 2011-12-17 19:00:57

回答

25

但我怎麼能翻譯地址轉換成文件和行號?

對於主要的可執行文件(如0x4e8765地址)做到這一點:

addr2line -e /path/to/non-stripped/.../my-buggy-app \ 
    0x4a6889 0x4a8b43 0x4e8765 

其實,你可能希望從所有上述地址減去5(該CALL指令的通常長度)。

共享庫中的地址,你必須知道庫的加載地址。

如果你的應用產生了core文件,然後將(gdb) info shared告訴你哪裏庫被加載。

如果你沒有得到一個核心文件,應用程序沒有打印所需的映射,然後

  • 你應該修復應用程序,以便它不打印信息(堆棧跟蹤是沒有它大多無用),以及
  • 你仍然可以猜測:看在0x4e8760在可執行的代碼 - 它應該是一個CALL指令的一些功能。現在找出該函數所在的庫,並在庫中找到它的地址(通過nm)。如果幸運的話,該地址接近0xNc56NN。您現在可以猜到任何庫的加載地址是0x7f0e457NNNNNN。重複0x7f0e457c55e1,你可以在0x7f0e442dNNNN找出庫的加載地址。
17

%的OP,在GDB的命令從地址找到的代碼的源代碼行是:

info line *0x10045740 

編輯:替換「信息符號0x10045740」,不會在某些工作條件(謝謝@ Thomasa88)。

+3

這隻在/ home/thomas/.kde4/lib64/kde4/kmm_lft.so'節的.text節中顯示符號+ offset('LftPlugin :: import_clicked()const + 1522),而'info line * 0xabc'顯示(「plugin/lft_plugin.cpp」的第97行開始於地址0x7fffe49eb39c 並結束於0x7fffe49eb3ad .')。在我的情況下,我的共享庫沒有被剝離,但是當符號被剝離時,「add-symbol-file filename address」可能會有幫助。 http://www.delorie.com/gnu/docs/gdb/gdb_125.html – thomasa88 2015-01-02 18:47:37

+3

謝謝thomasa88! 'gdb中的信息行* 0x10045740'(記得星號)完成這項工作。 – 2015-01-21 11:18:52