工具集binutils
阿新 • • 發佈:2018-12-01
該文章主要參考大牛李雲的部落格http://blog.51cto.com/yunli/186727,自己寫一寫更有助於加深記憶
1、addr2line,用程式地址得到對應的函式和行號。
這個一般用在錯誤分析的時候,根據backtrace顯示的程式碼地址,得到出錯的行號和函式。
一個簡單的例項:
#include <stdio.h>
void go()
{
printf("the go func addr is 0x%x\n",go);
}
int main()
{
go();
return 0;
}
執行的結果為
通過命令:addr2line 0x40052d -f -e main
尷尬,我的行號顯示亂碼,不知道為何,歡迎大神解答
2 nm
nm是names的縮寫,用於列出程式檔案中的符號
命令格式:nm [option(s)] [file(s)]
常用option
- -A 在每個符號資訊的前面列印所在物件檔名稱;
- -C 輸出demangle過了的符號名稱;
- -D 列印動態符號;
- -l 使用物件檔案中的除錯資訊打印出所在原始檔及行號;
- -n 按照地址/符號值來排序;
- -u 打印出那些未定義的符號;
我們來看一下上面main檔案使用nm指令後的結果
第一列是地址,第二列是符號存放的位置,第三列是符號的名稱
我們看go函式的地址與我們打印出來的地址是一致的。第二列的具體含義如下
3 objdump
objdump可以用來檢視目標程式中的段資訊和除錯資訊,也可以用來對目標程式進行反彙編。
常用的幾個命令
objdump -h 檢視程式的段資訊
段的名稱,段大小,VMA地址,LMA地址,File off,對齊方式。
VMA是這個段的執行地址,LMA是這個段LOAD地址,這兩個地址一般是一致的,但也有可能是不一致,這與連結指令碼的設定有關係。
objdump -f 顯示目標檔案的頭資訊
objdump -S
輸出C原始碼和反彙編出來的指令對照的格式,這個在程式碼除錯的時候是很有用的,可以根據backtrace的資訊尋找程式碼crash的地點