手动抓取进程的Backtrace方法如下:
adb remount
adb shellchmod 0777 data/anr
adb shellkill -3 pid
adb pull/data/anr
ramdisk img 是gzip文件,改后缀解压即可看到其中的文件
smali baksmali 命令转换dex、odex文件
ad shell
gdbserver --attach :5039 PID 执行完GDB处于监听状态
启动客户端 gdbclient :5039 PID
内存:
adb shell cat proc/meminfo
adb shell cat proc/pid/maps
adb shell cat proc/pid/smaps
adb shell procrank
adb shell procmem pid
adb shell dumpsys meminfo pid
arm-linux-androideabi-addr2line -f -C -e symbols address 解析抓回的Native Backtrace, 从而知道当时正在执行的native 代码
Kernel Backtrace抓取:
adb shell cat proc/kmsg > kmsg.txt
adb shell "echo 8 > proc/sys/kernel/printk“ //修改printk loglevel
adb shell "echo t > /proc/sysrq-trigger“ //打印所有的backtrace
adb shell "echo w > /proc/sysrq-trigger“//打印’-D’ status ‘D’ 的 process
Monitor
进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁
拥有者(The Owner):表示某一线程成功竞争到对象锁。
等待区(Wait Set):表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。
同一时刻Monitor 只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在“Wait Set”中等待的线程状态是 “in Object.wait()”。
in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。
waiting for monitor entry:进入区等待,状态为BLOCKED。