我看到,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将在安卓系统中运行.so文件中的机器指令(汇编)。但是,如果所有指令都不与2/4字节对齐,CPU如何运行它呢?
谢谢你的建议!
发布于 2021-07-26 11:18:49
可以说,lsb是“拇指比特”。
您可以使用bx或blx指令在手臂和拇指模式之间切换。
这些指令扫描lsb,如果设置了,它将切换到拇指模式,否则切换到ARM模式。然后分支到address&~1
堆栈跟踪显示调用者函数的返回地址,如果它们是奇数,则表明它们是以thumb模式编写/编译的。
https://stackoverflow.com/questions/68523557
复制相似问题