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

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

Ответы

Ответ 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, таких как перечисления, фрагменты и векторы. С помощью симпатичных принтеров переменные этого типа будут отображаться структурированным способом, а не низкоуровневым представлением. Для получения дополнительной информации см. https://michaelwoerister.github.io/2015/03/27/rust-xxdb.html.

Симпатичные принтеры включены только в дистрибутивы Linux (и Mac OS?) Rust, а не в 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, убедитесь, что в качестве разделителя пути вы используете функцию "вперед-вниз" ('/'), чтобы избежать проблем с побегами в этом строковом литерале.

Чтобы проверить это, запустите 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 pretty-printers for Windows": RustDT трассировки отладки GDB

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

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