У меня есть два идентичных Centos на 64 бита 5 машин, которые объединяются в сеть и совместно используют их / домашнее монтирование. Я компилирую простое Привет Мировая программа на одной, и затем я выяснил, как использовать gdb на одной машине для удаленной отладки ее работающий на другой машине. Это, кажется, хорошо работает, когда все принимают значение по умолчанию к 64 разрядностям.
Однако, если я компилирую мой Привет Мир с-m32 для генерации двоичного файла на 32 бита, путь наше полное система компилируется, затем я не могу выяснить, как заставить gdb и gdbserver правильно соединяться. Прежде чем я примерю его наше полное система, я полагаю, что должен получить его работающий с привет. В зависимости от того, как я пытаюсь соединить gdb и gdbserver, я или получаю сообщения о плохо отформатированных регистрах, предупреждения о несоответствиях архитектуры или недопустимые ссылки памяти.
У меня, кажется, есть мало понимания того, что последствия-m32 находятся в моей компиляции и никакой идее того, как запустить gdb и gdbserver или правильный порядок для определения архитектуры или файлов или чего-то.:(
Что это берет для использования gdb и gdbserver на 32 битах (-m32) исполняемый файл на поле Linux на 64 бита?
Примеры ниже, и спасибо,
Jerry
hello.cpp:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World." << std::endl;
return -1;
}
Вот три выполнения:
Или в немного большем количестве деталей:
==============================
Для каждого выполнения, удаленный сказанный gdbserver:
$ gdbserver --multi rdev6:2010 hello
Process hello created; pid = 32603
Listening on port 2010
Remote debugging from host 134.51.26.149
readchar: Got EOF
Remote side has terminated connection. GDBserver will reopen the connection.
Listening on port 2010
И на нашем локальном:
==============================
$ gdb
GNU gdb Fedora (6.8-37.el5)
his GDB was configured as "x86_64-redhat-linux-gnu".
(gdb) set archi i386
The target architecture is assumed to be i386
(gdb) target extended-remote rdev6:2010
Remote debugging using rdev6:2010
warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
Try to load the executable by `file' first,
you may also check `set/show architecture'.
(gdb)
==============================
$ gdb
GNU gdb Fedora (6.8-37.el5)
his GDB was configured as "x86_64-redhat-linux-gnu".
(gdb) set archi i386
The target architecture is assumed to be i386
(gdb) file hello
Reading symbols from /home/j/hello...done.
(gdb) target extended-remote rdev6:2010
Remote debugging using rdev6:2010
warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
Try to load the executable by `file' first,
you may also check `set/show architecture'.
(gdb) sho archi
The target architecture is assumed to be i386
(gdb)
==============================
$ gdb
GNU gdb Fedora (6.8-37.el5)
This GDB was configured as "x86_64-redhat-linux-gnu".
(gdb) set archi i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) file hello
Reading symbols from /home/j/hello...done.
(gdb) show archi
The target architecture is assumed to be i386:x86-64
(gdb) target extended-remote rdev6:2010
Remote debugging using rdev6:2010
[New Thread 32667]
Cannot access memory at address 0x800000008
(gdb)
Если вы хотите отлаживать 32-битный процесс с помощью 64-битного gdb / gdbserver, вам нужна более новая версия GDB. В частности, вам понадобится следующее:
gdbserver/ChangeLog:
2009-05-12 Doug Evans <dje@google.com>
Biarch support for i386/amd64 gdbserver.
В качестве альтернативы вы можете собрать gdb / gdbserver, который у вас уже есть, из исходного кода в 32-битном режиме, запустив
./configure CC='gcc -m32'
и используя gdb32 / gdbserver32 для отладки ваших процессов. Однако я не вижу в этом никаких преимуществ - в новых версиях GDB есть много исправлений, ускорений и хороших принтеров STL.