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: 或//stop in . [(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 [类 [参数]]
开始执行应用程序的主类
真几把难用。。。
参考文章: