Dart 堆栈跟踪都以 3/7/b/f(ARM 架构)结尾,而我们知道 ARM/Thumb/Thumb(2) 指令是 2 或 4 个字节——这怎么可能发生?

Dart stack trace all ends with 3/7/b/f (ARM architecture), while we know ARM/Thumb/Thumb(2) instructions are 2 or 4 bytes - How can that happen?

我看到,Dart 堆栈跟踪都以 3/7/b/f(ARM 架构)结尾,而我们知道 ARM/Thumb/Thumb(2) 指令是 2 或 4 个字节。

示例:https://github.com/dart-lang/sdk/issues/43274

Warning: This VM has been configured to produce stack traces that violate the Dart standard.
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 29278, tid: 29340, name 1.ui
isolate_dso_base: 6fe9d64000, vm_dso_base: 6fe9d64000
isolate_instructions: 6fe9d74000, vm_instructions: 6fe9d66000
    #00 abs 0000006fe9f4e87b virt 00000000001ea87b _kDartIsolateSnapshotInstructions+0x1da87b
    #01 abs 0000006fe9f4e4a3 virt 00000000001ea4a3 _kDartIsolateSnapshotInstructions+0x1da4a3
    #02 abs 0000006fe9d83ca3 virt 000000000001fca3 _kDartIsolateSnapshotInstructions+0xfca3

所以,我想知道这是怎么发生的?恕我直言,ARM CPU 将 运行 Android 文件中的 .so 机器指令(汇编)。但是,如果所有指令都不与 2/4 字节对齐,CPU 运行 怎么可能呢?

感谢任何建议!

lsb 可以说是“拇指位”。

您可以通过指令bxblx在ARM和thumb模式之间切换。

这些指令扫描lsb,如果它被设置,它将切换到拇指模式,否则切换到ARM模式。然后分支到address&~1

堆栈跟踪显示了调用函数的 return 地址,它们是奇数表示它们在拇指模式下 written/compiled。