- Отладчик gdb linux это
- Как отлаживать программы на языке C в Linux с помощью отладчика GDB
- Основные аспекты использования GDB
- Пример использования GDB
- Заключение
- Команды GDB, о которых вы возможно не знали
- Что такое GDB
- Интерфейс в консоли (TUI)
- Точки останова
- Шаг с входом в Scope, шаг без входа
- Просмотр переменных разными способами
- Команда display
- Команда explore
- Запись логов работы программы
- Просмотр информации
- Заключение
Отладчик gdb linux это
Отладчиком называется программа, которая выполняет внутри себя другую программу. Основное назначение отладчика — дать возможность пользователю в определенной степени осуществлять контроль за выполняемой программой, т.е. определять, что происходит в процессе ее выполнения. Наиболее известным отладчиком для Linux является программа GNU GDB, которая содержит множество полезных возможностей, но для простой отладки достаточно использовать лишь некоторые из них.
Когда вы запускаете программу, содержащую ошибки, обнаруживаемые лишь на стадии выполнения, возникают несколько вопросов, на которые вам нужно найти ответ:
- Какое выражение или оператор в программе вызывает ошибку?
- Если ошибка возникает в результате вызова функции, в каком месте программы происходит этот вызов?
- Какие значения содержат переменные и параметры программы в определенной точке ее выполнения?
- Что является результатом вычисления выражения в определенном месте программы?
- Каков действительный порядок выполнения операторов программы?
Эти действия требуют, чтобы пользователь отладчика был в состоянии:
- проанализировать данные программы;
- получить трассу — список вызовов функций, которые были выполнены, с сортировкой, указывающей, кто кого вызывал;
- установить точки останова, в которых выполнение программы приостанавливается, чтобы можно было проанализировать данные;
- выполнять программу по шагам, чтобы увидеть, что в действительности происходит.
Программа GDB предоставляет все перечисленные возможности. Она называется отладчиком на уровне исходного текста, создавая иллюзию, что вы выполняете операторы C++ из вашей программы, а не машинный код, в который они действительно транслируются.
Для иллюстрации мы используем систему, которая компилирует программы на C++ в исполняемые файлы, содержащие машинный код. В результате этого процесса информация об оригинальном коде C++ теряется при трансляции. Отдельный оператор C++ обычно преобразуется в несколько машинных команд, а большинство имен локальных переменных просто теряется. Информация о именах переменных и операторах C++ в вашей исходной программе не является необходимой для ее выполнения. Поэтому, для правильной работы отладчика на уровне исходного текста, компилятор должен поместить в программу некоторую дополнительную информацию. Обычно ее добавляют к информации, используемой компоновщиком, в исполняемый файл.
Чтобы указать компилятору (gcc), что вы планируете отлаживать вашу программу, и поэтому нуждаетесь в дополнительной информации, добавьте ключ -g в опции компиляции и компоновки. Например, если ваша программа состоит из двух файлов main.C и utils.C, можете откомпилировать ее командами:
или одной командой:
gcc -g -Wall -o myprog main.o utils.o
Обе последовательности команд приводят к созданию исполняемого файла myprog.
Чтобы выполнить полученную программу под управлением gdb, введите
вы увидите командное приглашение GDB:
Это очень простой, но эффективный тексовый интерфейс отладчика. Его вполне достаточно, чтобы ознакомиться с основными командами gdb.
Когда GDB запускается, ваша программа в нем еще не выполняется; вы должны сами сообщить GDB, когда ее запустить. Как только программа приостанавливается в процессе выполнения, GDB ищет определенную строку исходной программы с вызовом определенной функции — либо строку в программе, где произошел останов, либо строку, содержащую вызов функции, в которой произошел останов, либо строку с вызовом функции и т.д. Далее используется термин «текущее окно», чтобы сослаться на точку останова.
Как только возникает командное приглашение, вы можете использовать следующие команды: help command
выводит краткое описание команды GDB. Просто help выдает список доступных разделов справки;
запускает Вашу программу с определенными аргументами командной строки. GDB запоминает переданные аргументы, и простой перезапуск программы с помощью run приводит к использованию этих аргументов;
создает трассу — цепочку вызовов функций, произошедших до попадания программы в текущее место. Синонимом является команда bt;
перемещает текущее окно так, чтобы GDB анализировал место, из которого произошел вызов данного окна. Очень часто Ваша программа может войти в библиотечную функцию — такую, для которой не доступен исходный код, например, в процедуру ввода-вывода. вам может понадобиться несколько команд up , чтобы перейти в точку программы, которая была выполнена последней;
производит эффект, обратный up;
выводит значение E в текущем окне программы, где E является выражением C++ (обычно просто переменной). Каждый раз при использовании этой команды, GDB нумерует ее упоминание для будущих ссылок. Например:
(gdb) print A[i] $2 = -16
(gdb) print $2 + ML $3 = -9
сообщает нам, что величина A[i] в текущем окне равна -16, и что при добавлении этого значения к переменной ML получится -9;
если программа запущена через оболочку shell, Ctrl-c немедленно прекращает ее выполнение. В GDB программа приостанавливается, пока ее выполнение не возобновится;
установить точку останова; программа приостановится при ее достижении. Простейший способ — установить точку останова после входа в функцию, например:
(gdb) break MungeData Breakpoint 1 at 0x22a4:
file main.C, line 16.
Команда break main остановит выполнение в начале программы.
вы можете установить точки останова на определенную строку исходного кода:
(gdb) break 19 Breakpoint 2 at 0x2290:
file main.C, line 19.
(gdb) break utils.C:55 Breakpoint 3 at 0x3778:
file utils.C, line 55.
Когда вы запустите программу и она достигнет точки останова, то увидите сообщение об этом и приглашение, например:
Breakpoint 1, MungeData (A=0x6110, N=7) at main.c:16
удаляет точку останова с номером N. Если опустить N, будут удалены все точки останова;
cont или continue
продолжает обычное выполнение программы;
выполняет текущую строку программы и останавливается на следующем операторе для выполнения;
похожа на step, однако, если текущая строка программы содержит вызов функции (так что step должен будет остановиться в начале функции), не входит в эту функцию, а выполняет ее и переходит на следующий оператор;
выполняет команды next без остановки, пока не достигнет конца текущей функции.
Next: Интерфейсы gdb и другие Up: Базовые средства программирования в Previous: Ассемблеры gas и nasm Contents 2004-06-22
Источник
Как отлаживать программы на языке C в Linux с помощью отладчика GDB
Оригинал: How to debug C programs in Linux using gdb
Автор: Himanshu Arora
Дата публикации: 16 января 2017 г.
Перевод: А.Панин
Дата перевода: 7 марта 2017 г.
Вне зависимости от вашего опыта программирования, все разработанное вами программное обеспечение просто не может не содержать ошибок. По этой причине поиск и устранение ошибок являются одними из наиболее важных задач, выполняемых в рамках цикла разработки программного обеспечения. Хотя и существует несколько способов выявления ошибок в коде (тестирование, самостоятельный аудит кода и другие), для этой цели создан отдельный тип программного обеспечения под названием «отладчики», позволяющего вам найти проблемный фрагмент кода и максимально быстро исправить его.
Если вы разрабатываете программное обеспечение на языках C/C++ или пользуетесь такими более редкими языками программирования, как Fortran и Modula-2, вам будет полезно знать о существовании отличного отладчика под названием GDB , который позволяет достаточно просто отлаживать ваш код, помогая устранять ошибки и различные проблемные конструкции. В рамках данной статьи мы постараемся обсудить основные приемы работы с GDB, включая некоторые полезные функции/параметры данного инструмента.
Но перед тем, как двинуться дальше, стоит упомянуть о том, что все инструкции и примеры, приведенные в данной статье, были протестированы в системе Ubuntu 14.04 LTS. В статье был использован пример кода на языке C; в качестве командной оболочки использовалась командная оболочка Bash (версии 4.3.11); также стоит сказать о том, что для отладки тестовой программы использовался отладчик GDB версии 7.7.1.
Основные аспекты использования GDB
По сути, GDB позволяет вам заглянуть внутрь программы в процессе ее исполнения, способствуя тем самым идентификации и локализации проблемы. Мы обсудим методику использования отладчика GDB на основе примера в следующем разделе, но перед этим стоит рассмотреть несколько основных аспектов использования отладчика, которые окажутся полезными в будущем.
Во-первых, для успешного использования таких отладчиков, как GDB, вам придется компилировать вашу программу таким образом, чтобы компилятор генерировал отладочную информацию, необходимую отладчикам. Например, в случае компилятора GCC, который будет впоследствии использоваться для компиляции примера программы на языке C, вам придется дополнительно передать параметр -g на этапе компиляции кода.
Вы можете получить дополнительную информацию о данном параметре компилятора на его странице руководства .
На следующем шаге следует убедиться в том, что отладчик GDB установлен в вашей системе. Если он не установлен и вы используете основанный на Debian дистрибутив, такой, как Ubuntu, вы можете установить данный инструмент с помощью следующей команды:
Инструкции по установке отладчика в других дистрибутивах приведены на данной странице .
Теперь, когда вы скомпилировали вашу программу со специальным параметром компилятора для ее подготовки к отладке и установили в систему отладчик GDB, вы можете выполнить программу в режиме отладки с помощью следующей команды:
Хотя данная команда и инициирует запуск отладчика GDB, ваша программа не начнет исполняться сразу же после его запуска. В этот момент у вас имеется возможность задать параметры отладки. Например, вы можете установить точку останова, сообщающую отладчику GDB о том, что следует приостановить исполнение программы на строке с определенным номером или функции.
Для того, чтобы инициировать исполнение вашей программы, вам придется выполнить следующую команду GDB:
Стоит упомянуть и о том, что в том случае, если вашей программе нужно передать некие аргументы командной строки, вы можете передать их вместе с данной командной. Например:
GDB поддерживает большое количество полезных команд, которые находят свое применение в процессе отладки программных продуктов. Мы обсудим некоторые из них в следующем разделе.
Пример использования GDB
Теперь вы имеете базовое представление об отладчике GDB и принципе его использования. Поэтому предлагаю рассмотреть пример и применить полученные знания на практике. Это код примера:
В общем, данный код берет каждое значение из массива val , устанавливает это значение в качестве значения целочисленной переменной out , после чего рассчитывает значение переменной tot путем суммирования ее предыдущего значения и результата вычисления 0xffffffff/out .
Проблема заключается в том, что после запуска скомпилированного кода выводится следующее сообщение об ошибке:
Итак, для отладки кода в первую очередь следует скомпилировать код программы с использованием параметра компилятора -g . Это команда компиляции:
Далее предлагаю запустить отладчик GDB и сообщить ему имя исполняемого файла, который мы хотим отлаживать. Для этого используется следующая команда:
Теперь следует обратить внимание на то, что в процессе исполнения программы выводится сообщение об ошибке «floating point exception» и, как многие из вас наверняка знают, данная ошибка обычно связана с делением произвольного значения на ноль. Помня об этом, я помещаю точку останова в строку под номером 11, где осуществляется деление. Это делается следующим образом:
Обратите внимание на приветствие отладчика (gdb) , после которого я ввел команду break 11 .
Теперь я прошу GDB начать исполнение программы:
При достижении точки останова в первый раз GDB выводит следующую информацию:
Как несложно заметить, отладчик вывел код строки, в которой была установлена точка останова. Теперь давайте выведем текущее значение переменной out . Это делается следующим образом:
Очевидно, что отладчик вывел значение 5 . На основе этой информации можно сделать вывод, что в текущее время программа работает корректно. Поэтому я прошу отладчик продолжить исполнение программы до достижения следующей точки останова путем ввода команды c .
Я продолжаю выполнять аналогичные действия до того момента, пока не вижу нулевое значение переменной out .
Теперь для подтверждения предположения о том, что имеется проблема, я использую команду GDB s (или step ) вместо c . Это делается потому, что я хочу, чтобы строка 11, на которой на данный момент остановилось исполнение программы, была исполнена, в результате чего исполнение программы может аварийно завершиться.
В результате случается следующее:
Да, приведенный выше вывод подтверждает, что системный сигнал генерируется именно в этой строке. Окончательное подтверждение происходит при попытке повторного исполнения команды s :
Вы можете отлаживать свои программы с помощью GDB аналогичным образом.
Заключение
В данной статье мы рассмотрели лишь малую толику возможностей отладчика GDB, доступных для изучения и использования. Обратитесь к странице руководства GDB для получения дополнительной информации о данном инструменте и попытайтесь самостоятельно использовать его для отладки своего кода. Рассматриваемый отладчик не является дружелюбным, но трата времени на его изучение вполне оправдана.
Источник
Команды GDB, о которых вы возможно не знали
Отладка кода — это как охота. Охота на баги.
— Amit Kalantri
Что такое GDB
GNU Debugger — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран и Rust. GDB — свободное программное обеспечение, распространяемое по лицензии GPL.
Источник: GNU Debugger — Википедия
Проще говоря GDB — отладчик, который работает прямо из консоли.
В данной статье я опишу команды, о которых раньше не знал, однако, они оказались очень полезными при отладке в GDB.
Рассматривать работу отладчика будем на одной из моих курсовых работ, её тема — шифр Цезаря, так что не нужно удивляться названиям переменных или классов. Самого кода вы тут не увидите, ибо это будет лишним для понимания сути действия, однако стоит привести несколько замечаний для полного понимания:
Объект | Что значит |
---|---|
Caesar::shift | Свойство Caesar |
Caesar::ChangeShift | Метод Caesar |
Caesar::Crypt | Метод Caesar |
Интерфейс в консоли (TUI)
Я всегда включаю TUI, как только зайду в GDB, он позволяет посмотреть где именно находится выполняемая строка, что идёт перед ней, что дальше. Включается TUI в GDB командой tui enable
С помощью колесика мыши (или стрелок) вы можете перемещаться по псевдо-интерфейсу вверху. С помощью комбинации клавиш Ctrl + p (previous), Ctrl + n (next), вы можете перемещаться между введёнными командами в терминале (окно внизу).
Тезис: Для включения псевдо-интерфейса используют команду tui enable , для выключения — tui disable .
Точки останова
Точки останова можно ставить с помощью команды breakpoint (сокращение — b).
Можно ставить точки останова исходя из следующих принципов:
- Точкой останова может являться имя функции (метода) или переменной
- Точкой останова может являться номер строки
- Точкой останова может являться адрес памяти, в котором располагается инструкция
- Точкой останова может являться условие
Если с тремя первыми всё понятно, то четвёртый принцип — достаточно интересный.
b Method if variable == value — примерно такой синтаксис используется для задания точки останова исходя из выполнения условия.
Тут сказано поставить точку останова на методе Crypt() , если свойство класса Caesar под названием shift будет равно 1.
Дополнительно: точки останова можно удалять с помощью команды delete , или её сокращения d .
Тезис: Точки останова можно ставить четыремя способами: с помощью имени объекта, с помощью номера строки, с помощью адреса, с помощью условия.
Шаг с входом в Scope, шаг без входа
Различие между командами next и step (сокращения: n и s) состоит в том, что next выполняет код не входя в Scope (не входя внутрь функции или метода), тогда как step просто выполняет шаг и аналогичен команде Step In в обычных дебагерах.
Дополнительно: для выполнения программы до точки останова используют continue , для выхода из функции в которую вы вошли используют finish или fin .
Тезис: Для вхождения в функцию используется step , для обычного выполнения — next .
Просмотр переменных разными способами
Одной из самых главных частей в процессе отладки является просмотр переменных в разных частях программы. Можно делать это с помощью команды print или p , однако есть и более удобные методы для просмотра переменных.
Команда display
Команда display будет показывать значение переменных каждый раз, когда терминал будет доступен для ввода
Таким образом вы можете просматривать что находится внутри одной переменной или даже целого массива:
Думаю не стоит говорить, что массив может быть динамический и по мере выполнения программы lengthOfArray (длина массива) может изменяться. GDB сам разберётся с этим и всё время будет выводить актуальную информацию.
Команда explore
Иногда бывает такое, что информации до того много, что путаешься какой объект за что отвечает, для этого создали explore .
explore помогает найти что за объект мелькает перед вашими глазами и рассказывает о нём всё, что может
Тезис: Кроме команды print можно использовать команды explore и display .
Запись логов работы программы
Иногда нужно «перемотать вспять» момент, где случилась ошибка, для этого придумана команда record , которая может полностью записывать логи программы в файл или просто в память, дабы перемотать некоторые моменты вспять или посмотреть что именно вызвало ошибку
Для того, чтобы остановить запись и удалить все логи — нужно ввести record stop , для того, чтобы сохранить все логи в файл нужно ввести record save .
Тезис: GDB имеет возможность создать лог работы программы, с помощью которого, мы можем перемещаться по программе вспять.
Просмотр информации
Просмотреть сразу все локальные переменные можно с помощью info local :
Просмотреть все переменные, которые инициализированы можно с помощью info variables :
Чтобы посмотреть все точки останова можно ввести info b :
Вы также можете посмотреть тип переменной с помощью команды whatis :
Чтобы посмотреть адрес функции, вы можете использовать info address :
Заключение
Есть ещё куча команд, которые я не привёл в данной статье, однако, на мой взгляд они являются столь полезными, как те, что я перечислил выше. Вы можете почитать больше о разработке на Linux в моём телеграм-канале, если вам это нужно. Я периодически пишу о фулл-стак разработке, а также о Unix-подобных системах.
В данной статье не указаны некоторые команды, которые легки для понимания, например: run, stop, quit, и т.д. Не указал я их специально, так как статья пытается нести информацию, о которой пользователи GDB возможно могли не знать. Если у вас есть предложения чем можно дополнить статью, с радостью почитаю комментарии.
Источник