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程序员慢慢享用吧