Sun已经提供java platform debugger architecture (jpda),其中有示例程序演示如何跟踪应用程序,在此基础上进行更改后可以跟踪Android ap,点此下载。
Java Platform Debugger Architecture(JPDA:Java平台调试架构) 由Java虚拟机后端和调试平台前端组成
1.Java虚拟机提供了Java调试的功能
2.调试平台通过调试交互协议向Java虚拟机请求服务以对在虚拟机中运行的程序进行调试
JPDA的构架
JPDA通过两个接口和协议来完成如上的说明,分别是JVMTI(Java虚拟机工具接口)、JDWP(Java调试连线协议)和JDI(Java调试接口)。
1.JVMTI定义了虚拟机应该提供的调试服务,包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中
2.JDWP定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制 3.JDI在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务。
下载后使用方法如下:
1、去掉后缀.jpg后改文件名为.zip,解开到路径/home/user/java15_demo_jpda
2、cd java15_demo_jpda
3、根据jdk安装路径更改env.sh内容
4、找到要跟踪应用的pid
例如:
user@test:adb shell ps | grep gallery
app_3 10480 1469 140668 27840 ffffffff afd0c57c S com.android.gallery
可知pid=10480.
5、adb forward tcp:9000 jdwp:pid_no 这里pid_no=10480
6、java com.sun.tools.example.trace.Trace -output trace_flow_dir
Note: trace_flow_dir is the directory name to place output
env.sh内容
export CLASSPATH=.:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/lib/tools.jar:/home/user/java15_demo_jpda
运行结束后,目录/home/user/trace_flow_dir中按各线程分别建立文件夹来存放调用栈消息如下
user@test:ls trace_flow_dir
_10__Binder_Thread__3 _11__Thread-14 _1__main _7__Binder_Thread__1
_11__GLThread _12__image-loader-0 _2__HeapWorker _8__Binder_Thread__2
_11__Thread-14
====== <11> Thread-14 ======
run -- com.android.internal.policy.impl.PhoneWindow$1
getContentResolver -- android.content.ContextWrapper
getContentResolver -- android.app.ContextImpl
getInt -- com.motorola.android.provider.MotorolaSettings
getString -- com.motorola.android.provider.MotorolaSettings
getString -- com.motorola.android.provider.MotorolaSettings$NameValueCache
getLong -- android.os.SystemProperties
native_get_long -- android.os.SystemProperties
query -- android.content.ContentResolver
acquireProvider -- android.content.ContentResolver
getScheme -- android.net.Uri$StringUri
access$300 -- android.net.Uri
getAuthority -- android.net.Uri$StringUri
getAuthorityPart -- android.net.Uri$StringUri
getDecoded -- android.net.Uri$AbstractPart
access$300 -- android.net.Uri
getAuthority -- android.net.Uri$StringUri
getAuthorityPart -- android.net.Uri$StringUri
getDecoded -- android.net.Uri$AbstractPart
access$300 -- android.net.Uri
acquireProvider -- android.app.ContextImpl$ApplicationContentResolver
acquireProvider -- android.app.ActivityThread
getProvider -- android.app.ActivityThread
getExistingProvider -- android.app.ActivityThread
asBinder -- android.content.ContentProviderProxy