1. 程式人生 > >工具集binutils

工具集binutils

該文章主要參考大牛李雲的部落格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的地點