15
sp.logSnapshot(sp.snapshot()); ……
16
sp.shutDown();
它会启一个线程监测,在
logcat 中打印信息
5. 用发系统信号的方式取当前堆栈情况和内存信息
1) 原理
dalvik 虚拟机对 SIGQUIT 和 SIGUSR1 信号进行处理(dalvik/vm/SignalCatcher.c),分别完成
取当前堆栈和取当前内存情况的功能
2) 用法
a) $ chmod 777 /data/anr -R # 把 anr 目录权限设为可写
$ rm /data/anr/traces.txt # 删除之前的 trace 信息
$ ps # 找到进程号
$ kill -3 进程号 # 发送 SIGQUIT 信号给该进程,此时生成 trace 信息
$ cat /data/anr/traces.txt
功能实现:遍历
thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),并打印当前函数调
用关系
(dalvik/vm/interp/Stack.c:dumpFrames())
b) $ chmod 777 /data/misc -R
$ ps # 找到进程号
$ kill -10 进程号 # 发送 SIGQUIT 信事信号给该进程,此时生成 hprof 信息
$ ls /data/misc/*.hprof
此时生成
hprf 文件,如何使用此文件,见第二部分(HProf)
注意:
hprof 文件都很大,注意用完马上删除,以免占满存储器
6. logcat 及原理
1) android.util.Log 利用 println 的标准 java 输出词句,并加前缀 I/V/D….
2) dalvik 利用管道加线程的方式,先利用 dup2 把 stdout 和 stderr 重定向到管理中
(vm/StdioConverter.c:dvmstdioConverterStartup),然后再启动一个线程从管道另一端读出内
容
(dalvik/vm/StdioConverter.c:stdioconverterThreadStart()) , 使 用 LOG 公 共 工 具
(
system/core/liblog/logd_write.c: __android_log_print())输出到/dev/log/*中去
3) logcat 通过加不同参数看/dev/log/下的不同输入信息
17
# logcat -b main 显示主缓冲区中的信息 # logcat -b radio 显示无线缓冲区中的信息
18
# logcat -b events 显示事件缓冲区中的信息
7. jdwp(java debug wire protocol)及原理
1) 虚拟机(设备端)在启动时加载了 Agent JDWP 从而具备了调试功能。在调试器端