addr2line工具是一個可以將指令的地址和可執行影像轉換為檔名,函式名和原始碼行數的工具。這在核心執行過程中出現崩潰時,可用於快速定位出出錯的位置,進而找出程式碼的bug。
用法
addr2line [-a| --addresses ] [-b bfdname | --target=bfdname] [-C | --demangle[=style]] [-e filename | --exe=filename] [-f | --function] [-s | --basename] [-i | --inlines] [-p | --pretty-print] [-j | --section=name] [-H | --help] [-V | --version] [addr addr ...]
引數解釋
- -a / --addresses:在函式名、檔案和行號資訊之前,顯示地址,以十六進位制形式。
- -b bfdname / --target=bfdname : 指定目標檔案的格式為bfdname。
- -c / --demangle:將低級別的符號名解碼為使用者級別的名字。
- -e filename / --exe=filename:指定需要轉換地址的可執行檔名。
- -f / --function :在顯示檔名、行號輸出資訊的同時顯示函式名資訊。
- -s / --basenames :僅僅顯示每個檔名的基址。
- -i / --inlines : 如果需要轉換的地址是一個行內函數,則輸出的資訊包括其最近範圍內的一個非行內函數的資訊。
- -j / --section :給出的地址代表指定section的偏移,而非絕對地址。
- -p / --pretty-print :使得該函式的輸出資訊更加人性化:每一個地址的資訊佔一行。
說明
- addr2line 有兩種操作模式:1)十六進位制地址在命令列中指定;2)十六進位制地址通過標準輸入指定(還沒用過)
- 在android中addr2line工具,一般是arm-linux-androideabi-addr2line(針對arm平臺)。
例子
- 以下是編寫的一個小例子,用來展示如何使用addr2line。
原始碼
#include<stdio.h>
int add(int a, int b)
{
return a+b;
}
void main()
{
int sum[10] = {0};
int i;
int array1[10] = {48, 56, 77, 33, 33, 11, 226, 544, 78, 90};
int array2[10] = {85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4};
for (i=0; i<10;i++) {
sum[i] = add(array1[i], array2[i]);
}
}
編譯命令
gcc -Wl,-Map=gdb_example.map -g -o gdb_example gdb_example.c
查詢main函式的地址
grep main ./ gdb_example.map
定位
addr2line 0x0000000000400501 -e gdb_example