Удаленная отладка процесса Linux из Windows с помощью gdb и gdbserver: что именно нужно на стороне Windows?

Я запускаю Eclipse CDT в Windows для разработки кода C, который создается и тестируется в удаленных системах Linux. В настоящее время код никогда не компилируется в Windows.

Я могу использовать CDT, чтобы начать удаленный процесс на цели Linux под gdbserver, а затем подключить gdb с хоста Windows. Однако GDB сразу выдает ошибку:

warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default i386 settings.
[...]
Remote 'g' packet reply is too long: 74afe9bff0aee9bf02000000f4af4a00a0aee9bf[...]

Отладка между двумя системами Linux работает нормально, поэтому ясно, что я делаю что-то не так на стороне хоста Windows. Мои конкретные вопросы:

  • Достаточно ли версии GDB для Cygwin для отладки удаленных процессов Linux, или мне нужен специальный кросс-GDB, чтобы запускать его в Windows и работать с процессами Linux? Если да, то где я могу раздобыть такой gdb?

  • Для удаленной отладки с помощью gdb необходимо, чтобы символы были доступны в хост-системе. Как проще всего этого добиться? Могу ли я просто скопировать символы, созданные сборкой на целевой машине Linux, на хост Windows, или мне нужно получить полную сборку на Windows? Есть ли способ избежать этого требования, чтобы я мог указывать символы только на мишени?

Спасибо,

-R


Дополнительная информация: RSE FAQ содержит некоторые указания, но, к сожалению, Я все еще заблокирован. В FAQ описаны два подхода:

  • Запустите клиент gdb в удаленной системе по ssh. Проблема здесь в том, что определенные поля в средстве запуска отладки CDT привязаны к локальной системе (путь к проекту, путь к исполняемому файлу и т. Д.).
  • Создайте / получите версию gdb для кросс-отладки, которая поддерживает отладку процессов Linux из Windows. Проблема здесь в том, что информации о том, как этого добиться, мало.

Я также поднял этот вопрос на форуме CDT .


person rewbs    schedule 17.08.2010    source источник


Ответы (6)


Настройка среды кросс-компиляции или кросс-отладки с помощью gcc / gdb - очень сложная проблема, и это почти никогда не бывает наиболее эффективным решением. Поместить виртуальную машину Linux в окно Windows и отладить там будет гораздо меньше работы. Если вам действительно нужно отлаживать «там», я бы предложил просто ssh-ing и использовать командную строку gdb. Если у вас нет исходного кода, удаленная отладка с виртуальной машины Linux, находящейся под вашим контролем, будет практичной.

person bmargulies    schedule 10.03.2013

Просто перестройте GDB с поддержкой целевой платформы. Вы можете использовать для этого Cygwin. Пример для целевой платформы RHEL:

> wget http://ftp.gnu.org/gnu/gdb/gdb-<ver>.tar.xz
> tar -xJvf gdb-<ver>.tar.xz
> mkdir -p gdb-<ver>/build/x86_64-redhat-linux-gnu
> cd gdb-<ver>/build/x86_64-redhat-linux-gnu
> ../../configure --target=x86_64-redhat-linux-gnu
> make && make install
> x86_64-redhat-linux-gnu-gdb.exe --version

Не забудьте после этого перенастроить инструментальную цепочку. Чтобы получить имя целевой конфигурации, вы можете использовать:

> echo ${BASH_VERSINFO[5]}
person Eugene Weiss    schedule 15.12.2017
comment
Это мертво! Отлично работал с CentOS 7, работающей в VirtualBox, и с использованием Eclipse / Cygwin64 на хосте Windows 10. Скачал и скомпилировал GDB 8.1.1 - person speed488; 21.11.2019

Теперь есть плагин http://marketplace.eclipse.org/content/direct-remote-c-debugging

Это позволяет запускать gdb на сервере удаленно по ssh. Он заботится о отображении пути и других вещах.

Вам не нужен сервер GDB для удаленной работы

person Mohamed Abdelazim    schedule 28.07.2015

Мне не удалось собрать его под Windows, но мне было довольно легко собрать его под Linux. Подводя итог и завершите ответ @Eugene: Сначала подготовьте источники:

wget http://ftp.gnu.org/gnu/gdb/gdb-<ver>.tar.xz
tar -xJvf gdb-<ver>.tar.xz
mkdir -p gdb-<ver>/build/x86_64-redhat-linux-gnu
cd gdb-<ver>/build/x86_64-redhat-linux-gnu

Скачать компилятор Windows:

sudo apt-get install mingw-w64

Проверьте целевую платформу конфигурации, на которой вы хотите отлаживать свои двоичные файлы (что нужно указать в параметре --target):

echo ${BASH_VERSINFO[5]}

Подготовьте make-файлы, предназначенные для вашей желаемой платформы, но работающие на другом хосте. Мы компилируем его статическим образом, чтобы он не зависел от каких-либо DLL или других библиотек. Также мы отключаем сборку других двоичных файлов, как предлагает gdb wiki:

../../configure --host=x86_64-w64-mingw32 --target=x86_64-pc-linux-gnu --enable-static=yes --disable-interprocess-agent --disable-binutils --disable-ld --disable-gold --disable-gas --disable-sim --disable-gprof

наконец, сборка (занимает около 30-60 минут):

make LDFLAGS=-static

Вы можете найти свой отладчик в папке gdb. Также хорошо избавиться от отладочных символов, так как после сборки исполняемый файл огромен:

strip -s gdb/gdb.exe

Вуаля! gdb.exe готов к запуску в Windows и удаленной отладке исполняемых файлов Linux!

person tutejszy    schedule 22.04.2020
comment
Я могу подтвердить, что это работает, используя WSL 2 (почему бы и нет). Сборка /tmp с использованием make LDFLAGS=-static -j8 на моем 5-летнем i7 заняла чуть больше 1 минуты. (Программа makeinfo не была установлена, так что это немного ускорило работу, но далеко-далеко от 30 минут.) Два примечания: 1) tar xf gdb-<ver>.tar.xz тоже выполняет свою работу. Ни -, ни J больше не нужно 2) Зачем встраивать .../build/x86_64-redhat-linux-gnu, а не только .../build? - person Morty; 23.09.2020

Visual Studio Community Edition 2017 включает инструменты кросс-компиляции и отладки GDB. Добавьте к этому сервер Linux или подсистему Windows Linux, и вы сможете надежно разработать код C для систем Linux. ознакомьтесь с это руководство.

person TheRealOrange    schedule 22.10.2017

Как правило, разработка программного обеспечения в Linux намного проще, чем в Windows. Но это не по теме.

Что важно при отладке кросс-скомпилированных двоичных файлов, так это то, что вы используете GDB из кросс-компилятора, а не хост GDB. Например, вы не можете использовать gdb, созданный для Windows, для отладки процесса Linux (ну, вы можете, но это не рекомендуется). Вам необходимо использовать кросс-компилятор gdb для отладки удаленного процесса (который является частью той же инструментальной цепочки, которая использовалась для создания двоичного файла). Поскольку вы говорите, что никогда не компилируете под Windows, я почти уверен, что это может быть вашей проблемой. Самый простой способ заставить его работать - просто использовать gdb из командной строки на удаленном компьютере, на котором вы компилируете, и выполнять отладку по ssh.

person Martin    schedule 18.08.2018