2014年4月7日 星期一

活用binutils中的addr2line和objdump來加速crash debug....

雖然日常工作上 處理crash不是我的本業
但有時無可奈何 還是會收到很多crash dump....(這類型的問題 最近佔據愈來愈多工作時間了QQ)
所以還是把常用的一些工具和參數做個筆記 省得每次遇到都要問谷哥


GCC binutility裡頭有很多工具
除了ar as cpp ld這類型產生object/library的工具
還有一些是為了runtime或者offline分析使用
例如gdb就是runtime時很好用的debugger
無奈在Android的環境裡 gdb實在是不易使用
漸漸地 以前學生時代的功力都沒了
本篇文章主要想筆記兩個offline分析工具
分別是objdump和addr2line


首先看看objdump
Manual的簡短說明一語道破這玩意的功能--display information from object files
基本上所有object檔案裡的資訊可以被反解成人眼較易讀的資訊
個人最愛用的就是-S和-l參數
-S會讓組語跟C/C++原始碼交雜在dump中
-l則是會加上原始碼的行號、檔案資訊 增加可讀性

範例:
objump -S -v vmlinux      這樣就會吐出夭壽長的kernel dump.....


接著就是addr2line
一樣manual一語道破--convert addresses into file names and line numbers.
常用的參數搭配是-C -f -e


-f是要求除了行號和檔名外 也吐出函示名稱

-C是parse C++必用的參數 讓function name可以恢復正常
舉個例子 parse libEGL.so某function時
沒加上-C就會得到_ZN7android6Loader4openEPNS_16egl_connection_tE這種很難看懂得名字
有加上就會拿到android::Loader::open(android::egl_connection_t*)
天差地遠阿~~

-e則是目標的object file 沒加的話 基本上addr2line就會試著抓a.out來parse.....

範例:
addr2line -C -f -e vmlinux XXXX          <-- address="" div="" nbsp="">





P.S.1 注意make時 要開-g的cflags才會把debug symbol放進去
P.S.2 針對android userspace的object file  可以去out/target/product/ARCH/symbols 裡頭去撈!!!!