Модуль GDB

Martin Gergov

T.C. Hollingsworth

Введение

Модуль 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».

Вкладка Вывод 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).