background image

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 从而具备了调试功能。在调试器端