我编写了一个简单的C程序来打印问候世界。然后我通过
aarch64-linux-gnu-gcc -ohello hello.c -static -g3
gdb-multiarch hello
此后,我run
和gdb遇到内部错误:
Reading symbols from hello...done.
(gdb) r
Starting program: /home/gt/hello
/build/gdb-GT4MLW/gdb-8.1/gdb/i387-tdep.c:592: internal-error: void i387_supply_fxsave(regcache*, int, const void*): Assertion `tdep->st0_regnum >= I386_ST0_REGNUM' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n)
这是file hello
的输出:
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=a...b, with debug_info, not stripped
这是我的hello.c
:
#include<stdio.h>
int main(){
printf("hello world");
return 0;
}
我在做什么错?我还需要做什么?我在x86_64机器上运行Ubuntu 18.04。
使用gdb hello
时,我无法使用断点,但出现此错误:
Reading symbols from hello...done.
(gdb) break 4
Breakpoint 1 at 0x400404: file hello.c, line 4.
(gdb) r
Starting program: /home/gt/hello
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x400404
(gdb)
我正在遵循第一部分this page上给出的指南。
答案 0 :(得分:1)
为了运行和调试AArch64可执行文件,(通常)您需要在AArch64机器或AArch64模拟器中运行它。
您可能已经进行了一些设置,其中qemu或多或少地为您透明地模拟aarch64二进制文件-但这对于调试器而言并没有那么透明。通常,您可以在一台计算机上运行调试器,该调试器通过网络连接到另一台计算机上的调试服务器,从而允许您使用调试服务器来调试在计算机上运行的进程。
您链接的指南显示了如何设置qemu以使其在执行二进制文件时透明地模拟二进制文件。该指南仅显示执行,而不是调试,但是它有指向“ https://ubuntuforums.org/showthread.php?t=2010979&s=096fb05dbd59acbfc8542b71f4b590db&p=12061325#post12061325”的链接“使用GDB调试”,其中说明了如何调试在qemu仿真中执行的进程。本质上,这相当于我上面提到的使用调试服务器进行的远程调试。
这篇文章的基本要点是:
# In a terminal
$ qemu-arm-static -g 10101 ./hello
# In a new terminal
$ gdb-multiarch
(gdb) target remote :10101
Remote debugging using :10101
[New Remote target]
[Switching to Remote target]