使用jdb调试apk

jdb是一个支持java代码级调试的工具,它是由java jdk提供的,存在于xxx\Java\jdk1.6.0_21\bin之下

使用ddms调试时,主机会打开另外一个网络端口,在DDMS里查看,一般是8700。

启动DDMS,这时程序前面应该有个红色小虫,点上面的开始调试按钮。这步不是必须的,这步的工作其实相当于手动敲:

$ adb -d forward tcp:8700 jdwp:$PID

其中$PID为要调程序的进程号。

通过attach方式进行调试步骤:

显示所有可供调试的用户进程:
adb jdwp
使用本地端口号连接到终端的给定进程:
adb forward tcp:xxx jdwp:<pid>
直接使用本机绑定的通讯端口,不指定进程
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=xxx

JDWP 协议介绍

JDWP的全写是:Java Debug Wire Protocol:即JAVA调试器无线协议,它定义了调试器(Debugger)和被调试的JAVA虚拟机(target vm)之间的通信协议。在这里,我更要说明下:Debugger与Target vm,Target vm 中运行着我们希望要调试的程序,它与一般运行的Java虚拟机没有什么区别,只是在启动时加载了Agent JDWP 从而具备了调试功能。而debugger 就是我们熟知的调试器,它向运行中的target vm 发送命令来获取target vm 运行时的状态和控制Java 程序的执行。Debugger 和target vm 分别在各自的进程中运行,他们之间的通信协议就是JDWP。JDWP 与其他许多协议不同,它仅仅定义了数据传输的格式,但并没有指定具体的传输方式。这就意味着一个JDWP 的实现可以不需要做任何修改就正常工作在不同的传输方式上(在JDWP 传输接口中会做详细介绍)。JDWP 是语言无关的。理论上我们可以选用任意语言实现JDWP。然而我们注意到,在JDWP 的两端分别是target vm 和debugger。Target vm 端,JDWP 模块必须以Agent library 的形式在Java 虚拟机启动时加载,并且它必须通过Java 虚拟机提供的JVMTI 接口实现各种debug 的功能,所以必须使用C/C++ 语言编写。而debugger 端就没有这样的限制,可以使用任意语言编写,只要遵守JDWP 规范即可。JDI(Java Debug Interface)就包含了一个Java 的JDWP debugger 端的实现,JDK 中调试工具jdb 也是使用JDI 完成其调试功能的。

使用jdb调试apk

时间: 2024-10-13 11:17:20

使用jdb调试apk的相关文章

百度加固后检测反jdb调试apk的小记录

百度加固后的apk检测反jdb调试apk的简单分析,就一个很简单的记录而已,方便以后查阅. 按照正常IDA调试,在开始用jdb来连接,出错了 毕竟是加壳的东西,所以反编译看一下,竟然找到了一点内容,如下: static { if(!Debug.isDebuggerConnected()) { String v0 = Build.CPU_ABI; if(v0 != null && (v0.startsWith("x86"))) { StubApplication.load

jdb调试scala代码的简单介绍

在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都是一样的,只是需要注意一些细节的地方就可以了.下面就来简单说明一下.在这里关于scala和jdk的配置问题就不再详述了,下面进入正题吧. 首先放上调试用的scala代码hello.scala object hello { def main(args: Array[String]): Unit = {

JDB调试之小试牛刀

用JDK自带工具JDB调试示例程序HelloJDB(d:\jdb\HelloJDB) HelloJDB代码如下: public class HelloJDB { public static void main(String args[]){ int a,b,c; a = 1; b = 2; c = a + b; System.out.println(c); } } 编译HelloJDB:javac -g HelloJDB.java 注意:-g选项表示生成调试信息,否则使用locals命令不能查看

apktool + eclipse 动态调试APK

用了会AndBug,尽管挺强大的可是作为习惯了OD.EDB作为动态调试工具的人,自然有些不习惯,于是乎寻求新的动态调试解决方式.但大多数都是NetBeans + apktool.想着还得多下一个IDE就各种烦躁,还是去寻求Eclipse的组合吧. http://code.google.com/p/android-apktool/wiki/SmaliDebugging 找到apktool的官网,看到有能够实现动态调试. 能够在反编译和回编的时候通过设置參数给目标APK中的manifest文件里增加

使用 JDB 调试 Android 应用程序

By Huang Tao of TinyLab.org 2015/04/13 前言 自从有了各种 IDE 工具,程序猿调试工作轻松了不少,只要在 IDE 上面点击两下按钮,各种程序运行时的信息全部都显示在屏幕上面,很美好的一件事情,我们都要感谢开发这些 IDE 工具的前辈,是他们让我们的工作变得这么"轻松简单",但是对于我个人来说,不是很喜欢这些 IDE 工具: 第一是因为这类 IDE 工具实在是变化太快,我们要花费很大的时间成本来学习这一类工具,然而当你好不容易熟悉了一种工具之后,别

使用 JDB 调试器

您可以使用调试 applet 或应用程序的 jdb 命令来调试 Servlet. 为了调试一个 Servlet,我们可以调试 sun.servlet.http.HttpServer,然后把它看成是 HttpServer 执行 Servlet 来响应浏览器端的 HTTP 请求.这与调试 applet 小程序非常相似.与调试 applet 不同的是,实际被调试的程序是 sun.applet.AppletViewer. 大多数调试器会自动隐藏如何调试 applet 的细节.同样的,对于 servlet

JDB调试代码 20165324 何春江

原文地址:https://www.cnblogs.com/20165324hcj/p/8575961.html

ida 动态调试apk

1,启动 android_x86_server 2 adb forward tcp:23946 tcp:23946 如果出现错误: Bogus or irresponsive remote server 解决方案: 在控制台输入:adb forward tcp:23946 tcp:23946 不是: adb forward tcp:23946 tcp:5555 原文地址:https://www.cnblogs.com/dzqdzq/p/11229094.html

解决JAVA单步调试键盘输入被JDB占用的问题

解决JAVA单步调试键盘输入被JDB占用的问题 问题来源: 在完成本周任务时,编写的代码中含有Scanner类,编译及运行过程均正确,但使用JDB单步调试时,运行到输入行无法在JDB内部输入变量值. 解决方案 错误原因:JDB占用了控制台,导致无法在调试窗口进行输入输出操作. 解决步骤: 1.打开两个终端,一个用来远程监听,一个用来JDB单步调试. 2.在终端1输入以下命令进行监听远程控制: java -Xdebug -Xrunjdwp:transport=dt_socket,address=8