Модуль GDB Kate предоставляет простой интерфейс к любому отладчику, который поддерживает протокол DAP (Debugger Adapter Protocol). В частности, этот модуль обеспечивает работу с отладчиком GDB (GNU Project Debugger); подробное описание доступно здесь.
Важно
Перед началом работы с модулем настоятельно рекомендуется ознакомиться с GDB. Более подробные сведения об использовании GDB доступны на веб-сайте GDB.
Модуль GDB подключается в разделе «Модули» диалога настройки Kate.
Подсказка
При компиляции с помощью gcc/g++ рекомендуется использовать аргумент командной строки -ggdb.
Когда всё будет подготовлено, откройте исходный файл в Kate, выберите «профиль отладчика», введите путь к исполняемому файлу на вкладке Параметры панели Отладка и для запуска отладки выберите в меню → .
«Профиль отладчика» позволяет указать сервер DAP, который будет использоваться (например, GDB), и способ запуска этого сервера. Как правило, сервер запускает процесс в соответствии с приведённым выше описанием, но также возможно подключить сервер к уже запущенному процессу (в этом случае потребуется указать идентификатор процесса, а не исполняемый файл). Могут быть доступны и другие режимы, специфичные для языка и сервера DAP. Дополнительные сведения об этом и соответствующие подробности настройки приводятся далее.
Все эти функции доступны в меню Kate, и большинство из них доступно также на панели «Отладка».
- → →
Отображает панель, содержащую вывод GDB, используемую командную строку GDB и другие параметры.
- → →
Показывает список всех загруженных в данный момент переменных и их значений и обратную трассировку GDB.
- →
Открывает вложенное меню, состоящее из списка целей (исполняемых программ).
- →
Запускает GDB с заданной целью.
- →
Останавливает GDB.
- →
Перезапускает GDB.
- →
Устанавливает точку останова в текущей позиции курсора.
- →
Выполняет текущую инструкцию (вызов функции будет отлажен).
- →
Выполняет текущую инструкцию (вызов функции не будет отлажен).
- →
Продолжает выполнение, пока выполняемая программа не завершится.
- →
Перемещает программный счётчик (следующее выполнение).
- →
Выполняет программу, пока она не дойдёт до текущей позиции курсора.
- →
Игнорирует точки останова и выполняет программу, пока она не завершится (успешно или нет).
- →
Отображает значение переменной, на которую в данный момент указывает курсор.
- → →
Отображает панель инструментов отладки.
Панель Отладка состоит из нескольких вкладок:
- Вывод GDB
Содержит вывод из GDB и командную строку GDB.
- Параметры
- Исполняемый файл
Путь к исполняемому файлу для отладки.
- Рабочий каталог
Текущий рабочий каталог, относящийся к цели.
- Аргументы
Аргументы для программы.
- Удерживать фокус
Удерживать фокус в командной строке GDB.
- Перенаправлять ввод и вывод
Открывает на панели Отладка новую вкладку Ввод и вывод, в которой доступны просмотр вывода выполняемой программы и возможность ввода в неё.
- Ввод и вывод
Содержит область, в которой отображается вывод из выполняемой программы, и командную строку, которая обеспечивает возможность ввода в неё.
Боковая панель Стек содержит список отформатированного стека вызовов, возвращённого из GDB.
Боковая панель Локальные переменные состоит из списка всех загруженных в данный момент переменных из программы и соответствующих значений.
Благодарим участника «Google Code-In 2011» Martin Gergov за большой вклад в написание данного раздела.
На странице настройки модуля доступны для выбора «профили отладчика». Там показана стандартная конфигурация (JSON), её можно «перезаписать» заданной пользователем в подобной форме. Пример:
{
"dap": {
"debugpy": {
"url": "https://github.com/microsoft/debugpy",
"run": {
"command": ["python", "-m", "debugpy", "--listen", "${#run.port}", "--wait-for-client"],
"port": 0,
"supportsSourceRequest": false
},
"configurations": {
"launch": {
"commandArgs": ["${file}", "${args|list}"],
"request": {
"command": "attach",
"stopOnEntry": true,
"redirectOutput": true
}
},
"attach": {
"commandArgs": ["--pid", "${pid}"],
"request": {
"command": "attach",
"stopOnEntry": true,
"redirectOutput": true
}
},
},
"gdb": {
"url": "gdb",
"run": {
"command": [
"gdb",
"-i",
"dap"
],
"redirectStderr": true,
"redirectStdout": true,
"supportsSourceRequest": true
},
"configurations": {
"launch (debug)": {
"request": {
"command": "launch",
"mode": "debug",
"program": "${file}",
"args": "${args|list}",
"cwd": "${workdir}"
}
}
}
}
}
}
Каждая из записей в configurations сочетается с данными run и формирует «профиль». В этом случае указывается сервер DAP с аргументами, где аргументы являются специфичными для профиля (commandArgs). Другие части указывают запрос протокола DAP (launch или attach), а также специфичные для DAP расширения.
Конечно, указанный сервер должен быть установлен (и обычно в один из каталогов в PATH для правильного запуска).
Применяются различные этапы переопределения и слияния; пользовательская конфигурация (загруженная из файла) переопределяет (внутреннюю) конфигурацию по умолчанию и, в свою очередь, перезаписывается параметрами записи «dap» в конфигурации проекта .kateproject.
Подробные сведения доступны в разделе Среда выполнения клиента LSP ниже. Здесь же достаточно упомянуть о том, что может потребоваться запустить процесс для диагностики (и сервер DAP) в «специальной среде», которая может определяться просто переменными среды или же каким-либо контейнером (при наличии необходимых зависимостей и условий для корректного выполнения).
Аналогично примеру в упомянутом разделе, следующая конфигурация может быть задана в .kateproject.
{
// это также может быть массив объектов
"exec": {
"hostname": "foobar"
// команда также может быть массивом строк
"prefix": "podman exec -i foobarcontainer",
"mapRemoteRoot": true,
"pathMappings": [
// возможна любая из следующих форм
// также существует более автоматизированная альтернатива, подробнее о ней в указанном разделе
[ "/dir/on/host", "/mounted/in/container" ]
{ "localRoot": "/local/dir", "remoteRoot": "/remote/dir" }
]
},
"dap": {
"debugpy": {
"run": {
// в этом разделе это применимо ко всем конфигурациям
// это устанавливает соответствие или выполняет объединение для объекта выше
"exec": { "hostname": "foobar" },
// если соединение с сервером установлено,
// можно дополнительно указать в явном виде порт (для публикации/перенаправления)
"port": 5678,
// сервер также можно настроить на приём дополнительных узлов, не только localhost
"host": "0.0.0.0"
}
}
}
}
Подробные сведения приводятся в упомянутом разделе, но, по сути, префикс prefix предваряет командную строку сервера DAP, указанную в другом месте. В результате сервер запускается в указанном контейнере, а потом, в свою очередь, также и запущенный процесс. pathMapping обеспечивает преобразование путей к файлам между представлением редактора и представлением сервера DAP (контейнера), например, при работе с установкой точек останова или обработке представленной обратной трассировки. Обратите внимание, что такое сопоставление опционально и может быть или не быть полезным. При работе с кодом C/C++, который компилируется в основной системе, символьная информация ссылается на исходные файлы в основной системе, которых вообще не существует в другой среде. Однако в других определённых сценарием (например, python) обстоятельствах ссылка идёт на фактические файлы времени выполнения (в другой среде).
Следует помнить про указанное далее:
Сервер DAP должен присутствовать в среде/контейнере и быть настроен для поддержки корректной работы отладчика (следовательно, если нужно, привилегированно, с необходимыми возможностями).
Редактор и DAP должны иметь возможность обмениваться данными. Если используется контейнер, последний должен либо использовать соединение с сетью основной системы, либо предоставлять подходящий связанный или опубликованный порт вместе с соответствующим фрагментом конфигурации — как в примере выше (так как автоматически выбранный при порте 0 не будет работать).
Указанный исполняемый файл или идентификатор процесса должен быть в перспективе «контейнера», как и любые аргументы (отлаживаемый исполняемый файл).
Кроме того, как и в случае с LSP, некоторые переменные среды уже заданы; KATE_EXEC_PLUGIN установлена в значение dap, KATE_EXEC_SERVER — в значение типа отладчика или языка (например, python), а KATE_EXEC_PROFILE — в значение записи конфигурации (например, launch).




