Отладчик GDB
Отладчик GDB (GNU debugger) построчно выполняет код программы, чтобы выявить ошибки в процессе её выполнения. Отладчик GDB позволяет менять значения переменных, устанавливать контрольные точки и условия остановки запущенной программы.
С помощью отладчика GDB вы можете:
- задать условия, которые могут повлиять на поведение программы;
- начать выполнение программы с заданными условиями;
- указать условия, при наступлении которых выполнение программы будет остановлено;
- исследовать причины остановки программы;
- изменить код программы, чтобы устранить эффекты одной ошибки и продолжить выявление других.
Подготовка окружения и запуск отладчика
Установите пакеты ПО:
CentOS 7, AlmaLinux 9
CODEUbuntu 20.04, AstraLinux 1.7.4
CODEЗапустите BILLmanager.
Подключитесь к процесcу BILLmanager:
CODE
Отладочные символы
Отладка возможна, если сборка осуществлена с отладочными символами. Подробнее о сборке проекта см. статью Взаимодействие на низком уровне, плагины с++.
Чтобы проверить наличие отладочных символов, выполните:
Если в сборке присутствуют отладочные символы, то результат будет следующим:
Переменная окружения WITHOUT_DEBUG=yes отвечает за отсутствие отладочных символов при сборке модулей BILLmanager. Например, для модуля pmprivatbank при сборке без отладочных символов будет следующий результат:
Пример сборки с отключенными отладочными символами
Примеры
Примеры ниже составлены для ОС CentOS 7. В других ОС шаги или выводы могут отличаться.
Пример отладки подключаемой библиотеки
Создайте директорию /usr/local/mgr5/src/gdbtest/ со следующей структурой:
Структура директории
CODEСодержимое файла src/gdbtest/xml/billmgr_mod_gdbtest.xml
CODEСодержимое файла src/gdbtest/gdbtest.cpp
CODECODEСоберите и установите модуль командой:
CODEРезультат выполнения команды:
CODEПри сборке модуля BILLmanager будет остановлен.
Запустите BILLmanager.
CODEПодключитесь к BILLmanager:
CODEПри успешном подключении будет следующий вывод и приглашение для ввода команд (gdb):
CODEПроверьте, что отладочные символы для модуля подгрузились. Для этого выполните:
CODECODEДля отладки модуля:
Поставьте точку останова на 16 строку:
CODEПродолжите выполнение BILLmanager:
CODEОткройте второе окно терминала и вызовите функцию из модуля:
CODEВернитесь в окно терминала с отладчиком gdb, где программа достигла точки останова:
CODEВ точке останова вы можете посмотреть значение переменных следующей командой:
CODE
Пример отладки платёжного модуля
Для примера использован модуль pmprivatbank, представленный в пакетах разработчика billmanager-devel/billmanager-corporate-devel.
Вы можете адаптировать данный пример для разрабатываемых модулей обработки услуг.
Установите зависимости:
CODEСоберите и установите модуль:
CODEЗапустите отладчик gdb с указанием исполняемого файла:
CODEРезультат выполнения команды
CODEУстановите точку останова на нужном месте в исходном коде. Если ответ содержит "Make breakpoint pending on future shared library load?", отправьте "y".
CODEЗапустите исполняемый файл с требуемыми параметрами:
CODE
При успешном выполнении отладчик GDB остановится на строке 18 и будет ожидать ввода команд.
Пример отладки CGI-компонентов платёжного модуля
Для примера использован модуль pmprivatbank, представленный в пакетах разработчика billmanager-devel/billmanager-corporate-devel.
CGI-компоненты могут требовать дополнительные переменные окружения для своей работы:
- HTTP_COOKIE — содержит различные cookie, в том числе cookie с сессией пользователя;
- QUERY_STRING — содержит параметры запроса.
Установите зависимости:
CODEСоберите и установите модуль:
CODEЗапустите отладчик gdb с указанием исполняемого файла:
CODEУкажите переменные окружения внутри отладчика gdb, необходимые для работы модуля:
CODEУстановите точку останова на нужном месте в исходном коде. Если ответ содержит "Make breakpoint pending on future shared library load?", отправьте "y".
CODEЗапустите исполняемый файл:
CODE
При успешном выполнении отладчик GDB остановится на строке 29 и будет ожидать ввода команд. После остановки вы можете посмотреть:
backtrace:
CODEлистинг:
CODEзначение конкретной переменной:
CODE
Подробнее см. документацию GDB: The GNU Project Debugger.