Сосредоточьтесь на том, что важно
Rust — отличный язык по многим причинам: безопасность, производительность и инструменты. Тем не менее, отладка, пожалуй, до сих пор остается одним из самых слабых мест. Как ни странно, результаты Rust debugging survey 2026 results показывают, что большинство (53,2%) пользователей Rust вообще не пользуются отладчиком. Многие разработчики на Rust (81,3%) говорят, что вывод в консоль проще и быстрее. Настройка также является еще одной проблемой: многие пользователи считают настройку отладчика сложной, и эту функцию нельзя назвать дружелюбной к новичкам. Особенно когда дело касается асинхронности (28,1%) и макросов (23,0%), функции пошаговой отладки в большинстве случаев дают сбой.
Тем не менее, ситуация все же лучше, чем в 2021 году, когда опрос проводился впервые. Количество пользователей, использующих отладчик, выросло с 36% до 46.8%!
Это заставило меня задуматься: каков сегодня опыт отладки в Rust? Поэтому давайте погрузимся в доступные методы и инструменты, а также в то, как они используются на практике.
Сценарий
Мы будем использовать алгоритм Грэхема в качестве примера. Алгоритм вычисляет выпуклую оболочку для набора точек на плоскости: наименьшую выпуклую фигуру, охватывающую каждую точку. По сути, это можно представить как натягивание канцелярской резинки вокруг набора гвоздей.
🐀: Здесь я создал TUI с помощью Ratatui, чтобы визуализировать алгоритм и ошибку:
🐀: Здесь я создал TUI с помощью , чтобы визуализировать алгоритм и ошибку:
Исходный код доступен на GitHub.
Вы можете видеть, что алгоритм не охватывает точку P2: построенная граница окрашена в красный цвет, в то время как ожидаемая — в зеленый. Теперь давайте пройдемся по доступным методам отладки, чтобы исправить это!
1. println!, dbg! или tracing
У нас уже есть падающий модульный тест, поэтому мы можем использовать его в качестве цикла отладки. Просто добавьте инструкции println! или dbg! в код и запускайте тест, пока не найдем ошибку.
Здесь мы выводим промежуточный порядок сортировки, перезапускаем падающий тест и видим, что точки с одинаковым полярным углом упорядочены по принципу «сначала самые дальние». Изменение порядка сравнения расстояний исправляет сортировку, и следующий запуск теста проходит успешно.
Это наиболее распространенный способ отладки в Rust, и он хорошо работает для небольших программ. Однако вы видите проблему: это итеративный и утомительный процесс. Вам нужно перекомпилировать и запускать программу каждый раз, что требует времени. Это также не идеально для больших проектов. Тем не менее, это работает!
🐀: Что еще?
🐀: Что еще?
2. rust-gdb или rust-lldb в терминале
Мы можем проверить тот же падающий тест без изменения исходного кода с помощью rust-lldb или rust-gdb:
Оттуда мы устанавливаем точки останова, запускаем только падающий тест и проверяем текущий кадр:
В точке останова переменная a находится на расстоянии 36 квадратных единиц от опорной точки, а b — всего на 4. В компараторе используется b.cmp(a), поэтому точки с одинаковым полярным углом сортируются в обратном порядке расстояний. В этом и заключается ошибка: более дальняя точка обрабатывается первой и впоследствии удаляется из оболочки.
Итак, давайте применим исправление:
Мы также можем использовать TUI для визуализации:
🐀: Ура, теперь канцелярская резинка натянута на все точки.
🐀: Ура, теперь канцелярская резинка натянута на все точки.
В отличие от отладки с помощью вывода, это позволяет нам исследовать больше состояний без редактирования и перекомпиляции программы после каждого вопроса. Обратной стороной является ручной рабочий процесс: необходимость настраивать полезные точки останова и знание того, какие команды отладчика выполнять.
🐀: Хорошо, но есть ли более удобный способ отладки?
🐀: Хорошо, но есть ли более удобный способ отладки?
3. Отладчик в RustRover
RustRover — это кроссплатформенная IDE от JetBrains, созданная специально для Rust. Она объединяет проекты Cargo, тесты, анализ кода и отладку в одном месте (и она бесплатна для некоммерческого использования!).
Рекомендуемый способ установки — через JetBrains Toolbox App, который также управляет обновлениями и позволяет переключаться между стабильными версиями и версиями раннего доступа (EAP).
RustRover предоставляет графический интерфейс для GDB и LLDB, что означает возможность использовать тот же рабочий процесс, что и раньше, но с более удобным интерфейсом. Нажмите на поля строки (gutter), чтобы установить точку останова, а затем нажмите значок отладки рядом с падающим тестом.
В документации по отладчику RustRover более подробно описаны пользовательские конфигурации, пошаговое выполнение, области просмотра (watches) и вычисление выражений!
🐀: Интересно… Я думал, что отладчики такого типа доступны только для более зрелых языков, таких как Python или Java. Как это работает «под капотом»?
🐀: Интересно… Я думал, что отладчики такого типа доступны только для более зрелых языков, таких как Python или Java. Как это работает «под капотом»?
Хороший вопрос! На самом деле за отладчиком скрывается интересный механизм, специфичный для Rust. В моем эпизоде «Rust in Production» с Маттиасом Эндлером я объяснял, как RustRover преобразует исходный код в собственное PSI-представление (Program Structure Interface), затем в типизированное высокоуровневое представление и, наконец, в MIR. Когда мы вычисляем выражение на Rust или вызываем функцию во время сеанса отладки, RustRover транслирует его в MIR и отправляет отладчику для выполнения в контексте приостановленного процесса.
🐀: То есть отладчик действительно понимает выражение на Rust, которое мы просим его вычислить! Потрясающе.
🐀: То есть отладчик действительно понимает выражение на Rust, которое мы просим его вычислить! Потрясающе.
Бонус: отладка с помощью ИИ
В последнее время мы стали встречать префикс «на базе ИИ» во многих вещах… программирование, письмо, заказ еды и т. д., и я подумал, почему бы не попробовать применить его и для отладки?
🐀: То есть просто попросить агента исправить ошибку за нас?
🐀: То, есть просто попросить агента исправить ошибку за нас?
Не совсем. Агент не заменяет отладчик, но он может помочь нам понять проблему и предложить исправления. Вместо этого мы попросим агента отладить проблему и понаблюдаем за его работой в отладчике RustRover!
Начиная с версии RustRover 2026.3, встроенный MCP-сервер ( Model Context Protocol ) в IDE может предоставить отладчик таким агентам, как Codex и Claude Code. Это означает, что вместо того, чтобы щелкать мышкой вручную, агент может запустить сеанс отладки, установить точки останова, выполнять программу по шагам, читать переменные и вычислять выражения за нас. Ознакомьтесь с обзором главных новинок в RustRover 2026.3 для получения полной информации о релизе!
Начиная с версии RustRover 2026.3, встроенный MCP-сервер ( Model Context Protocol ) в IDE может предоставить отладчик таким агентам, как Codex и Claude Code. Это означает, что вместо того, чтобы щелкать мышкой вручную, агент может запустить сеанс отладки, установить точки останова, выполнять программу по шагам, читать переменные и вычислять выражения за нас. Ознакомьтесь с обзором главных новинок в RustRover 2026.3 для получения полной информации о релизе!
Просто откройте Настройки (Settings) → Инструменты (Tools) → MCP-сервер (MCP Server), включите сервер и нажмите кнопку «Автоконфигурация» (Auto-Configure) рядом с вашим агентом. После этого перезапустите агента, и все готово!
Также ознакомьтесь с документацией по агентной отладке для получения дополнительной информации.
Как только MCP подключен, мы можем дать агенту задачу вроде этой: «Отладить и исправить эту проблему с помощью MCP RustRover».
Результат:
🐀: О круто, ты запускаешь Codex внутри RustRover с новым плагином Air, и мы можем наблюдать, как он запускает падающий тест, устанавливает точки останова, проверяет значения во время выполнения и исправляет ошибку!
🐀: О круто, ты запускаешь Codex внутри RustRover с новым плагином Air, и мы можем наблюдать, как он запускает падающий тест, устанавливает точки останова, проверяет значения во время выполнения и исправляет баг!
Заключение
Отладка в Rust — это не какой-то один рабочий процесс. Вы можете использовать println!, rust-lldb, RustRover или даже отладчик с поддержкой ИИ. У каждого варианта есть свои плюсы и минусы, и каждый подходит для определенных сценариев.
🐀: Просто выберите инструмент, который вам подходит!
🐀: Просто выберите инструмент, который вам подходит!
Если вы хотите посмотреть на это в действии, посмотрите видеоверсию этой статьи, записанную на Rust Berlin Meetup:
Удачи! 🧀









