调试简单的ARM 64位可执行文件会在GDB中导致内部错误

时间:2019-01-30 11:46:27

标签: gcc arm gdb

我编写了一个简单的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上给出的指南。

1 个答案:

答案 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]