Mac 上使用jdb 调试Android

1,876 阅读1分钟

0. 假设

假设要调试的apk的包名为:com.github.androider

并且启动当前app

1. 得到目标app的进程号

命令行运行:

$ adb shell ps | grep "com.github.androider"

执行结果(第二列是进程号):

u0_a1423 4877 619 2613496 603872 0 0000000000 S com.github.androider

2. 设置端口转发

$ adb -d froward tcp:5005 jdwp:4877

tcp后面这个端口随意设置,只要没有被占用就行

3. jdb 连接

$ jdb -attach localhost:5005

jdb 连接到刚才设置的端口

注意win上的链接命令是: jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5005

4. 设置断点

通过上面的操作,jdb调试器已经能和手机上的进程通信了。现在开始设置断点调试。

用法: stop at :<line_number> 或 stop in .<method_name>[(argument_type,...)]

//用法: 
stop at <class>:<line_number> 或
//
stop in <class>.<method_name>[(argument_type,...)]

例如: stop in com.github.androider.MainActivity.onCreate

或者带参数: stop in com.github.androider.MainActivity.onCreate(android.os.Bundle)

删除断点clear com.github.androider.MainActivity.onCreate(android.os.Bundle)

5. 调试

  • next 跳过一行(跨过调用)

  • step 执行当前行,如果可进入就进入

  • step up 执行到当前方法返回到其调用者

  • stepi 执行当前指令,进入方法

  • cont 在一个断点、异常或者步骤之后,会停留在下一个断点处

  • where 获取断点之前的调用栈,

  • locals 输出当前堆栈帧中的所有本地变量

  • print 显示Java对象和原生值。 对于原生类型的变量或字段而言,将会打印实际的值;对于对象而言,将打印一个简单的描述。请查看下方的dump命令以获取关于对象的更多信息。

  • dump 对于原生值而言,该命令等同于print。对于对象而言,它会打印对象中每个定义的字段的当前值。静态字段和实例字段均包含在内

  • run [类 [参数]] 开始执行应用程序的主类

真几把难用。。。

参考文章: tinylab.org/use-jdb-to-…