Addr2line 工具(它是标準的 GNU Binutils 中的一部分)是一個可以将指令的位址和可執行映像轉換成檔案名、函數名和源代碼行數的工具。這種功能對于将跟蹤位址轉換成更有意義的内容來說簡直是太棒了。
要了解這個過程是怎樣工作的,我們可以試驗一個簡單的互動式的例子。這個示例 C 檔案(main.c)是通過 cat 一個簡單的應用程式實作的(也就是說,将标準輸出的文本重定向到一個檔案中)。然後使用 gcc 來編譯這個檔案,它會傳遞一些特殊的選項。首先,要(使用 -Wl 選項)通知連結器生成一個映像檔案,并(使用 -g 選項)通知編譯器生成調試符号。最終生成可執行檔案 test。得到新的可執行應用程式之後,您就可以使用grep 工具在映像檔案中查找 main 來尋找它的位址了。使用這個位址和 Addr2line 工具,就可以判斷出函數名(main)、源檔案(/work/main.c)以及它在源檔案中的行号(4)。
在調用 Addr2line 工具時,要使用 -e 選項來指定可執行映像是 test。通過使用 -f 選項,可以告訴工具輸出函數名。
[[email protected] work]# cat main.c
#include <stdio.h>
int main(void)
{
char *str = "hello";
str[0] = 'h';
return 0;
}
[[email protected] work]# gcc -Wl,-Map=main.map -g -o main main.c(編譯生成可執行檔案及main.map)
[[email protected] work]# ls
1.txt main main.c main.map
[[email protected] work]# grep main main.map
0x00000000080482c4 [email protected]@GLIBC_2.0
0x0000000008048394 main
OUTPUT(main elf32-i386)
[[email protected] work]# addr2line 0x0000000008048394 -e main -f
main
/work/main.c:4