java-InternalError:不良的稀疏切换魔术-这是什么意思?

提问

今天,我有一个非常奇怪的错误的堆栈跟踪.实际上,我可能是第一个获得此消息的人(是!),因为在发布此问题之前,Google中唯一出现的“不良稀疏转换魔术”是Android源代码.

这是stacktrace(Android 2.3.4)的一部分:

java.lang.InternalError: bad sparse switch magic
at org.my.app.MyItemAdapter.(MyItemAdapter.java:64)
at org.my.app.MyActivity.onCreate(MyActivity.java:78)

从MyItemAdapter构造函数退出时抛出该错误.由于它是内部的,所以我可以肯定这不是我的错-但我只想知道Dalvik VM内部发生了什么严重的问题.

该错误似乎与switch指令有关,只是为了澄清-我没有在MyItemAdapter的构造函数中直接使用它.为了了解出了什么问题,我可能必须仔细研究许多与达尔维克有关的代码,所以我问你-也许有人可以向我解释-哪里出了问题?我只是好奇.

编辑

这是引发该错误的Android代码:http://androidxref.com/source/xref/dalvik/vm/interp/Interp.cpp#1070

最佳答案

有一个稀疏开关dex字节码,它将Android解释器指向实际上不是稀疏开关语句的内存区域.

Dex字节码可以表示两种类型的switch语句:打包或稀疏.打包的switch语句仅需要存储最小值即可打开.每个后续开关值都从前一个值增加1,因此case语句仅在字节码中存储分支目标.稀疏开关格式的每个case语句具有一个值的条目和分支目标.请参阅“ Dalvik VM的字节码”文档(http://source.android.com/tech/dalvik/dalvik-bytecode.html)中的“稀疏切换有效负载”部分.

dex中的稀疏转换语句由第二字节为0x02(http://androidxref.com/source/xref/dalvik/libdex/DexOpcodes.h#53)的noop字节码指令指示. Noop指令的第一个字节始终为0x00,因此稀疏转换语句的完整“魔术签名”为0x0200.

实际执行稀疏切换语句的dex字节代码指令称为稀疏切换.它的代码是0x2c,它还需要一个寄存器来测试switch语句和switch表的地址.我认为您的dex文件中的交换表地址不正确.没有更多信息,很难说出原因.

评论