【发布时间】:2020-06-03 20:06:03
【问题描述】:
我在 arm64 QEMU 实例上运行了一些非常简单的裸机汇编代码。通过 QEMU 调试端口使用 GDB 进行调试时,单步 (stepi) 是在指令上前进,而不是在每行汇编中前进。该模式似乎是它直接前进到下一个分支指令或分支目标。正在推进的代码肯定会在寄存器副作用可见时执行。
例如,以下代码在单步执行 (stepi) 时仅在以下突出显示的行上停止,这些行是分支或分支目标,但是 x2 明显递增:
ldr x0, =0x08000000
ldr x3, =-1
loop:
ldxr x2, [x0] <<< GDB "stepi" stops here
add x2, x2, #1 <<< skipped
stxr w3, x2, [x0] <<< skipped
b trampoline <<< GDB "stepi" stops here
nop
trampoline:
b loop <<< GDB "stepi" stops here
这听起来像是 .elf 文件中缺少/不完整的调试信息,但我已经尝试了我知道的每个 gcc/as -g 选项。在用户空间应用程序上本地运行 GDB 时,我没有遇到过这种行为,所以想知道这是否是 QEMU 的奇怪之处。
【问题讨论】:
-
是的,而不是“像 .elf 文件中缺少/不完整的调试信息”,它闻起来像 QEMU 中的错误,因为机器指令不需要调试信息踩踏。也许How to single step ARM assembly in GDB on QEMU?有答案
-
您使用的是哪个版本的 QEMU?您可以尝试使用最新的,看看它是否是已修复的错误。