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

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

概述今天,我有一个非常奇怪的错误的堆栈跟踪.实际上,我可能是第一个获得此消息的人(是!),因为在发布此问题之前,Google中唯一出现的“不良稀疏转换魔术”是Android源代码.这是stacktrace(Android2.3.4)的一部分:java.lang.InternalError:badsparseswitchmagicatorg.my.app.MyIt

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

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

java.lang.InternalError: bad sparse switch magicat 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文件中的交换表地址不正确.没有更多信息,很难说出原因.

总结

以上是内存溢出为你收集整理的java-InternalError:不良的稀疏切换魔术-这是什么意思?全部内容,希望文章能够帮你解决java-InternalError:不良的稀疏切换魔术-这是什么意思?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1084683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存