Android Java应用程序调用跟踪

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



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cloudwu007/article/details/6869312
个人分类: android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭