如何在QEMU上的GDB中单步执行ARM组装? [英] How to single step ARM assembly in GDB on QEMU?

查看:207
本文介绍了如何在QEMU上的GDB中单步执行ARM组装?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试学习使用GNU汇编器进行ARM汇编器编程.我已经用QEmu设置了PC,并拥有Debian ARM-HF chroot环境.

I'm trying to learn about ARM assembler programming using the GNU assembler. I've setup my PC with QEmu and have a Debian ARM-HF chroot environment.

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

If I assemble and link my test program:

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

具有:

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

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

Then load the file into gdb and set a breakpoint on _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)

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

How do I single step the code, display the assembler source code and monitor the registers? I tried some basic commands and they did not work:


(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 syscall(这是系统调用号26),所以它永远不会起作用.

Your problem here is that you're trying to run an ARM gdb under QEMU's user-mode emulation. QEMU doesn't support the ptrace syscall (that's what syscall number 26 is), so this is never going to work.

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

What you need to do is run your test binary under QEMU with the QEMU options to enable QEMU's own builtin gdb stub which will listen on a TCP port. Then you can run a gdb compiled to run on your host system but with support for ARM targets, and tell that to connect to the TCP port.

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

(Emulating ptrace within QEMU is technically very tricky, and it would not provide much extra functionality that you can't already achieve via the QEMU builtin gdbstub. It's very unlikely it'll ever be implemented.)

这篇关于如何在QEMU上的GDB中单步执行ARM组装?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆