10

我使用 react-native 0.61.2 创建了我的应用程序的发布版本并启用了 Hermes。在我的 Crashlytics 中,我收到有关崩溃的信息以及堆栈跟踪。以前我使用 apktool 从我的 apk 中提取 index.android.bundle,它包含 js 代码,我可以通过堆栈跟踪找到问题。

但是现在使用 Hermes index.android.bundle 似乎包含字节码而不是 js,我浪费了一天时间试图反汇编它。我尝试的最后一件事是https://github.com/facebook/hermes/blob/master/doc/BuildingAndRunning.md中提到的hbcdump工具,但我得到的只是“错误:无法反序列化字节码:错误的字节码版本。预期73 但得到了 62"

反汇编使用 Hermes 创建的 index.android.bundle 应该怎么做?非常感谢任何帮助!

4

1 回答 1

4

编辑:从 Hermes v0.5.0 开始,还有一个hermes-engine-cli包含字节码反汇编程序的 NPM。它仅与相应的hermes-engine版本兼容(即hermes-engine-cli@0.5.0与兼容hermes-engine@0.5.0)。

它仍然主要对编译器开发人员有用,而不是用于调试应用程序崩溃。


Hermes 工具不向后兼容,因此您需要先检查正确的版本。对于字节码版本62,您可以v0.2.1使用git checkout v0.2.1. 对于任意字节码版本,git log -p include/hermes/BCGen/HBC/BytecodeFileFormat.h将显示哪些提交将格式更新到了哪些版本。

构建后,您可以在提示符处使用hbcdump myfile.hbc后跟disassemble显示文件的禁用版本。

请注意,hbcdump它旨在开发/调试编译器,与javap -cobjdump -d. 这是您可以期待的输出类型:

Function<fizzbuzz>1(1 params, 22 registers, 0 symbols):
Offset in debug table: src 0xd, vars 0x0
fizzbuzz.js[1:21]
    LoadConstZero     r11
    LoadConstUInt8    r10, 15
    LoadConstUInt8    r9, 3
    LoadConstString   r8, "Fizzbuzz"
    LoadConstString   r7, "Fizz"
    LoadConstString   r6, "Buzz"
    GetGlobalObject   r5
    LoadConstUndefined r0
    LoadConstUInt8    r4, 1
    LoadConstUInt8    r3, 100
    LoadConstUInt8    r2, 5
    LoadConstZero     r1
L2:
fizzbuzz.js[1:21]
    Mod               r12, r1, r10
    Mov               r13, r8
    JStrictEqual      L1, r12, r11
    Mod               r12, r1, r9
    Mov               r13, r7
    JStrictEqual      L1, r12, r11
    Mod               r12, r1, r2
    Mov               r13, r6
    JStrictEqual      L1, r12, r11
    AddEmptyString    r13, r1
L1:
fizzbuzz.js[8:5]
    TryGetById        r12, r5, 1, "print"
    Call2             r12, r12, r0, r13
    AddN              r1, r1, r4
    JLessN            L2, r1, r3
    Ret               r0
于 2020-01-10T18:53:17.213 回答