android strace调试

编译strace

加入编译选项到device.mk:


PRODUCT_PACKAGES += strace

触发编译:


mmma -j6 external/strace

跟踪进程



adb shell strace -f -p PID

-p代表跟踪进程号为PID的进程,-f代表跟踪该进程以及之后fork生成的所有进程。

如果想要把strace的log输出到指定的文件可以使用:


adb shell strace -f -p PID -o file 

-o file选项将会把strace log输出到file中,而不是stderr中。

追踪Android应用的方法

首先需要放开selinux权限,当selinux权限不满足要求时无法进行strace:


adb shell setenforce 0

Android apps其实都是由zygote进程fork来的,所以我们如果要strace一个app,可以通过-f -p指定到zygote对应的进程,就可以跟踪到对应的所有子进程。


example:

sdm660:/ # ps -A | grep zygote                                                 

root           959     1 4247260  74288 poll_schedule_timeout 0 S zygote64

root           960     1 1577152  65916 poll_schedule_timeout 0 S zygote

webview_zygote 1817    1 1338924  32124 poll_schedule_timeout 0 S webview_zygote32

sdm660:/ # strace -f -p 959 -tt -T -s 500 -o /sdcard/strace.txt

strace: Process 959 attached with 5 threads

重新封装service

如果想要从service启动时就开始进行strace,可以通过在init.rc中重新定义service来做。

比如:


-service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
+service zygote /system/xbin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

类似上面的方式,zygote的进程名已经修改为了strace,那么还要保证strace具有相应的selinux的权限,在这里不再进一步展开说明。

或者我们把selinux设置为permissive,在cmdline中添加参数androidboot.selinux=permissive。配置方法如下:

BoardConfig.mk:


BOARD_KERNEL_CMDLINE:=(省略......)androidboot.selinux=permissive

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