Как настроить GDB для отладки программ на Rust в Windows?

Как я могу настроить GDB для отладки программ на Rust в Windows, включая настройку Rust pretty-printers и отладку в среде IDE или в командной строке?


person BrunoMedeiros    schedule 06.11.2015    source источник


Ответы (1)


Установка на ржавчину

Во-первых, вам нужно скомпилировать свои программы с установкой Windows GNU ABI Rust. MSVC ABI использует формат отладки, отличный от того, который понимает GDB, так что это не сработает. Скомпилированные программы MSVC ABI придется отлаживать с помощью Visual Studio (или, возможно, LLDB в будущем).

GDB

Второй шаг - получить сам GDB. Рекомендуемый вариант - получить его либо из TDM-GCC, либо из mingw-w64:

  • TDM-GCC (http://tdm-gcc.tdragon.net/): доступен пакет для загрузки с Только GDB (без GCC или других инструментов, которые вам не нужно). Специальные клавиши работают только в терминале Windows. Рекомендуемый GDB для использования с Eclipse / RustDT.
  • Mingw-w64 (http://mingw-w64.org/): специальные клавиши работают только в терминале Windows. В последних версиях есть ошибка: аргументы командной строки с пробелами в них анализируются неправильно.
  • Cygwin: Не рекомендуется. Специальные клавиши работают в терминале Windows и терминале bash. Пути должны быть указаны в формате Cygwin, и это, похоже, ломает некоторые вещи. Не работает должным образом с Eclipse / RustDT.

Включение хороших принтеров

Rust предоставляет некоторые расширения для GDB, позволяющие лучше отображать определенные собственные типы Rust, такие как перечисления, срезы и векторы. С помощью pretty-printers переменные этого типа будут отображаться в структурированном виде, а не в низкоуровневом представлении. Для получения дополнительной информации см. https://michaelwoerister.github.io/2015/03/27/rust-xxdb.html.

Pretty-printers включены только в дистрибутивы Rust для Linux (и Mac OS?), Но не в Windows (Проблема сообщил). Но их можно заставить работать в Windows.

Загрузите архив Linux Rust (https://www.rust-lang.org/downloads.html), распакуйте и найдите внутри каталог rustc/lib/rustlib/etc. Теперь скопируйте папку etc в $RUST/bin/rustlib, где $ RUST - это расположение вашей установки Rust. Скрипты Python будут расположены в $RUST/bin/rustlib/etc.

Если вы собираетесь использовать GDB только из RustDT и у вас RustDT 0.4.1 или выше, вы можете перейти к следующему разделу: «Использование GDB в Eclipse с RustDT».

Теперь необходимо настроить GDB для загрузки этих сценариев. Найдите файл gdbinit вашей установки GDB (для TDM-GCC это должно быть gdb64\bin\gdbinit, для mingw-w64: mingw64\etc\gdbinit). Теперь добавьте в конец файла следующий текст:

python
print "---- Loading Rust pretty-printers ----"

sys.path.insert(0, "$RUST_GDB_ETC")
import gdb_rust_pretty_printing
gdb_rust_pretty_printing.register_printers(gdb)

end

Но замените $RUST_GDB_ETC на расположение каталога etc с файлами Python, например D:/devel/tools.Rust/rust/bin/rustlib/etc. Обратите внимание, даже если это путь Windows, убедитесь, что вы используете косую черту ('/') в качестве разделителя пути, чтобы избежать проблем с escape-символом в этом строковом литерале.

Чтобы убедиться, что это работает, запустите gdb. Если вы видите сообщение «---- Загрузка Rust pretty-printers ----» перед запросом и отсутствие ошибок Python после этого, значит, все должно работать. Для подтверждения введите команду info pretty-printer. В выводе должна быть строка с "rust_pretty_printer_lookup_function", если довольно-таки принтеры были загружены успешно.

Использование GDB в Eclipse с RustDT

Если вы успешно выполнили предыдущие шаги, вы почти готовы перейти к использованию GDB из RustDT. Несколько деталей:

  • Если используется TDM GDB, запускаемый исполняемый файл GDB должен быть с $TDM_ROOT/gdb64/bin/gdb.exe, а не с $TDM_ROOT/bin/gdb.exe или $TDM_ROOT/bin/gdb64.exe, потому что последние два являются оболочками для правильного исполняемого файла, и они не работают должным образом, когда RustDT / CDT запускает Процесс GDB.

  • Если вы используете RustDT 0.4.1 или выше, симпатичные принтеры будут настроены автоматически, если RustDT найдет их в ${RUST_ROOT}/lib/rustlib/etc. Вы можете убедиться, что это сработало, запустив запуск отладки, открыв соответствующую страницу консоли «gdb traces» в представлении консоли и выполнив поиск строки «Регистрация красивых принтеров Rust для Windows»:  Следы отладки RustDT GDB

  • Для версий RustDT до 0.4.1, чтобы включить симпатичные принтеры, вы должны настроить конфигурацию запуска для запуска файла gdbinit, который вы только что изменили в предыдущем разделе. По умолчанию gdbinit не запускается, когда GDB запускается с помощью RustDT / CDT, а только тот, который вы указали в конфигурации. Поэтому измените поле "Командный файл GDB" с .gdbinit на, например, D:\devel\tools\TDM-GDB\gdb64\bin\gdbinit:

Конфигурация запуска отладки RustDT

person BrunoMedeiros    schedule 06.11.2015
comment
По моему опыту, с rustdt + gdb в Windows слишком много ошибок, и включение красивой печати только ухудшает ситуацию. Во-первых, каждый Vec будет отображаться в виде строки, включая все его элементы, независимо от их количества. Во-вторых, я видел воспроизводимые зависания при выходе из функции. Я считаю, что сейчас лучше отключить красивую печать. Многие вещи не работают, но хоть не зависает. YMMV - person kirillkh; 03.04.2016
comment
Истинный. Об этом упоминалось в Руководстве пользователя: включение хороших принтеров может иногда вызывать замедление при отладке, если отображается представление «Переменные» и отображается значение неинициализированных переменных. А с красивыми принтерами могут быть и другие проблемы. - person BrunoMedeiros; 05.04.2016
comment
Хм, думаю, я изменю формулировку Руководства пользователя с замедления на длинные паузы / зависания, так как это более точно. - person BrunoMedeiros; 05.04.2016