假设要调试的apk的包名为:com.github.androider
android
而且启动当前appgit
命令行运行:github
$ adb shell ps | grep "com.github.androider"
shell
执行结果(第二列是进程号):bash
u0_a1423 4877 619 2613496 603872 0 0000000000 S com.github.androider
app
$ adb -d froward tcp:5005 jdwp:4877
tcp
tcp后面这个端口随意设置,只要没有被占用就行ide
$ jdb -attach localhost:5005
spa
jdb 链接到刚才设置的端口命令行
注意win上的连接命令是: jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5005
经过上面的操做,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)
next 跳过一行(跨过调用)
step 执行当前行,若是可进入就进入
step up 执行到当前方法返回到其调用者
stepi 执行当前指令,进入方法
cont 在一个断点、异常或者步骤以后,会停留在下一个断点处
where 获取断点以前的调用栈,
locals 输出当前堆栈帧中的全部本地变量
print 显示Java对象和原生值。 对于原生类型的变量或字段而言,将会打印实际的值;对于对象而言,将打印一个简单的描述。请查看下方的dump命令以获取关于对象的更多信息。
dump 对于原生值而言,该命令等同于print。对于对象而言,它会打印对象中每一个定义的字段的当前值。静态字段和实例字段均包含在内
run [类 [参数]]
开始执行应用程序的主类
真几把难用。。。
参考文章: tinylab.org/use-jdb-to-…