设为首页 加入收藏

TOP

Dalvik——Dalvik调试器指南(一)
2014-11-24 12:00:17 来源: 作者: 【 】 浏览:1
Tags:Dalvik 调试器 指南

2、调试数据
源代码调试数据通过java编译器发出,它包含了从源代码到字节码的映射、描述寄存器存储方法参数和本地变量的列表,可指定参数不发出它。当dx转换java字节码到dalvik字节码的时候,它也必须转换该调试数据。
dx必须保证它不执行妨碍调试器的指令。例如,多次使用保存方法参数的寄存器和this指针在dalvik字节码是被允许的,如果该值从未被用或不再需要,但是这对于调试器来说会很不解,因为这些值在方法中,调试器不愿意他们丢失。因此,dx在调试器使能的时候有时产生非理想的代码。
一些调试数据被用作其他作用,例如,包含文件名和行号数据在产生异常堆栈追踪时很必要。这些数据可以扔掉,为了保证dex文件更小。


3、使用
正如其他流行的桌面虚拟机所做的,dalvik vm支持许多命令行flag。启动调试状态的vm,你需要通过基本的选项增加命令行flag。基本的命令如下:
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y
在前缀后面,选项以“名称=值”的形式提供,dalvik vm支持的选项如下:
transport (无默认)
传输机器码用,dalvik支持tcp/ip socket(dt_socket)和通过adb连接到usb(dt_android_adb)。
server (默认='n')
决定vm是作为客户端还是服务器,当作为服务器的时候,vm等待调试器连接它,当作为客户端的时候,vm尝试连接在等待状态的调试器
suspend (默认='n')
如果设为y,vm会等待调试器连接再执行应用程序代码,当调试器连接后(或当vm完成和调试器连接后),vm告诉调试器它刮起了,然后不会做任何事除非被告知resume。如果设为n,vm会率先执行。
address (默认="")
在server=n时,这必须是“hostname:port”形式,但是在server=y的时候只要指定port。这指定了要连接或要监听的ip地址和端口号。
监听端口0有特殊含义:试图监听端口8000,如果失败试图连接8001、8002...以此类推。
该参数对于transport=dt_android_adb无意义。
help (无参数)
帮助信息
launch, onthrow, oncaught, timeout
这些参数会被接受,然后被忽略。


要通过usb使用DDMS调试android设备上的程序,你要使用命令:
% dalvikvm -agentlib:jdwp=transport=dt_android_adb,suspend=y,server=y -cp /data/foo.jar Foo
这告诉dalvik vm在调试状态下运行程序,监听来自DDMS的连接,等待调试器。该程序会在进程列表上产生“?”名字的应用,因为它不是来自android应用列表中,从这儿你可以连接你的调试器到对应的DDMS监听端口(例如:在应用列表中选定“?”应用,输入jdb -attach localhost:8700)

要通过adb使用tcp/ip调试android设备上的程序,你必须先使用命令:
% adb forward tcp:8000 tcp:8000
% adb shell dalvikvm -agentlib:jdwp=transport=dt_socket,address=8000,suspend=y,server=y -cp \
/data/foo.jar Foo
然后jdb -attach localhost:8000。
(上面的例子中,vm会在你连接时挂起,在jdb中,类型cont会继续)

DDMS的集成使得dt_android_adb传输在调试android设备时更加方便,但是当使用桌面dalvik的时候,使用tcp/ip更好。


4、须知和缺陷
大多数JDWP的可选项都没有实现,包括filed access watchpoint(CR:不太了解)和更号的追踪监视器。
不是所有的JDWP请求都实现,任何我们使用的调试器不会发出的信息都没有实现,这会导致log一个error信息,当使用到的时候我们才会是实现它。
调试器和GC当前没有高度集成,当前vm只保证在调试器中断连接之前,任何调试器识别的对象都不会被GC,这会在调试器连接时随着时间导致累积。例如,当调试器监视一个运行的线程,相关的线程对象就不会被收集,即使线程终结。
这种情形在异常处理代码中会加重,导致几乎所有的异常都加到“do not discard”列表中,即使调试器没有监视他们。在调试会触发一大堆异常的程序时,会导致内存溢出错误。这些会在未来版本中修正。
唯一“解锁”reference的方式是拆开重装调试器。(CR:不懂)
从java字节码到dalvik字节码的转换回导致相同的指令序列被合并,这在执行中会看上去像错误代码。例如:
int test(int i) {
if (i == 1) {
return 0;
}
return 1;
}
dalvik字节码对两次return都使用常见的return指令,因此当i=1的时候调试器单步执行时会先return 0然后return 1。
dalvik处理同步的方法时和其他vm不同,其他vm都是把方法标记为synchronized然后等待vm来处理锁,而dx在方法顶层加了“lock”指令同时在“finally”程序块中增加了“unlock”指令。因此,当单步执行return语句时,“当前行”光标可能导致跳到方法的最后一行。
这会影响调试器处理异常的方法。调试器可能会基于异常“捕捉”或“未捕捉”来发出异常。如果认为是“未捕捉”,应该没有catch程序块或者finally语句在当前执行行和线程顶端之间。在同步方法中或下面抛出的异常会被认为是“捕捉”,因而调试器不会停下来,直到异常被finally程序块重新抛出。


==================================CUT============================================


source:http://www.netmite.com/android/mydroid/2.0/dalvik/docs/debugger.html


The Dalvik virtual machine supports source-level debugging with many popular development environments. Any tool that allows remote debugging over JDWP (the Java Debug Wire Protocol) is expected work. Supported debuggers include jdb, Eclipse, IntelliJ, and JSwat.


The VM does not support tools based on JVMTI (Java Virtua

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Dalvik——tests工具学习文档 下一篇Dalvik——基本Dalvik VM调用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)