linux - 如何在 QEMU 上的 GDB 中单步执行 ARM 程序集?

标签 linux assembly gdb arm qemu

我正在尝试使用 GNU 汇编器学习 ARM 汇编器编程。我已经用 QEmu 设置了我的 PC,并且有一个 Debian ARM-HF chroot 环境。

如果我汇编并链接我的测试程序:

.text
.global _start
_start:
        mov     r0, #6
        bx      lr

与:

as test.s -o test.o
ld test.o -o test

然后将文件载入gdb并在_start上设置断点:

root@Latitude-E6420:/root# gdb test
GNU gdb (GDB) 7.6.1 (Debian 7.6.1-1)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabihf".
For bug reporting instructions, please see:
...
Reading symbols from /root/test...(no debugging symbols found)...done.
(gdb) break _start
Breakpoint 1 at 0x8054
(gdb)

如何单步执行代码、显示汇编程序源代码和监控寄存器? 我尝试了一些基本命令,但它们不起作用:

(gdb) break _start
Breakpoint 1 at 0x8054
(gdb) info regi
The program has no registers now.
(gdb) stepi
The program is not being run.
(gdb) disas
No frame selected.
(gdb) r
Starting program: /root/test 
qemu: Unsupported syscall: 26
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
qemu: Unsupported syscall: 26
During startup program terminated with signal SIGSEGV, Segmentation fault.
(gdb) 

最佳答案

这里的问题是您试图在 QEMU 的用户模式仿真下运行 ARM gdb。 QEMU 不支持 ptrace 系统调用(26 号系统调用),所以这永远不会起作用。

您需要做的是使用 QEMU 选项在 QEMU 下运行您的测试二进制文件,以启用 QEMU 自己的内置 gdb stub ,它将监听 TCP 端口。然后,您可以运行编译为在主机系统上运行但支持 ARM 目标的 gdb,并告诉它连接到 TCP 端口。

(在 QEMU 中模拟 ptrace 在技术上非常棘手,它不会提供很多你无法通过 QEMU 内置 gdbstub 实现的额外功能。它不太可能实现。)

关于linux - 如何在 QEMU 上的 GDB 中单步执行 ARM 程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590155/

相关文章:

c++ - gdb 观察点未检测到变量的变化

java - linux中执行.jar文件时的菱形问号

python - 使用 Python 更改 SAMBA 上的用户密码

assembly - 标记堆栈局部变量(asm)

assembly - 这些错误是什么意思?汇编语言

linux - Visual Studio 2015/2017 无法创建目录,mkdir 退出代码 : 1 on Raspberry

arrays - 我尝试获取数组长度有什么问题?

Linux 从任何地方执行 CASA

assembly - 不延迟汇编的循环会使我的电脑崩溃吗?

gdb - 将 gdb 添加到 MinGW