Gdb linux что это такое

Команда GDB в Linux с примерами

GDB — это аббревиатура отладчика GNU. Этот инструмент помогает отлаживать программы, написанные на C, C ++, Ada, Fortran и т. Д. Консоль можно открыть с помощью команды gdb на терминале.

Синтаксис:

gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir] [prog[core|procID]]

Пример:

Отлаживаемая программа должна быть скомпилирована с опцией -g . Ниже приведен файл C ++, который сохраняется как gfg.cpp . Мы собираемся использовать этот файл в этой статье.

#include
#include
#include

using namespace std;

int findSquare( int a)

int main( int n, char ** args)

for ( int i = 1; i

int a = atoi (args[i]);

Скомпилируйте вышеуказанную программу на C ++ с помощью команды:

Чтобы запустить отладчик вышеуказанного исполняемого файла gfg , введите команду gdb gfg . Открывает консоль gdb текущей программы после печати информации о версии.

    run [args]: эта команда запускает текущий исполняемый файл. На изображении ниже программа была выполнена дважды, один с аргументом командной строки 10, а другой с аргументом командной строки 1, и их соответствующие выходные данные были напечатаны.

  • quit или q: чтобы выйти из консоли gdb, можно использовать quit или q .
  • help: запускает руководство по gdb вместе со всем списком классов отдельных команд.
  • break: команда break [имя функции] помогает приостановить программу во время выполнения, когда она начинает выполнять функцию. Это помогает отлаживать программу на этом этапе. Несколько точек останова можно вставить, выполнив команду там, где это необходимо. b Команда findSquare заставляет исполняемый файл gfg приостанавливаться, когда отладчик начинает выполнять функцию findSquare.

    В приведенном выше примере программа, которая выполнялась ( запуск 10 100 ), приостановилась, когда обнаружила вызов функции findSquare. Программа останавливается всякий раз, когда вызывается функция. После успешного выполнения команды она печатает номер точки останова, информацию о счетчике программы, имя файла и номер строки. Поскольку он встречает любую точку останова во время выполнения, он печатает номер точки останова, имя функции со значениями аргументов, именем файла и номером строки. Точка останова может быть установлена либо с помощью адреса инструкции (в шестнадцатеричной форме с предшествующим * 0x), либо с помощью номера строки, и ее можно комбинировать с условием if (если условие не выполняется, точка останова не будет установлена). Например, break findSquare, если == 10 .

    continue: эта команда помогает возобновить текущий исполняемый файл после его приостановки точкой останова. Он выполняет программу до тех пор, пока не встретит какую-либо точку останова, не запустит ошибку времени или конец программы. Если в аргументе есть целое число (счетчик повторов), он будет считать его счетчиком продолжения и повторить команду продолжения «счетчик повторений» несколько раз.

    next или n: эта команда помогает выполнить следующую инструкцию после того, как она встретит точку останова.

    Всякий раз, когда он встречает вышеупомянутую команду, он выполняет следующую инструкцию исполняемого файла, печатая строку при исполнении.

    delete: эта команда помогает удалить точки останова и контрольные точки. Если команда удаления выполняется без каких-либо аргументов, она удаляет все точки останова без изменения каких-либо контрольных точек. Аналогичным образом, если контрольная точка родительского процесса удаляется, все дочерние контрольные точки автоматически удаляются.

    В приведенном выше примере были определены две точки останова, одна на главной, а другая на findSquare. С помощью вышеуказанной команды точка останова findSquare была удалена. Если после команды нет аргумента, команда удаляет все точки останова.

    clear: Эта команда удаляет точку останова, которая находится в определенной функции с именем FUNCTION_NAME. Если аргумент является числом, то он удаляет точку останова, которая находится в этой конкретной строке.

    В приведенном выше примере после выполнения команды очистки точка останова удаляется после печати номера точки останова.

  • отключить [точку останова № 1] [точку останова № 2]…. Вместо того , чтобы удалить или сняв контрольные точки, они могут быть отключены и могут быть включены , когда они необходимы.
  • включить [точка останова № 1] [точка останова № 2]…. : Для включения отключенных точек останова используется эта команда.
  • info: Когда информация о контрольных точках вызывается, будет отображаться номер, тип, отображение, статус, адрес, местоположение точки останова. Если указан номер точки останова, будет отображаться только информация об этой конкретной точке останова. Точно так же, когда вызываются информационные контрольные точки, отображаются номер контрольной точки, идентификатор процесса, счетчик программ, имя файла и номер строки.
    Читайте также:  Как выглядит рабочий стол mac os

    Команда checkpoint и команда перезапуска : Эти команды создают новый процесс и поддерживают этот процесс в режиме ожидания и выводят идентификатор процесса созданного процесса.

    Например , в приведенном выше выполнении точка останова сохраняется в функции findSquare, и программа выполнялась с аргументами «1 10 100». Когда функция вызывается изначально с a = 1 , возникает точка останова. Теперь мы создаем контрольную точку и, следовательно, gdb возвращает идентификатор процесса (4272), сохраняет его в режиме ожидания и возобновляет исходный поток после вызова команды continue. Теперь точка останова происходит с a = 10, и создается другая контрольная точка (pid = 4278). Из информации контрольной точки информации, звездочка упоминает процесс, который будет запущен, если GDB встретит продолжение. Чтобы возобновить определенный процесс, используется команда перезапуска с аргументом, который указывает серийный номер процесса. Если весь процесс завершен, команда info checkpoint ничего не возвращает.

    set args [arg1] [arg2]…: эта команда создает список аргументов и передает указанные аргументы в качестве аргументов командной строки всякий раз, когда вызывается команда run без каких-либо аргументов. Если команда run выполняется с аргументами после заданных аргументов , аргументы обновляются. Всякий раз, когда команда запуска выполняется без аргументов, аргументы устанавливаются по умолчанию.

    show args: show args печатает аргументы по умолчанию, которые будут переданы при выполнении команды run . Если с аргументамивыполняется либо команда set args, либо команда run, аргументы по умолчанию будут обновлены, и их можно просмотреть с помощью приведенной выше команды show args .

    display [/ спецификатор формата] [expression] и отменить отображение [display id1] [display id2]…: Эта команда позволяет автоматически отображать выражения каждый раз, когда при выполнении встречается точка останова или команда n . Команда undisplay используется для удаления отображаемых выражений. Допустимые спецификаторы формата:

    В приведенном выше примере точка останова устанавливается в строке 12 и запускается с аргументами 1 10 100. Как только точка останова обнаружена, выполняется команда отображения, чтобы вывести значение i в шестнадцатеричной форме и значение args [i] в строке сформироваться. После этого, всякий раз, когда встречается команда n или точка останова, значения отображаются снова, пока они не будут отключены с помощью команды undisplay .

    print: эта команда печатает значение данного выражения. Команда display печатает все ранее отображенные значения всякий раз, когда встречается точка останова или следующая команда, тогда как команда print сохраняет все ранее отображенные значения и печатает каждый раз, когда она вызывается.

    file: консоль gdb может быть открыта с помощью команды gdb . Для отладки исполняемых файлов из консоли используется команда file [исполняемое имя файла] .

    Источник

    Краткий гайд по использованию GDB

    В этом коротком туториале мы рассмотрим базовые приёмы работы с GDB, а также посмотрим как можно (и нужно) подготавливать файлы к отладке для GDB.

    GDB — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран, Python3, Swift, NASM и Rust.

    Почему именно GDB? Всё легко, он уже установлен на многих UNIX-подобных системах, лёгок в использовании и поддерживает много языков. Работа с ним оказывается очень лёгкой, а также его можно подключить к VSCode и другим редакторам кода (Включая Vim, NeoVim (ясное дело), Emacs, Atom и далее)

    Подготовка файлов

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

    Для того чтобы нам пройтись по такому файлу нам нужно скомпилировать его с помощью G++ с использованием флага -g (это действительно важно, без этого флага, программа не будет корректно работать в GDB).

    Python-файл вы можете продебажить с помощью этой команды:

    Для Java вы просто можете использовать jdb, который уже идёт в комплекте c JDK.

    Также, если вам не хочется компилировать всё ручками, вы можете просто использовать сайт OnlineGDB, там просто нужно вставить код и нажать debug, а затем внизу откроется консоль, где вы сможете писать команды.

    Использование GDB

    Как только мы зашли в GDB нам выводится следующее сообщение:

    Последняя строка говорит о том, нормально ли запустился файл.

    Теперь нужно посмотреть, где в нашем файле точка вхождения (строка, откуда наша программа начинает свою работу), в случае cpp это метод main() . Находим номер этой строки c помощью команды list и пишем её порядковый номер с буквой b (также можно просто указать имя функции b main тоже работает):

    Далее запускаем программу с помощью комманды r :

    Также вы можете включить TUI, с помощью комбинации клавиш

    Для того, чтобы посмотреть на какой мы сейчас строке, нужно написать f :

    Для того, чтобы сделать шаг, нужно нажать n (от слова next):

    Как мы видим GDB сразу пропускает пустые строки (или строки с комментариями) и переходит к следующей строке.
    Предположим, что у нас есть функция, при нажатии n наш отладчик быстро пройдет функцию, не заходя в неё, чтобы зайти в функцию нужно сделать «шаг внутрь» (step-in) или просто клавиша s :

    Читайте также:  Windows doors facades dubai

    (В примере нет функции, однако шаг step-in все равно будет работать и с обычными инициализациями, условиями и циклами)

    Чтобы узнать какие переменные (локальные) сейчас инициализированны в программе нужно написать комманду info locals :

    Чтобы вывести только одну переменную, нужно написать print имя_переменной :

    Мы можем также изменить переменную с помощью set :

    Мы можем также следить за переменными с помощью watch :

    Также, если нужно можно посмотреть что в данный момент находится в регистрах ( info registers ):

    Чтобы посмотреть какие в данный момент есть breakpoints (точки останова) нужно написать info breakpoints :

    Чтобы удалить точку останова del breakpoint_num :

    Чтобы прыгнуть к следующей точке останова нужно нажать c :

    Мы можем вызывать функции из программы (локальные) с помощью call :

    Чтобы продолжить выполнение функции и остановить программу когда она (функция) завершится нужно написать finish или fin :

    Стоит уточнить, что нельзя использовать finish в главном методе.

    Чтобы завершить выполнение программы, нужно написать kill :

    Также можно написать help в любой момент и получить краткую справку, как пользоваться отладчиком

    Источник

    Как пользоваться gdb

    Программа gdb — это популярный отладчик для программ, написанных на языке программирования Си и С++. Отладчик позволяет выполнить программу пошагово, посмотреть значения всех переменных на каждом из этапов выполнения, а если это необходимо, то и дизассемблировать код и посмотреть состояние регистров процессора.

    В сегодняшней статье мы рассмотрим как пользоваться gdb для отладки и анализа выполнения программ, написанных на Си. Попытаемся разобраться с основными возможностями программы.

    Как пользоваться gdb

    1. Установка gdb

    Обычно, отладчик устанавливается вместе с другими инструментами для сборки программного обеспечения. Для установки всего необходимого в Ubuntu или Debian достаточно выполнить:

    sudo apt install build-essential

    Для того чтобы установить отладчик отдельно, выполните:

    sudo apt install gdb

    В CentOS или Fedora команда установки будет выглядеть следующим образом:

    sudo dnf install gdb

    А для Arch Linux надо выполнить:

    sudo pacman -S gdb

    Теперь отладчик gdb установлен и вы можете его использовать.

    2. Компиляция программы

    Для того чтобы получить максимум полезной информации во время отладки, например, имена переменных и номера строк кода программу следует скомпилировать особым образом. Для примеров из этой статьи мы будем использовать такую небольшую программу на Си, в процессе будем её изменять, но начнём с этого:

    #include
    int main() <
    int var1 = 0;
    int var2 = 2;
    char greeting[] = «Hello from losst\n»;
    printf(«%s», greeting);
    >

    Для того чтобы всё необходимое было включено в исполняемый файл, программу надо собрать с опцией -g. В данном случае команда будет выглядеть вот так:

    gcc -g -o program program.c

    Затем вы можете её выполнить:

    3. Запуск отладчика

    Для того чтобы запустить программу достаточно передать путь к ней отладчику. Какие-либо опции указывать не обязательно:

    После запуска отладчика вы попадаете в его командный интерфейс. Программа ещё не запущена, запущен только отладчик, в котором вы можете ею управлять с помощью специальных команд. Вот основные команды gdb:

    • break или b — создание точки останова;
    • info или i — вывести информацию, доступные значения: break, registers, frame, locals, args;
    • run или r — запустить программу;
    • continue или c — продолжить выполнение программы после точки останова;
    • step или s — выполнить следующую строчку программы с заходом в функцию;
    • next или n — выполнить следующую строчку без захода в функцию;
    • print или p — вывести значение переменной;
    • backtrace или bt — вывести стек вызовов;
    • x — просмотр содержимого памяти по адресу;
    • ptype — просмотр типа переменной;
    • h или help — просмотр справки по команде;
    • q или quit — выход из программы.

    4. Запуск программы

    Для того чтобы запустить программу надо воспользоваться командой run в консоли gdb. Просто выполните:

    И программа будет запущена и выполнена. Если вам надо передать программе какие-либо аргументы, то следует их передать команде run, например:

    (gdb) run arg1 arg2

    Если программа завершилась с ошибкой, вы можете вывести стек вызовов функций для того чтобы узнать в какой именно функции возникла ошибка:

    Программа сообщает на какой строчке исходного кода возникла проблема. Чтобы посмотреть весь исходник выполните команду list:

    Для того чтобы вызвать ошибку Segmentation Fault и проверить как это работает можете добавить в программу такие строки и перекомпилировать её:

    char *buffer = malloc(sizeof(char) * 10);
    while(1) <
    *(++buffer) = ‘c’;
    >

    Тут мы выделяем из памяти массив символов размером 10 элементов и заполняем его и память, которая находится за ним символами «с», пока программа не упадёт.

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

    Неотъемлемая часть отладки приложения — это точки останова. С помощью них можно остановить выполнение программы на любом месте исходного кода или функции, а затем проанализировать все переменные, а также что происходит с программой. Сначала смотрим исходник программы:

    Читайте также:  Windows forms подключение файла

    По умолчанию команда выводит первые десять строк. Ей можно передать в качестве аргумента номер строки, строки возле которой надо отобразить или имя функции, например:

    Например, давайте установим точку останова на восьмой строчке исходника:

    Теперь, когда вы запустите программу на выполнение она остановиться в указанной точке:

    Для того чтобы выполнить следующую строчку без входа в функцию используйте команду next:

    Тогда выполнится следующая строка кода в программе. Если надо войти в функцию и посмотреть что в ней происходит следует использовать команду step:

    Для отладки циклов можно устанавливать точки останова на основе условия, например, на 11-той строке, если значение переменной var1 будет 20:

    (gdb) break 11 if var1==20

    Чтобы этот пример заработал добавьте в код цикла следующую строчку, как на снимке:

    Посмотреть все установленные точки останова можно такой командой:

    6. Вывод информации

    Сами по себе точки останова не очень полезны, но после каждой остановки программы можно посмотреть полностью её состояние и значения всех переменных, а это уже намного интереснее. Для просмотра информации используется команда info, а для вывода значения конкретной переменной — print. Для того чтобы посмотреть значения всех локальных переменных выполните:

    (gdb) info locals

    А для вывода значений аргументов функции:

    Вывести значение определённой переменной можно с помощью print:

    Интересно, что с помощью print можно выполнять арифметические операции и их результат не только выводится на экран, но и присваивается внутренней переменной, таким образом его можно будет вывести ещё раз позже или использовать в других вычислениях. Например:

    (gdb) print var1+30

    Имя временной переменной, куда были записаны данные отображается перед самим результатом, например, в последней команде это $2. Теперь можно ещё раз вывести это значение:

    Таким образом вы можете анализировать состояние программы, на каждой точке останова и искать ошибки.

    7. Изменение информации

    С помощью команды set можно изменить значение переменной прямо во время выполнения программы. Например:

    (gdb) break 7
    (gdb) run
    (gdb) set var2 = 20
    (gdb) print var2

    8. Вывод типа

    С помощью команды ptype вы можете вывести тип переменной. Например:

    (gdb) break 7
    (gdb) run
    (gdb) ptype var2

    9. Просмотр адресов

    Ещё интереснее исследовать как программы на Си работают с памятью. Команда print может выводить не только выводить значения переменных, но и их адреса в памяти. Приведите программу к такому виду и перекомпилируйте её:

    #include
    #include
    #include
    int main(int argc, char *argv[]) <
    int var1 = 0;
    int var2 = 2;
    char *buffer = malloc(sizeof(char) * 10);
    while(var1

    Запустите отладчик и установите точку останова на девятой строке и запустите программу:

    Теперь вы можете вывести адреса всех переменных в памяти с помощью символа &. Например:

    (gdb) print &argc
    (gdb) print &var1
    (gdb) print &buffer
    (gdb) print buffer

    Как видите, аргументы функции находятся в одном месте, локальные переменные в другому, но не очень далеко, а во память выделенная из кучи, на которую указывает указатель buffer — совсем далеко. Можете поменять программу и поэкспериментировать с разным количеством переменных.

    10. Просмотр памяти

    С помощью команды x или eXamine можно посмотреть содержимое памяти, по определённому адресу. Например, смотрим содержимое переменной var2:

    Если вы не знаете адрес переменной, можно передать её имя с оператором &, он извлечет её адрес. Программа выводит шеснадцатиричное значение, и оно обычно мало о чём нам может сообщить. Для того чтобы улучшить ситуацию можно воспользоваться опциями форматирования. Можно указать тип выводимых данных с помощью таких модификаторов:

    • o — восьмиричный;
    • x — шестнадцатиричный;
    • d — десятичный;
    • f — число с плавающей запятой;
    • i — инструкция процессора;
    • с — символ;
    • s — строка.

    Также можно указать размер выводимого блока:

    • b — байт;
    • h — полуслово (два байта);
    • w — слово (четыре байта);
    • g — восемь байт;

    Мы пытались вывести переменную типа int. Она занимает обычно четыре байта. Для её корректного вывода используйте такие параметры:

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

    Но поскольку там уже не наша переменная, эти данные не имеют смысла. Аналогично всё работает с строками, символами и другими значениями. Только обратите внимание, что если вы будете выводить переменную не одним блоком, то на результат повлияет порядок расположения байт. Значение будет выводиться задом на перед.

    11. Справка по программе

    Мы рассмотрели основные возможности отладчика gdb. Но если этого вам не достаточно, вы можете посмотреть справку по любой команде программы в самой программе. Для этого используйте команду help. Например, для команды exemine:

    Выводы

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

    Источник

  • Оцените статью