要使用一个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需要:
- 列出所有的断点类型和所有的断点类别
- 可视化所有的断点
- 添加/删除断点
- 添加/删除watches观察。
- 在NetBeans的Explorer View的节点中表示断点,threads,线程组,观察列表,会话,调用栈的帧,本地变量和字段。
- 监听的改变:线程,线程组,本地变量,观察,调用栈的帧和字段。
- 设置当前上下文定义。当前上下文定义当前会话,语言,线程和调用栈行号。
依赖的模块:
CommonAnnotationsAPI
ProjectAPI
FileSystemsAPI
ModulesAPI
UtilitiesAPI
LookupAPI
需要JDK的dt.jar
通过搜索META-INF/debugger来搜索各种服务。