.catchall在Dalvik字节码的smali中用作表示finally语句块吗?

3

我注意到在Java代码中有finally子句时,总是生成.catchall来识别finally块或使用.catchall标签将其内联,但我没有找到任何关于是否如此或更多解释的在线信息,有人知道吗?

2个回答

4

是的,finally块是一个情况,可能会生成.catchall。但是,它也可以用于其他事情。例如,在同步方法的情况下,它也可以生成,以确保锁被释放。

捕获所有处理程序在dex-format规范中有记录。具体来说,在包含在code_item中的encoded_catch_handler项目中。

还涉及classfile specification中等效的数据部分。请参见exception_table中的catch_type项。


@JesysFreke 我希望我能够多次点赞你的回答!这份文档确实帮助我阅读代码!再次感谢! - monica
1
链接现在是https://s.android.com/devices/tech/dalvik/dex-format.html或https://source.android.com/devices/tech/dalvik/dex-format.html。 - Caleb Fenton

3
我认为你的期望值可能过高了。
你所询问的是davlik代码生成器/翻译器的代码生成模式。在我的经验中,人们不会详细描述编译器/代码生成器在内部执行的操作:
- 这些行为无需进行指定。实际上,规范可能会对实现产生过度约束,从而造成损害。 - 这样的文档编写和维护成本很高。 - 这样的文档读者很少,难以证明其价值。
我建议你查看davlik翻译器的源代码并查看它实际执行的操作。(尝试使用“catchall”进行搜索...)
请注意,dex格式规范提供了输出“语言”及其含义。这限制了davlik翻译器可能执行的操作,但它不会告诉您翻译器在所有情况下实际执行的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接