strace 是linux下的調試利器;debug居家必備
strace可以跟蹤所有的系統調用,列印系統調用的參數和傳回值; strace還可以指定跟蹤子線程/子程序,這是調試多線程程式必須的;
andriod 使用了linux作業系統,strace當然是好用的;
strace本身不依賴于系統,從一個機器拷貝到另一個機器直接能用;可以看到,strace 隻依賴三個最基本的庫:
> readelf -a strace | grep NEEDED
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x00000001 (NEEDED) Shared library: [libm.so]
strace一般在/system/xbin/或者/system/bin/下;如果沒有呢,可以自己編譯一個,或者從其它android手機拷貝一份
linux上,strace一般有兩種用法:
a. strace <elf_file> 啟動程式的同時,用strace跟蹤;
b. strace -p pid 對于已經啟動的程式,通過-p參數可以attach上去跟蹤之後的執行流程;
android上使用strace有一點特殊,android上所有android application都是通過zygote fork出來的;(這是android的一大特點,即既節約記憶體,又能加快程式啟動時間,這裡不展開)
所有android application程序的父親都是zygote;
strace <elf_file> 顯然對不能用來跟蹤android application.(因為它們都是fork來的)
我們可以使用strace的特性:a) attach到現有程序,b) 允許跟蹤子程序;
做法就是跟蹤zygote和它的兒子;
先得到zygote的pid,再執行 strace -f -p <pid_of_zygote>,然後啟動要跟蹤調試的程式;
其中-f 代表跟蹤子程序;而且是之後生成的子程序,之前已經運作起來的android application不會被跟蹤到;
可以用一條指令包括前兩部:
strace -f -p `ps | grep zygote | awk '{print $2}'`
就是這麼簡單,debug的android程式員慢慢享用吧