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    启动程序的同时,用strace跟踪;

b. strace -p pid    对于已经启动的程序,通过-p参数可以attach上去跟踪之后的执行流程;


android上使用strace有一点特殊,android上所有android application都是通过zygote fork出来的;(这是android的一大特点,即既节约内存,又能加快程序启动时间,这里不展开)


所有android application进程的父亲都是zygote;

strace 显然对不能用来跟踪android application.(因为它们都是fork来的)

我们可以使用strace的特性:a) attach到现有进程,b) 允许跟踪子进程;

做法就是跟踪zygote和它的儿子;

  先得到zygote的pid,再执行 strace -f -p ,然后启动要跟踪调试的程序; 

  其中-f 代表跟踪子进程;而且是之后生成的子进程,之前已经运行起来的android application不会被跟踪到;

可以用一条命令包括前两部:

  strace -f -p `ps | grep zygote | awk '{print $2}'`

就是这么简单,debug的android程序员慢慢享用吧

你可能感兴趣的:(调试,android)