Отладка простого 64-разрядного исполняемого файла ARM приводит к внутренней ошибке в GDB - PullRequest
0 голосов
/ 30 января 2019

Я написал простую C-программу для печати Hello World.Затем я запустил его через

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;
}

Что я делаю не так?Что еще мне нужно сделать?Я запускаю Ubuntu 18.04 на компьютере x86_64.

Когда я использую 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)

Я следую инструкциямна этой странице под первым разделом.

1 Ответ

0 голосов
/ 30 января 2019

Чтобы запустить и отладить исполняемый файл AArch64, вам (в общем) необходимо запустить его на компьютере AArch64 или в эмуляторе AArch64.

Возможно, у вас есть некоторые настройки, где qemu более или менее прозрачноэмулирует двоичные файлы aarch64 для вас, но это не так прозрачно для отладчика.В общем случае вы можете запустить отладчик на одном компьютере, подключенном по сети к серверу отладки на другом компьютере, что позволяет отлаживать процесс, запущенный на компьютере с сервером отладки.

В руководстве, которое вы связали, показанокак настроить qemu, чтобы позволить ему прозрачно эмулировать двоичные файлы при их выполнении.Это руководство показывает только выполнение, а не отладку, но в нем есть ссылка «Отладка с использованием GDB», которая указывает на https://ubuntuforums.org/showthread.php?t=2010979&s=096fb05dbd59acbfc8542b71f4b590db&p=12061325#post12061325,, где объясняется, как отлаживать процесс, который выполняется в эмуляции 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]
...