Используя gdb и gdbserver с двоичным файлом на 32 бита на машине на 64 бита с Centos 5 жалуется на доступ к памяти или плохо отформатированные данные

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

}

Вот три выполнения:

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

И на нашем локальном:

==============================

  • Принятие его составляет i386 32 бита, устанавливая 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) 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)

==============================

  • Принятие его составляет i386 32 бита, устанавливая 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)
8
задан Jerry Asher 18 June 2010 в 22:15
поделиться

1 ответ

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

5
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: