Dex debug_info 格式
Dex debug_info format
在查看 dex 文件时,我注意到在与每个 code_item
关联的 debug_info_item
中,可能有:
DBG_END_LOCAL
没有任何 DBG_START_LOCAL
前面有相同的寄存器
DBG_START_LOCAL
对于已经定义了调试信息名称但尚未关闭的寄存器(尽管这种情况很少发生)
我不明白我应该如何解析这些案例。我对 debug_info_item
格式 (https://source.android.com/devices/tech/dalvik/dex-format.html) 有什么不理解的地方吗?
另外,为了确认一下,我说得对吗:
-
DBG_START_LOCAL
和 DBG_END_LOCAL
指令只为地址范围内的指令定义调试名称,超出该范围的 jump
指令会使名称消失,即使指令指针没有通过 DBG_END_LOCAL
指向的地址
- 一个寄存器只用于一个变量,同一个函数内的同一个寄存器不应该有不同的调试名称
参数寄存器都是隐式本地的,所以你可以有一个 DBG_END_LOCAL 而没有 DBG_START_LOCAL 作为参数寄存器。在 "existing" 本地的 DBG_START_LOCAL 的情况下,我想你只是隐含地结束以前的本地并开始新的本地。
但请记住,调试信息仅供参考。没有任何东西可以证明它的结构是否正确,甚至是否真的有意义。例如混淆器可以添加无意义的调试信息,而不会导致 dex 文件在使用时无法通过验证。
例如,我最近 fixed a bug in baksmali 与 start/end 局部变量相关,因为寄存器值超出了该方法的范围。
在查看 dex 文件时,我注意到在与每个 code_item
关联的 debug_info_item
中,可能有:
DBG_END_LOCAL
没有任何DBG_START_LOCAL
前面有相同的寄存器DBG_START_LOCAL
对于已经定义了调试信息名称但尚未关闭的寄存器(尽管这种情况很少发生)
我不明白我应该如何解析这些案例。我对 debug_info_item
格式 (https://source.android.com/devices/tech/dalvik/dex-format.html) 有什么不理解的地方吗?
另外,为了确认一下,我说得对吗:
-
DBG_START_LOCAL
和DBG_END_LOCAL
指令只为地址范围内的指令定义调试名称,超出该范围的jump
指令会使名称消失,即使指令指针没有通过DBG_END_LOCAL
指向的地址
- 一个寄存器只用于一个变量,同一个函数内的同一个寄存器不应该有不同的调试名称
参数寄存器都是隐式本地的,所以你可以有一个 DBG_END_LOCAL 而没有 DBG_START_LOCAL 作为参数寄存器。在 "existing" 本地的 DBG_START_LOCAL 的情况下,我想你只是隐含地结束以前的本地并开始新的本地。
但请记住,调试信息仅供参考。没有任何东西可以证明它的结构是否正确,甚至是否真的有意义。例如混淆器可以添加无意义的调试信息,而不会导致 dex 文件在使用时无法通过验证。
例如,我最近 fixed a bug in baksmali 与 start/end 局部变量相关,因为寄存器值超出了该方法的范围。