gpt4 book ai didi

java - 内部错误 : Bad sparse switch magic - what that means?

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:52 25 4
gpt4 key购买 nike

今天我得到一个堆栈跟踪,其中有一个非常奇怪的错误。实际上,我可能是第一个得到这个的人(耶!),因为在发布这个问题之前,谷歌中唯一出现的“Bad sparse switch magic”是在 Android 源代码中。

这是堆栈跟踪的一部分(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 的构造函数中使用它。为了理解哪里出了问题,我可能必须仔细研究很多与 dalvik 相关的代码,所以我问你 - 也许有人可以解释我 - 哪里出了问题?我只是好奇。

编辑

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

最佳答案

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

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

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

真正执行稀疏switch语句的dex字节码指令叫做sparse-switch。它的代码是 0x2c,它还需要一个寄存器来测试 switch 语句和一个开关表的地址。我认为您的 dex 文件中的开关表地址不正确。没有更多信息,很难说出原因。

关于java - 内部错误 : Bad sparse switch magic - what that means?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com