Вопрос

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

Я запускаю gdbserver как прослушивающий порт 12345 (gdbserver localhost: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

Это было полезно?

Решение

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

Другие советы

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

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

Тебе необходимо gdbserver который соответствует целевой архитектуре, и gdb это соответствует gdbserver.Соберите их из исходного кода, настройте с помощью --target=i686.

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

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

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

Мне понадобится исполняемый файл gdbserver ppc.

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

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

установить префикс solib-absolute $ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE

каталог $ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top