Ошибка удаленной отладки с помощью GDB - PullRequest
6 голосов
/ 30 марта 2009

Я пытался выполнить удаленную отладку 32-разрядного приложения на x86_64 suse linux, но получил эту ошибку «плохо отформатированный регистр».

Я запускаю gdbserver как прослушивающий порт 12345 (локальный хост gdbserver: 12345 my_prog)

И это ошибка:

$ gdb
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
(gdb) target remote <ip>:12345
Remote debugging using <ip>:12345
Remote register badly formatted: T0506:0000000000000000;07:80b8bcff00000000;10:4028f0f700000000;
here: 0000000;07:80b8bcff00000000;10:4028f0f700000000;
(gdb)

Это машина сервера отладки (uname -a):

Сервер Linux 2.6.16.60-0.31-smp # 1 SMP Вт 7 октября 16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux

А это клиентская машина отладки (uname -a):

Клиент Linux 2.6.16.54-0.2.5-default # 1 Пн 21 января 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux

Хотя обе машины работают на виртуальных машинах (VMWare). Двоичный файл gdbserver копируется с клиентского компьютера на компьютер сервера.

(Я выполняю удаленную отладку, поскольку среда выполнения на сервере отладки похожа на рабочую и не содержит инструментов разработки, доступа к исходному коду и т. Д.)

Любые предложения приветствуются.

ОБНОВЛЕНИЕ: это сработало для меня, введя следующую команду в GDB:

установить архитектуру i386: x86-64

Ответы [ 5 ]

3 голосов
/ 30 марта 2009

Возможно, вам нужно выполнить что-то вроде set architecture i386 в приглашении (gdb)? Что show architecture говорит после подключения к удаленной цели?

2 голосов
/ 05 апреля 2009

64-разрядная GDB может напрямую отлаживать как 32-, так и 64-разрядные процессы нижнего уровня (я полагаю, это называется поддержкой нескольких арок).

Не так с gdbserver: он не поддерживает многоархивную отладку.

Вам нужен gdbserver, который соответствует целевой архитектуре, и gdb, который соответствует gdbserver. Соберите их из исходного кода, настройте с --target=i686.

0 голосов
/ 18 декабря 2014

Я думаю, вам нужно запустить GDB на вашем хост-компьютере с копией целевой программы. То есть если вы запускаете gdbserver myprog на целевой машине, вам нужно скопировать myprog на хост-компьютер и запустить gdb myprog.

Таким образом, GDB на хост-машине автоматически выбирает архитектуру из исполняемого файла. Подобный запуск gdb на хосте также загрузит символы, без которых вы получите неразрешенные символы (вопросительные знаки).

0 голосов
/ 29 мая 2009

1) Вам нужен правильный gdbserver для вашей целевой машины и вашего хост-компьютера (тот, который подходит для целевой машины в вашем случае.

Допустим, я хочу отладить цель ppc с хоста x86:

На моей цели мне понадобится исполняемый файл gdbserver для PPC.

Мне понадобится на моем хосте исполняемый GDB x86 для powerpc.

После того, как вы настроены на эти вещи, вы должны сделать следующее с вашего хоста gdb перед подключением к цели в случае, если вы используете совместно используемые библиотеки:

установить solib-абсолютный префикс $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE

dir $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE

в противном случае хост gdb сойдет с ума, пытаясь загрузить разделяемые библиотеки для x86.

0 голосов
/ 30 марта 2009

Может быть, вы уже проверили это, но здесь идет: - На 64-битной машине у вас есть 32-битные библиотеки (libc и т. Д.)? - Вы пытались запустить gdb с ключом "-nx" (без файлов инициализации)?

...