博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工欲善其事,必先利其器之—命令行下使用jdb调试android应用(MAC环境)
阅读量:4029 次
发布时间:2019-05-24

本文共 4634 字,大约阅读时间需要 15 分钟。

前提说明

  • 先关闭Eclipse,Android Studio这类的IDE,否则jdb attach到应用时出现如下异常,jdb连接中断
java.io.IOException: handshake failed - connection prematurally closed    at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:136)    at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)    at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)    at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)    at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)    at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)    at com.sun.tools.example.debug.tty.Env.init(Env.java:63)    at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1082)
  • 这种很原始调试手段,我一般是想看android系统库的真实代码运行情况(IDE上debug时Android系统类库的代码行数与运行时是不一致的)

调试三步曲

获取应用的进程Id

adb shell ps | grep 应用包名

重定向步端口

adb forward tcp:7701 jdwp:进程Id//7701可以换行本地未被占用的port,可以使用 netstat -nlt ,查看本地端口的使用情况

运行jdb

jdb  -attach 127.0.0.1:7701

成功attach后,help一下,可以看到断点如何下等命令,注意class id 包括类的包名的!

luogw@luogw-MacBook-Pro temp$ jdb  -attach 127.0.0.1:7703设置未捕获的java.lang.Throwable设置延迟的未捕获的java.lang.Throwable正在初始化jdb...> help** 命令列表 **connectors                -- 列出此 VM 中可用的连接器和传输run [class [args]]        -- 开始执行应用程序的主类threads [threadgroup]     -- 列出线程thread 
-- 设置默认线程suspend [thread id(s)] -- 挂起线程 (默认值: all)resume [thread id(s)] -- 恢复线程 (默认值: all)where [
| all] -- 转储线程的堆栈wherei [
| all]-- 转储线程的堆栈, 以及 pc 信息up [n frames] -- 上移线程的堆栈down [n frames] -- 下移线程的堆栈kill
-- 终止具有给定的异常错误对象的线程interrupt
-- 中断线程print
-- 输出表达式的值dump
-- 输出所有对象信息eval
-- 对表达式求值 (与 print 相同)set
=
-- 向字段/变量/数组元素分配新值locals -- 输出当前堆栈帧中的所有本地变量classes -- 列出当前已知的类class
-- 显示已命名类的详细资料methods
-- 列出类的方法fields
-- 列出类的字段threadgroups -- 列出线程组threadgroup
-- 设置当前线程组stop in
.
[(argument_type,...)] -- 在方法中设置断点stop at
:
-- 在行中设置断点clear
.
[(argument_type,...)] -- 清除方法中的断点clear
:
-- 清除行中的断点clear -- 列出断点catch [uncaught|caught|all]
|
-- 出现指定的异常错误时中断ignore [uncaught|caught|all]
|
-- 对于指定的异常错误, 取消 'catch'watch [access|all]
.
-- 监视对字段的访问/修改unwatch [access|all]
.
-- 停止监视对字段的访问/修改trace [go] methods [thread] -- 跟踪方法进入和退出。 -- 除非指定 'go', 否则挂起所有线程trace [go] method exit | exits [thread] -- 跟踪当前方法的退出, 或者所有方法的退出 -- 除非指定 'go', 否则挂起所有线程untrace [methods] -- 停止跟踪方法进入和/或退出step -- 执行当前行step up -- 一直执行, 直到当前方法返回到其调用方stepi -- 执行当前指令下一步 -- 步进一行 (步过调用)cont -- 从断点处继续执行list [line number|method] -- 输出源代码use (或 sourcepath) [source file path] -- 显示或更改源路径exclude [
, ... | "none"] -- 对于指定的类, 不报告步骤或方法事件classpath -- 从目标 VM 输出类路径信息monitor
-- 每次程序停止时执行命令monitor -- 列出监视器unmonitor
-- 删除监视器read
-- 读取并执行命令文件lock
-- 输出对象的锁信息threadlocks [thread id] -- 输出线程的锁信息pop -- 通过当前帧出栈, 且包含当前帧reenter -- 与 pop 相同, 但重新进入当前帧redefine
-- 重新定义类的代码disablegc
-- 禁止对象的垃圾收集enablegc
-- 允许对象的垃圾收集!! -- 重复执行最后一个命令
-- 将命令重复执行 n 次#
-- 放弃 (无操作)help (或 ?) -- 列出命令version -- 输出版本信息exit (或 quit) -- 退出调试器
: 带有程序包限定符的完整类名
: 带有前导或尾随通配符 ('*') 的类名
: 'threads' 命令中报告的线程编号
: Java(TM) 编程语言表达式。支持大多数常见语法。可以将启动命令置于 "jdb.ini" 或 ".jdbrc" 中位于 user.home 或 user.dir 中

进阶1:导入系统类库

jdb的sourcepatch选项

启动jdb时设置源文件的目录,即通过-sourcepatch参数设置

jdb的选项如下

uogw@luogw-MacBook-Pro ~$ jdb --help选项无效: --help用法: jdb 
其中, 选项包括: -help 输出此消息并退出 -sourcepath
<由 ":" 分隔的目录>
要在其中查找源文件的目录 -attach
使用标准连接器附加到指定地址处正在运行的 VM -listen
等待正在运行的 VM 使用标准连接器在指定地址处连接 -listenany 等待正在运行的 VM 使用标准连接器在任何可用地址处连接 -launch 立即启动 VM 而不是等待 'run' 命令 -listconnectors 列出此 VM 中的可用连接器 -connect
:
=
,... 使用所列参数值通过指定的连接器连接到目标 VM -dbgtrace [flags] 输出信息供调试jdb -tclient 在 HotSpot(TM) 客户机编译器中运行应用程序 -tserver 在 HotSpot(TM) 服务器编译器中运行应用程序转发到被调试进程的选项: -v -verbose[:class|gc|jni] 启用详细模式 -D
=
设置系统属性 -classpath
<由 ":" 分隔的目录>
列出要在其中查找类的目录 -X

导出手机上的系统类库(java类库)

手机系统类库的位置在 /system/framework

现在很多手机包括原生rom framework.jar里边是没有类文件了,已经转成odex,并存放在dalvik-cache目录了
使用adb pull命令,如下示例

luogw@luogw-MacBook-Pro Downloads$ adb pull /system/framework/framework.jaar/system/framework/: 88 files pulled. 5.2 MB/s (105698190 bytes in 19.387s)luogw@luogw-MacBook-Pro Downloads$ lltotal 16drwx------+  5 luogw  staff   170  8 10 14:30 ./drwxr-xr-x+ 67 luogw  staff  2278  8  9 17:45 ../-rw-r--r--@  1 luogw  staff  6148  8  8 18:11 .DS_Store-rw-------   1 luogw  staff     0  5 14 11:11 .localizeddrwxr-xr-x  54 luogw  staff  1836  8 10 14:30 framework.jar

jdb时设置源码位置,指向导出的系统类库

framework目录是framework.jar反编译后的java代码

jdb  -sourcepath framework -attach 127.0.0.1:7701

转载地址:http://wambi.baihongyu.com/

你可能感兴趣的文章
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
/dev/input/event0 键盘输入
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
opencv test code-1
查看>>
eclipse 导入先前存在的项目
查看>>
GNU hello代码分析
查看>>
Qt继电器控制板代码
查看>>
busybox passwd修改密码
查看>>
wpa_supplicant控制脚本
查看>>
rfkill: WLAN hard blocked
查看>>
gstreamer相关工具集合
查看>>
arm 自动升级脚本
查看>>