Документация
ОС Аврора 5.1.5

Отладчик GDB

Назначение отладчика GDB — позволить увидеть, что происходит в программе во время её выполнения, или что делала программа в момент падения.

Чтобы помочь выявить ошибку, GDB может выполнять действия четырёх основных типов:

  • начать выполнение программы, задав все, что может повлиять на её поведение;
  • остановить программу при указанных условиях;
  • исследовать, что случилось, когда программа остановилась;
  • изменить программу так, что можно будет экспериментировать с устранением эффектов одной ошибки и продолжить выявление других.

Можно использовать GDB для отладки программ, написанных на С и С++.

Отладчик GDB в ОС Аврора

Для отладки приложений с изоляцией необходимо подключить GDB к приложению по номеру процесса, например, через консоль или переконфигурацию gdb из Аврора IDE. При запуске приложений из Аврора IDE с конфигурацией по умолчанию отладчик GDB не будет работать, так как не будет запущена утилита sailjail, необходимая для отладки.

Чтобы включить отладку из среды разработки, следующие дополнительные пакеты должны быть установлены на устройство: gdb, gdb-gdbserver и qt5-qtdeclarative-plugin-qmlinspector. Их можно установить из командной строки устройства с помощью следующей команды:

pkcon install gdb gdb-gdbserver qt5-qtdeclarative-plugin-qmlinspector

Отладчик GDB на эмуляторе или устройстве можно запустить через терминал.

Можно вызывать GDB путем запуска программы gdb. Начав работу, GDB считывает команды с терминала до тех пор, пока не будет указана команда выхода.

На эмуляторе можно запустить отладку следующей командой:

gdb /usr/bin/my-app

Если требуется подключиться к уже запущенному процессу, к команде нужно добавить ID процесса:

gdb /usr/bin/my-app 1111

Идентификатор процесса контейнера sailjail можно узнать с помощью команды ps, например:

ps ax

Чтобы выйти из GDB, можно использовать команду quit (сокращённо q):

(gdb) quit

Или можно нажать комбинацию клавиш «Ctrl + D».

Основная функциональность

Взаимодействие с отладчиком происходит с помощью команд. Для запуска команды следует ввести её основное или сокращённое название в интерфейс отладчика. Сокращённое название указано в скобках.

Основные команды:

  • run (r) начинает исполнение программы до первой точки останова или возникновения ошибки;
  • continue (c) продолжает выполнение программы до следующей точки останова или возникновения ошибки;
  • step (s) продолжает выполнение программы, пока оно не дойдёт до следующей строки исходного кода. При этом происходит вход в функцию, т. е. при вызове каждой функции программа также останавливается.
  • next (n) работает аналогично команде step, но при этом функции вызываются без остановки;
  • finish продолжает выполнение программы до возврата из текущей функции и печатает возвращаемое значение.

Командам step и next можно передать числовой параметр, который будет означать выполнение команды заданное число раз.

Точки останова

В произвольном месте программы можно поставить точку, при достижении которой команда остановится. При этом можно исследовать значения переменных, продолжить выполнение программы при помощи команд c, s, n или выполнить другие команды GDB.

  • break n (b) устанавливает точку останова на строке исходного кода с номером n. Все точки останова имеют свои номера, определяемые при их установке.
  • break function устанавливает точку останова на функции function. Исполнение программы остановится при вызове этой функции. Распространённый пример: вызвать break main для того, чтобы можно было пошагово исполнять программу с самого начала.
  • clear n удаляет точку останова в строке с номером n.
  • delete диапазон (d) удаляет точки останова с номерами из указанного диапазона. Например, delete 1-5 или delete 4. Если диапазон не задан, удаляются все точки останова.

Просмотр исходного кода и стека программы

Для вывода исходного текста программы используется команда list (l):

  • list n выводит строки исходного кода вокруг строки с номером n.

Работа с кадром стека:

  • where выводит содержимое стека;
  • frame n переключается в кадр с номером n;
  • info locals выводит информацию о всех локальных переменных текущего кадра.

Исследование выражений

Для исследования данных обычно используется команда print (p) или её синоним inspect.

  • print выражение вычисляет и выводит значение выражения, записанного на том же языке, что и программа.

Команда print и многие другие команды GDB допускают в качестве параметра выражение и вычисляют его значение. В выражении GDB допустимо использование любого типа констант, переменных или операторов, определённых в используемом языке программирования, включая условные выражения, вызовы функций, приведение типов и строковые постоянные. Исключением являются символы, определённые командами препроцессора #define.

GDB поддерживает константы-массивы в выражениях, введённых пользователем. Синтаксис: {элемент, элемент...}. Например, можно использовать команду print {1, 2, 3}, чтобы создать в памяти массив, который будет доступен в программе так же, как выделенный функцией malloc.

Форматы вывода

По умолчанию GDB печатает значение в соответствии с его типом. Это не всегда отвечает желанию разработчика. Например, требуется вывести число в шестнадцатеричной записи, или указатель в десятичной. Или требуется просмотреть данные по некоторому адресу в памяти в виде строки символов или в виде инструкций. Для этого при выводе значения следует указать формат вывода.

Простейшим применением форматов вывода является форматирование вывода уже вычисленного выражения. Это осуществляется путём начала параметров команды print с косой черты и символа формата. Поддерживаются следующие символы формата:

  • x — рассматривать биты значения как целое, и вывести целое в шестнадцатеричном виде;
  • d — вывести как десятичное целое со знаком;
  • u — вывести как десятичное целое без знака;
  • o — вывести как восьмеричное целое;
  • t — вывести как целое в двоичном виде. Буква t означает "two";
  • a — вывести в виде адреса, как абсолютного в шестнадцатеричной записи, так и в виде смещения от ближайшего предшествующего символа. Можно использовать этот формат для того, чтобы определить, где (в какой функции) расположен какой-либо неизвестный адрес:
(gdb) p/a 0x54320
$3 = 0x54320 <_initialize_vx+396>
  • c — рассматривать как целое и вывести в виде строковой постоянной;
  • f — рассматривать биты значения как число с плавающей точкой и вывести с использованием обычного синтаксиса для чисел с плавающей точкой.

Например, чтобы вывести счётчик программы в шестнадцатеричном виде, следует ввести:

p/x $pc

Следует обратить внимание, что перед косой чертой не требуется пробел, потому что имена команд в GDB не могут содержать косую черту.

Чтобы вывести последнее значение из истории значений в другом формате, можно воспользоваться командой print с указанием только формата без выражения. Например, p/x выведет последнее значение в шестнадцатеричной форме.

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.