- Как установить gdb linux
- Русские Блоги
- Как установить gdb под linux
- Предисловие
- Процесс установки
- Интеллектуальная рекомендация
- Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
- Создайте многоканальное окно в приложениях Win32
- Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
- Tree——No.617 Merge Two Binary Trees
- Краткий гайд по использованию GDB
- Подготовка файлов
- Использование GDB
- Как пользоваться gdb
- Как пользоваться gdb
- 1. Установка gdb
- 2. Компиляция программы
- 3. Запуск отладчика
- 4. Запуск программы
- 5. Точки останова
- 6. Вывод информации
- 7. Изменение информации
- 8. Вывод типа
- 9. Просмотр адресов
- 10. Просмотр памяти
- 11. Справка по программе
- Выводы
Как установить gdb linux
GDB поставляется вместе со сценарием configure , который автоматизирует процесс подготовки GDB к установке; затем вы можете использовать make для построения программы gdb . (20)
Дистрибутив GDB включает весь исходный код, который вам понадобится для GDB, в одном каталоге, имя которого обычно составляется добавлением номера версии к `gdb’ .
Например, дистрибутив GDB версии 5.0 находится в каталоге `gdb-5.0′ . Этот каталог содержит: gdb-5.0/configure (и файлы поддержки) сценарий для конфигурации GDB и всех поддерживаемых библиотек gdb-5.0/gdb исходные тексты, специфичные для самого GDB gdb-5.0/bfd исходные тексты для библиотеки описания двоичных файлов (Binary File Descriptor) gdb-5.0/include включаемые файлы GNU gdb-5.0/libiberty исходные тексты для `-liberty’ библиотеки свободного программного обеспечения gdb-5.0/opcodes исходные тексты библиотеки таблиц кодов операций и дисассемблеров gdb-5.0/readline исходные тексты интерфейса командной строки GNU gdb-5.0/glob исходные тексты подпрограммы GNU сопоставления с образцом имени файла gdb-5.0/mmalloc исходные тексты пакета GNU для выделения памяти
Простейший способ сконфигурировать и собрать GDB состоит в выполнении configure из исходного каталога `gdb- номер-версии ‘ , который в этом примере есть `gdb-5.0’ .
Сперва перейдите в исходный каталог `gdb- номер-версии ‘ , если вы еще не находитесь в нем; затем запустите configure . Передайте в качестве аргумента идентификатор платформы, на которой будет выполняться GDB.
где платформа —идентификатор, такой как `sun4′ или `decstation’ , задающий платформу, на которой будет выполняться GDB. (Часто вы можете опустить платформу ; configure пытается определить корректное значение, изучая вашу систему.)
Выполнение `configure платформа ‘ и затем make строят библиотеки `bfd’ , `readline’ , `mmalloc’ и `libiberty’ , и затем сам gdb . Сконфигурированные исходные файлы, а также двоичные файлы, остаются в соответствующих исходных каталогах.
configure является сценарием оболочки Bourne ( /bin/sh ); если ваша система не распознает это автоматически, когда вы находитесь в другой оболочке, вам может потребоваться выполнить sh явно:
Если вы выполните configure из каталога, содержащего исходные каталоги для нескольких библиотек или программ, например `gdb-5.0′ для версии 5.0, configure создает файлы конфигурации для всех подкаталогов низшего уровня (если вы не велите ему не этого делать ключем `—norecursion’ ).
Вы можете выполнить сценарий configure из любого подкаталога из поставки GDB, если вы хотите сконфигурировать только этот подкаталог, но убедитесь, что указали путь к нему.
Например, для версии 5.0, чтобы сконфигурировать только подкаталог bfd , введите:
Вы можете установить gdb куда угодно; он не имеет никаких жестко заданных путей. Однако, вы должны удостовериться, что ваша оболочка (определяемая переменной среды `SHELL’ ) доступна всем для чтения. Помните, что GDB использует оболочку для запуска вашей программы— некоторые системы не позволяют GDB отлаживать дочерние процессы, чьи программы недоступны для чтения.
Если вы хотите запускать версии GDB на нескольких рабочих или целевых машинах, вам нужны различные gdb , скомпилированные для каждой комбинации рабочей и целевой машины. configure разработан так, чтобы облегчить это, позволяя вам создавать каждую конфигурацию в отдельном подкаталоге, а не в исходном каталоге. Если ваша программа make поддерживает возможности `VPATH’ (GNU make это делает), вызов make в каждом из этих каталогов строит программу gdb , определенную там.
Чтобы построить gdb в отдельном каталоге, запустите configure с ключем `—srcdir’ , для определения, где искать источник. (Вам также нужно определить путь для поиска configure из вашего рабочего каталога. Если путь к configure совпадает с параметром `—srcdir’ , ключ `—srcdir’ можно опустить; он подразумевается.)
Например, в версии 5.0, вы можете построить GDB в отдельном каталоге для Sun 4 так:
Когда configure строит конфигурацию, используя удаленный каталог с источниками, он создает дерево для двоичных файлов с той же структурой (и используя те же имена), что и дерево каталогов с исходными текстами. В этом примере, вы бы нашли библиотеку Sun 4 `libiberty.a’ в каталоге `gdb-sun4/libiberty’ , и сам GDB в `gdb-sun4/gdb’ .
Одна из распространенных причин построения нескольких конфигураций GDB в отдельных каталогах состоит в том, чтобы конфигурировать GDB для кросс-компиляции (где GDB запускается на одной машине— рабочей , в то время как отлаживаемые программы выполняются на другой машине— целевой ). Вы определяете целевую машину кросс-отладки ключем configure `—target= цель ‘ .
Когда вы выполняете make для построения программы или библиотеки, вы должны выполнять ее из сконфигурированного каталога—того каталога, из которого вы вызывали configure (или из одного из его подкаталогов).
Makefile , который создает configure в каждом исходном каталоге, также выполняется рекурсивно. Если вы ввели make в каталоге с исходными файлами, например в `gdb-5.0′ (или в каталоге, сконфигурированном отдельно посредством `—srcdir= имя-каталога /gdb-5.0′ ), вы построите все требуемые библиотеки, и затем GDB.
Когда у вас имеется несколько рабочих или целевых конфигураций в отдельных каталогах, вы можете запустить make для них параллельно (например, если они смонтированы по NFS на каждой рабочей машине); они не будут конфликтовать друг с другом.
Спецификации, использованные для рабочих и целевых машин в сценарии configure , именуются в соответствии со схемой наименования, состоящей из трех частей, но поддерживаются также некоторые короткие предопределенные синонимы. Полная схема наименования кодирует три фрагмента информации по следующему образцу:
Например, вы можете использовать синоним sun4 как параметр платформа , или как значение цель в ключе —target= цель . Эквивалентное полное имя— `sparc-sun-sunos4′ .
Сценарий configure , сопровождающий GDB, не предоставляет никаких средств для запроса вывода всех поддерживаемых имен рабочих и целевых машин или их сокращений. configure вызывает скрипт оболочки Bourne config.sub для отображения сокращений в полные имена; при желании, вы можете посмотреть сценарий или использовать его для проверки ваших предположений о сокращениях. Например:
config.sub также распространяется в исходном каталоге GDB ( `gdb-5.0′ , для версии 5.0).
Здесь приводится обзор ключей и параметров configure , которые наиболее часто используются для построения GDB. configure также имеет несколько других ключей, не представленных здесь. See Info file `configure.info’, node `What Configure Does’, для полного объяснения configure .
Если хотите, можете вводить ключи с одним `-‘ , а не с `—‘ ; но вы можете сокращать имена ключей, если используете `—‘ . —help Отображает быстрый обзор, как вызывать configure . —prefix= каталог Конфигурировать источник, чтобы устанавливать программы и файлы в подкаталогах ` каталога ‘ . —exec-prefix= каталог Конфигурировать источник, чтобы устанавливать программы в каталог ` каталог ‘ . —srcdir= имя-каталога Предупреждение: использование этого ключа требует GNU make или другой программы make , реализующей возможности VPATH .
Используйте этот ключ для создания конфигураций в каталогах, отдельных от исходного каталога GDB. Кроме всего прочего, вы можете использовать его для построения (или поддержки) нескольких конфигураций одновременно в отдельных каталогах. configure записывает файлы, относящиеся к конфигурации, в текущий каталог, но принимает меры, чтобы можно было использовать источники в каталоге имя-каталога . configure создает каталоги внутри рабочего каталога параллельно с исходными каталогами внутри имя-каталога . —norecursion Конфигурировать только тот уровень каталогов, где выполняется configure ; не распространять конфигурацию на подкаталоги. —target= цель Конфигурировать GDB для кросс-отладки программ, выполняемых на указанной цели . Без этого ключа GDB конфигурируется для отладки программ, выполняемых на той же машине ( платформе ), что и сам GDB. Нет никакого удобного способа сгенерировать список всех доступных целей. платформа . Конфигуровать GDB для выполнения на указанной платформе . Нет никакого удобного способа сгенерировать список всех допустимых платформ.
Существует также много других ключей, но обычно они требуются только для специальных целей.
Источник
Русские Блоги
Как установить gdb под linux
Предисловие
gdb — это инструмент для отладки кода в среде Linux, предназначенный для лучшего программирования в среде Linux. Его установка обязательна.
Процесс установки
Процесс установки gdb очень прост, конкретные шаги заключаются в следующем:
step1: Сначала проверьте, был ли он установлен в системе, если таковой имеется, используйте следующую команду для удаления старой версии gdb
step2: Установите файловую систему Texinfo (блоггер не знает, что это, просто сделайте это в любом случае>
Интеллектуальная рекомендация
Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.
Создайте многоканальное окно в приложениях Win32
Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .
Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .
Tree——No.617 Merge Two Binary Trees
Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.
Источник
Краткий гайд по использованию 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 :
(В примере нет функции, однако шаг 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. Точки останова
Неотъемлемая часть отладки приложения — это точки останова. С помощью них можно остановить выполнение программы на любом месте исходного кода или функции, а затем проанализировать все переменные, а также что происходит с программой. Сначала смотрим исходник программы:
По умолчанию команда выводит первые десять строк. Ей можно передать в качестве аргумента номер строки, строки возле которой надо отобразить или имя функции, например:
Например, давайте установим точку останова на восьмой строчке исходника:
Теперь, когда вы запустите программу на выполнение она остановиться в указанной точке:
Для того чтобы выполнить следующую строчку без входа в функцию используйте команду 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 для отладки своих программ. Обычно, для отладки намного удобнее использовать графический интерфейс среды программирования, но консоль дает больше возможностей и больше гибкости.
Источник