NetBeans的JPDA调试功能

要使用一个JPDA调试功能:

D:\JEBProject\release>java -jar   -Xrunjdwp:transport=dt_socket,server=y,address

=8700  jebv7.jar

Listening for transport dt_socket at address: 8700

JEB v1.5.201403100 (full) is starting...

首先用-Xrunjdwp:transport=dt_socket 来开启jdwp的调试器。。

首先开启了要调试的服务器。

然后开启NetBeans:

然后新建断点:

 

通过“添加源根目录”, 来绑定“源代码”, 从而可以看到:

绑定之后可以看到源代码。

----------------------------------

只要有源代码绑定,那意味着,就可以看到其代码效果。 那么对于smali来说,只要指定了其apk decode的src,那么也就可以看到了。

每次会打开一个对应的java的src。

关联调试接口:

netbeans-jpda-AttachingDICookie的会话提供者为:org.netbeans.modules.debugger.jpda.AttachingSessionProvider

 

 

启动调试接口:

netbeans-jpda-LaunchingDICookie的会话提供者为:

org.netbeans.modules.debugger.jpda.LaunchingSessionProvider

 

 

监听调试接口:

netbeans-jpda-ListeningDICookie的提供商为:

org.netbeans.modules.debugger.jpda.ListeningSessionProvider

 

 

CallStackView调用堆栈视图为

org.netbeans.modules.debugger.jpda.models.CallStackTreeModel

 

 

ClassesView类视图为

org.netbeans.modules.debugger.jpda.models.ClassesTreeModel

 

 

DebuggingView调试视图

org.netbeans.modules.debugger.jpda.models.JPDAAsynchronousModel异步模型

org.netbeans.modules.debugger.jpda.models.DebuggingActionsProviderFilter 调试动作

 

Java视图

org.netbeans.modules.debugger.jpda.breakpoints.BreakpointsEngineListener 断点引擎监听

 

 

LocalsView本地视图

org.netbeans.modules.debugger.jpda.models.LabelVarsFilter

org.netbeans.modules.debugger.jpda.models.LocalsTreeModel

 

ResultsView结果视图

org.netbeans.modules.debugger.jpda.models.EvaluatorTreeModel

 

ThreadsView线程视图

org.netbeans.modules.debugger.jpda.models.ThreadsTreeModel

 

ToolTipView

org.netbeans.modules.debugger.jpda.models.LocalsTreeModel

 

WatchesView观察视图

org.netbeans.modules.debugger.jpda.models.WatchesModel

 

org.netbeans.api.debugger.jpda.JPDADebugger的实现类是org.netbeans.modules.debugger.jpda.JPDADebuggerImpl

 

智能调试

org.netbeans.modules.debugger.jpda.actions.SmartSteppingFilterImpl

 

组合智能调试

org.netbeans.modules.debugger.jpda.actions.CompoundSmartSteppingListener

 

源代码路径

org.netbeans.modules.debugger.jpda.SourcePath

 

 

org.netbeans.spi.debugger.ActionsProvider 操作提供商

org.netbeans.modules.debugger.jpda.actions.StepActionProvider

org.netbeans.modules.debugger.jpda.actions.StepIntoActionProvider

org.netbeans.modules.debugger.jpda.actions.StepIntoNextMethodActionProvider

org.netbeans.modules.debugger.jpda.actions.StepOperationActionProvider

org.netbeans.modules.debugger.jpda.actions.RunIntoMethodActionProvider

org.netbeans.modules.debugger.jpda.actions.StartActionProvider

org.netbeans.modules.debugger.jpda.actions.KillActionProvider

org.netbeans.modules.debugger.jpda.actions.PauseActionProvider

org.netbeans.modules.debugger.jpda.actions.ContinueActionProvider

org.netbeans.modules.debugger.jpda.actions.PopToHereActionProvider

 

 

org.netbeans.spi.debugger.DebuggerEngineProvider 调试引擎提供商

org.netbeans.modules.debugger.jpda.JavaEngineProvider 是java引擎提供商

 

org.netbeans.spi.viewmodel.AsynchronousModelFilter异步模型过滤org.netbeans.modules.debugger.jpda.models.JPDAAsynchronousModel

 

org.netbeans.api.debugger.LazyDebuggerManagerListener调试管理监听org.netbeans.modules.debugger.jpda.breakpoints.PersistenceManager

 

断点的读取

org.netbeans.modules.debugger.jpda.breakpoints.BreakpointsReader

 

JPDA(Java Platform Debugger Architecture,Java平台调试架构) ,由Java虚拟机后端和调试平台前端组成, JPDA为Java平台上的调试器定义了一个标准的体系结构。该体系结构包括3个主要组成部分:JVM TI(Java虚拟机工具接口)、JDI(Java调试连线协议)和JDWP(Java调试接口)。

JVM TI(JavaVirtualMachineToolInterface),它定义了JVM为了支持调试而必须提供的功能及相应的访问接口。包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中。

这些访问接口是以本地语言的形式提供的,由JVM负责实现。这里有个理解上得难度,JVM负责实现是怎么回事?我的理解是JVM TI只是JVM提供的一系列函数,JVM TI就是在桌子上的苹果菠萝,他告诉我们你可以吃苹果菠萝,可是你进不去房间,只能依靠一个服务人员来取,那么你要吃什么,怎么吃呢?他不管。那谁来管?谁来调用他谁就来管呗?JVM TI的直接客户端并不是调试器,而是 “JPDA back-end”,属于JVM的一部分,在SUN JRE的bin目录下可以找到jdwp.dll(jdwp.so)的库文件。这就是JPDA back-end的实现。也就是说JPDA back-end提供了各种访问方式,吃的方式(共享内存,Socket),通过这些方式接收调试器的请求,然后调用JVM TI接口,他来决定你怎么吃。

JDI(Java Debug Interface),在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程调试服务进行交互,它定义了访问JVM TI接口的高层API,以纯Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务。调试器直接使用JDI来实现调试的功能。与JPDA back-end相对应,JDI实现的角色就是JPDA front-end。如同上面的例子,JDI就是桌子和那个服务员,提供了访问的平台,通道。

JDWP(Java Debug Wire Protocol),它定义了JPDA front-end和JPDA back-end之间通讯信息的二进制格式。这里的通讯信息主要包括两种:调试器发送给JVM的请求信息和JVM发送给调试器的调试信息。调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制。就是你要吃什么?请求是什么、你得告诉服务员你要什么,不过这个服务员是个老毛子,你得跟翻译说你的请求,翻译帮你规范你的语言,命令他才明白。

 

 

      1.虚拟机参数设置

         1.1启用调试服务

           -Xdebug 启用调试

           -Xrunjdwp:<sub-options> 加载JVM的JPDA参考实现库

         1.2 Xrunjdwp子参数(sub-options)配置

           Xrunjdwp子参数的配置格式如下

           Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...

         1.3 transport=dt_socket

           JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。

         1.4 address=8000

           JVM在8000端口上监听请求。

         1.5 server=y

           y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。

         1.6 suspend=y

           y表示启动的JVM会暂停等待,直到调试器连接上。

           suspend=y这个选项很重要。如果你想从Tomcat启动的一开始就进行调试,那么就必须设置suspend=y。

 

      2. 配置:


-Xrunjdwp:transport=dt_socket,server=y,address=8000

    在8000端口监听Socket连接,挂起VM并且不加载运行主函数直到调试请求到达

 


-Xrunjdwp:transport=dt_shmem,server=y,suspend=n

    选择一个可用的共享内存(因为没有指address)并监听该内存连接,同时加载运行主函数

 


-Xrunjdwp:transport=dt_socket,address=myhost:8000

    连接到myhost:8000提供的调试服务(server=n,以调试客户端存在),挂起VM并且不加载运行主函数

 


-Xrunjdwp:transport=dt_shmem,address=mysharedmemory

    通过共享内存的方式连接到调试服务,挂起VM并且不加载运行主函数

 


-Xrunjdwp:transport=dt_socket,server=y,address=8000,
onthrow=java.io.IOException,launch=/usr/local/bin/debugstub

    等待java.io.IOException被抛出,然后挂起VM并监听8000端口连接,在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行

 


-Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe

    等待一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试请求后以命令d:\bin\debugstub.exe dt_shmem <address>执行,<address>是可用的共享内存

 

http://bits.netbeans.org/dev/javadoc/org-netbeans-api-debugger/architecture-summary.html

 

Debugger Core API能够允许在一个IDE上安装不同的调试器。

 

Debugger Core UI需要:

  1. 列出所有的断点类型和所有的断点类别
  2. 可视化所有的断点
  3. 添加/删除断点
  4. 添加/删除watches观察。
  5. 在NetBeans的Explorer View的节点中表示断点,threads,线程组,观察列表,会话,调用栈的帧,本地变量和字段。
  6. 监听的改变:线程,线程组,本地变量,观察,调用栈的帧和字段。
  7. 设置当前上下文定义。当前上下文定义当前会话,语言,线程和调用栈行号。

 

依赖的模块:

CommonAnnotationsAPI

ProjectAPI

FileSystemsAPI

ModulesAPI

UtilitiesAPI

LookupAPI

 

需要JDK的dt.jar

 

 

通过搜索META-INF/debugger来搜索各种服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值