Перейти к содержанию

GDB-сервер

GDB работает на компьютере, а программа — в микроконтроллере на плате. Чтобы отладчик мог остановить ядро, прочитать регистры и записать память, между ними ставят GDB-сервер: он принимает команды GDB по сети или последовательной линии и выполняет их на цели.

Обновлено Редакция GAW

GDB-сервер — программа-посредник, через которую отладчик GDB управляет удалённой целью: процессом на другом компьютере или ядром микроконтроллера на плате. GDB посылает серверу команды по протоколу GDB Remote Serial Protocol (RSP), сервер выполняет их на цели и отвечает. Для микроконтроллеров роль сервера играют OpenOCD, ST-LINK GDB server, SEGGER J-Link GDB Server и другие программы, которые знают отладочный адаптер и ядро; три таких сервера на выбор предлагает, например, STM32CubeIDE.

Как устроен протокол

По приложению E руководства GDB, каждая команда и ответ — пакет вида $данные#сс, где сс — две шестнадцатеричные цифры: сумма всех символов между $ и # по модулю 256. Получатель отвечает +, если пакет принят, или -, если его нужно повторить. На команды шага и продолжения ответ приходит не сразу, а когда цель снова остановилась — например, на точке останова или точке наблюдения. Сам протокол не зависит от транспорта: GDB и сервер общаются по последовательной линии или по TCP (разд. 20.3).

Подключение

GDB подключается к серверу одной командой (разд. 20.1):

КомандаЧто происходит
target remote host:портобычный режим: после выхода программы или detach GDB отключается, run не работает
target extended-remote host:портрасширенный режим: GDB остаётся подключённым, можно перезапустить программу и выполнять команды сервера
target remote /dev/ttyUSB0связь по последовательной линии, скорость задают --baud или set serial baud

С OpenOCD по умолчанию подключаются к порту 3333 командой target extended-remote localhost:3333; руководство OpenOCD называет расширенный протокол надмножеством обычного и рекомендует его. После подключения сервер отвечает на пакет qSupported и сообщает GDB размер пакета и карту памяти цели, поэтому команда load знает, какие области — флеш-память.

Команда monitor

Всё, что GDB не умеет сам, передают серверу через monitor: отладчик не разбирает текст, а отправляет его как есть. Типичный сеанс с OpenOCD: monitor reset halt — сброс и остановка ядра, load — запись секций из ELF-файла (о форматах — в статье о файлах прошивки), continue — запуск. Набор команд monitor у каждого сервера свой.

Руководство GDB предупреждает: у gdbserver нет встроенной защиты, а подключение даёт доступ к цели с правами пользователя, который его запустил. Отладочный сервер микроконтроллера тоже позволяет стереть флеш-память и выполнить любой код, поэтому его порт не открывают во внешнюю сеть.

Частые вопросы

Чем target remote отличается от target extended-remote?

По руководству GDB, в режиме remote отладчик отключается, как только программа завершилась или вы сделали detach, а команда run не поддерживается. В extended-remote GDB остаётся подключённым к серверу без работающей программы, может перезапустить её, подключиться к другой и выполнять команды monitor. OpenOCD называет extended-remote предпочтительным режимом.

Что такое команда monitor в GDB?

Способ передать команду самому серверу, минуя GDB. Отладчик не разбирает текст после monitor, а отправляет его серверу как есть. Так вызывают команды, которых в GDB нет: monitor reset halt в OpenOCD сбрасывает и останавливает ядро, monitor help выводит список команд сервера.

Безопасно ли оставлять GDB-сервер доступным по сети?

Нет. Руководство GDB прямо предупреждает, что у gdbserver нет встроенной защиты и подключение к нему даёт доступ к цели с правами пользователя, который запустил сервер. То же верно для отладочных серверов микроконтроллеров: через них можно стереть флеш-память и выполнить любой код. Держите порт закрытым для внешней сети.

Источники

  1. Free Software Foundation. Debugging with GDB, 20.1 Connecting to a Remote Target (GNU FDL) — разд. 20.1.1: два типа подключения — target remote и target extended-remote; в remote после выхода программы или detach GDB отключается, в extended-remote остаётся подключённым и может снова запустить программу, команда run поддерживается только в extended-remote; разд. 20.1.3: связь по последовательной линии (target remote serial-device, --baud) или по IP — target remote host:port, tcp:host:port; команда monitor cmd передаёт команду удалённому монитору
  2. Free Software Foundation. Debugging with GDB, 20.3 Using the gdbserver Program (GNU FDL) — gdbserver — управляющая программа для Unix-подобных систем, позволяет подключить программу к удалённому GDB через target remote или extended-remote без отладочной заглушки; GDB и gdbserver общаются по последовательной линии или TCP по стандартному GDB remote serial protocol; предупреждение: у gdbserver нет встроенной защиты, его нельзя открывать в публичную сеть
  3. Free Software Foundation. Debugging with GDB, E.1 Remote Protocol Overview (GNU FDL) — каждая команда и ответ — пакет $packet-data#checksum; контрольная сумма — две шестнадцатеричные цифры, сумма всех символов между $ и # по модулю 256; получатель отвечает + (принято) или − (повторить), подтверждения можно отключить; ответ на step и continue приходит только после остановки цели
  4. The OpenOCD Project. OpenOCD User's Guide for release 0.12.0+dev, 26 October 2026, гл. 7 и 20 — gdb port по умолчанию 3333; разд. 20.1: target extended-remote localhost:3333, расширенный протокол — надмножество обычного и предпочтителен; подключение через канал: target extended-remote | openocd -c «gdb port pipe»; разд. 20.2: monitor reset halt, load, continue; разд. 20.3: OpenOCD отвечает на пакет qSupported и передаёт GDB размер пакета и карту памяти

Нашли ошибку?