У меня есть две идентичные 64-битные машины Centos 5, которые объединены в сеть и используют их / home mount.Я скомпилировал простую программу Hello World на одной, а затем я выяснил, как использовать GDB на одной машине для удаленной отладки его работы на другой машине.Кажется, это работает нормально, когда все по умолчанию имеют 64-битную скорость.
Однако, если я скомпилирую свой Hello World с -m32 для генерации 32-битного двоичного файла, то, как компилируется наша полная система, я не могу понятьузнать, как получить GDB и GDBserver для правильного подключения.Прежде чем я попробую это в нашей полной системе, я думаю, что я должен заставить ее работать с приветВ зависимости от того, как я пытаюсь подключить gdb и gdbserver, я получаю сообщения о плохо отформатированных регистрах, предупреждениях о несоответствиях архитектуры или недопустимых ссылках на память.
Кажется, я плохо понимаю, в чем заключается значение -m32моя компиляция и не знаю, как запустить GDB и GDBserver или правильный порядок, чтобы указать архитектуру или файлы или что-то.: (
Что требуется для использования gdb и gdbserver на 32-битном (-m32) исполняемом файле на 64-битной Linux-системе?
Примеры ниже, и спасибо,
Джерри
hello.cpp:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World." << std::endl;
return -1;
}
Вот три прогона:
- В gdb установите архитектуру i386 / затем подключитесь к gdbserver => badархитектура
- В GDB установите архитектуру i386 / файл привет / затем подключитесь к gdbserver => плохая архитектура
- В GDB установите архитектуру (неправильно) i386: x86-64 / файл привет / затем подключитесьto gdbserver => Невозможно получить доступ к памяти
Или более подробно:
====================================
Для каждого запуска удаленный 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
И на нашем локальном:
==============================
- Предполагается, что это 32-разрядная версия i386, установите значение archi в i386, затем подключите примечание: onна стороне 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) 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)
=============================
- Предполагается, что это 32-разрядная версия i386, установка archi в i386, затем подключение примечание: на стороне 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)
==============================
- Предполагая (что должно быть неверно), что это i386: x86-64, установив для archi значение i386: x86-64, затем подключив примечание: на стороне 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)