天天看點

android 調試利器之 strace

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 調試利器之 strace

所有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程式員慢慢享用吧