Использование gdb и gdbserver с 32-разрядным двоичным файлом на 64-разрядной машине с Centos 5 жалуется на доступ к памяти или плохо отформатированные данные - PullRequest
8 голосов
/ 19 июня 2010

У меня есть две идентичные 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;

}

Вот три прогона:

  1. В gdb установите архитектуру i386 / затем подключитесь к gdbserver => badархитектура
  2. В GDB установите архитектуру i386 / файл привет / затем подключитесь к gdbserver => плохая архитектура
  3. В 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)

1 Ответ

5 голосов
/ 19 июня 2010

Если вы хотите отлаживать 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.

...