Как установить gdb на windows
Я искал документацию по этому вопросу и ничего не нашел. У меня установлен MinGW, и он отлично работает. Я просто не знаю, как использовать отладчик.
учитывая некоторый простой код, скажем, в файле под названием " mycode.cpp":
. как бы я отладил это. Какие команды я использую для отладки кода с MinGW и GDB в windows? Могу ли я пройти через код через командную строку, как в Visual Studio? Если да, то какие команды я использую для этого?
несколько есть ли учебники по использованию GDB? Я не мог найти ни одного, но если бы кто-нибудь мог указать мне на него, это было бы здорово. Я устал писать тонны std::cout операторы для отладки сложного кода.
первым шагом является компиляция вашей программы с помощью -g включить отладочную информацию в исполняемый файл:
затем программа может быть загружена в gdb :
несколько команд, чтобы вы начали:
- break main заставит отладчик сломаться, когда main называется. Вы также можете разбить на строки кода с break FILENAME:LINENO . Например, break mycode.cpp:4 прерывает выполнение всякий раз, когда программа достигает строки 4 mycode.cpp .
- start запускает программу. В вашем случае вам нужно установить точки останова перед запуском программы, потому что она быстро завершает работу.
в точке останова:
- print VARNAME . Вот как вы печатаете значения переменных, будь то локальные, статические или глобальные. Например, в for loop, вы можете ввести print temp чтобы распечатать значение temp переменной.
- step это эквивалентно "шаг в."
- next или adv +1 перейти к следующей строке (например, "step over"). Вы также можете перейти к определенной строке определенного файла, например, adv mycode.cpp:8 .
- bt печать backtrace. По сути, это трассировка стека.
- continue точно так же, как операция" продолжить " визуального отладчика. Это заставляет выполнение программы продолжаться до следующей точки останова или выхода программы.
в этом вопросе есть несколько GDB guis для windows windows версия интерфейса GDB DDD
Для использования GDB под Windows, этот отладчик нужно собирать из исходных текстов. По неизвестным причинам разработчики не предоставляют бинарную сборку под Windows.
Отладчик GDB является важным инструментом среды разработки приложений Qt. Без него Qt Creator, например, теряет большую часть своей функциональности (остается, разве что, подсветка синтаксиса в редакторе и контекстная справка). Вплоть до версии Qt Creator 2.4.1 отладчик GDB устанавливался вместе с Qt Creator, равно как и компилятор MinGW. Начиная с версии Qt Creator 2.5.0, отлачик GDB необходимо собирать самостоятельно. Данная статья призвана оказать помощь в решении этой проблемы. При ее подготовке использовался материал с ресурса Wiki от Nokia.
Есть хорошая новость! С недавних пор сборка GDB существенно упростилась. Похоже, что это заслуга еще Nokia. Предполагается, что MSYS уже установлен вместе с утилитами patch, unzip и файлом msys-bz2-1.dll. Последовательность установки этих утилит следующая:
3. По окончании установки вручную добавим пару полезных утилит, которые не вошли в состав ядра MSYS, но могут оказаться востребованными. Речь идет об утилитах patch и unzip, файлы которых можно найти здесь:
Скачанные файлы распаковываем с помощью 7-Zip, и содеожимое папок bin из архивов помещаем в одноименную папку MSYS
4. При сборке GDB потребуется еще одна библиотека. Скачиваем файл
распаковываем его с помощью 7-Zip, и помещаем библиотечный файл msys-bz2-1.dll из папки bin архива в одноименную папку MSYS (см. выше).
5. В заключение необходимо прописать в системе путь к компилятору. В системную переменную Path дописываем через точку с запятой
Рассмотрим подробно порядок действий.
1. Скачиваем на сайте разработчика архив с исходниками Qt Creator
qt-creator-2.6.1-src.zip 26 MB
(версия, доступная на момент написания статьи)
2. Распаковываем архив в корень диска D:\. Переименовываем для удобства папку с исходником D:\qt-creator-2.6.1-src, например, в D:\s (аналогичное действие выполняется при сборке Qt Creator).
3. Открываем в текстовом редакторе файл D:\s\dist\gdb\Makefile.mingw, находим неработающую на сегодняшний день ссылку
и исправляем ее на
4. Запускаем MinGW Shell (см. группу ярлыков MinGW в меню Пуск или файл C:\Qt\mingw-4.6\msys\1.0\msys.bat) и вводим команды
cd /d/s/dist/gdb
make -f Makefile.mingw
5. Результатом сборки будет папка D:\s\dist\gdb\qtcreator-gdb-7.4.1, содержащая две цели i686-pc-mingw32 и arm-none-linux-gnueabi (нас интересует первая) и необходимый набор библиотечных файлов. Переместим эту папку в какое-нибудь удобное для нас место, например в C:\Qt. Теперь в настройках связки инструментов Qt Creator в качестве отладчика следует указывать файл
Программа 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. Компиляция программы
Для того чтобы получить максимум полезной информации во время отладки, например, имена переменных и номера строк кода программу следует скомпилировать особым образом. Для примеров из этой статьи мы будем использовать такую небольшую программу на Си, в процессе будем её изменять, но начнём с этого:
Для того чтобы всё необходимое было включено в исполняемый файл, программу надо собрать с опцией -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 может выводить не только выводить значения переменных, но и их адреса в памяти. Приведите программу к такому виду и перекомпилируйте её:
Запустите отладчик и установите точку останова на девятой строке и запустите программу:
Теперь вы можете вывести адреса всех переменных в памяти с помощью символа &. Например:
(gdb) print &argc
(gdb) print &var1
(gdb) print &buffer
(gdb) print buffer
Как видите, аргументы функции находятся в одном месте, локальные переменные в другому, но не очень далеко, а во память выделенная из кучи, на которую указывает указатель buffer - совсем далеко. Можете поменять программу и поэкспериментировать с разным количеством переменных.
10. Просмотр памяти
С помощью команды x или eXamine можно посмотреть содержимое памяти, по определённому адресу. Например, смотрим содержимое переменной var2:
Если вы не знаете адрес переменной, можно передать её имя с оператором &, он извлечет её адрес. Программа выводит шеснадцатиричное значение, и оно обычно мало о чём нам может сообщить. Для того чтобы улучшить ситуацию можно воспользоваться опциями форматирования. Можно указать тип выводимых данных с помощью таких модификаторов:
Также можно указать размер выводимого блока:
Мы пытались вывести переменную типа int. Она занимает обычно четыре байта. Для её корректного вывода используйте такие параметры:
Ещё можно указать количество блоков, которые надо выводить, например два:
Но поскольку там уже не наша переменная, эти данные не имеют смысла. Аналогично всё работает с строками, символами и другими значениями. Только обратите внимание, что если вы будете выводить переменную не одним блоком, то на результат повлияет порядок расположения байт. Значение будет выводиться задом на перед.
11. Справка по программе
Мы рассмотрели основные возможности отладчика gdb. Но если этого вам не достаточно, вы можете посмотреть справку по любой команде программы в самой программе. Для этого используйте команду help. Например, для команды exemine:
Выводы
Теперь вы знаете как пользоваться gdb для отладки своих программ. Обычно, для отладки намного удобнее использовать графический интерфейс среды программирования, но консоль дает больше возможностей и больше гибкости.
Нет похожих записей
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.
Показали мне недавно интересное приложение, под которое можно разрабатывать плагины. Приложение оказалось очень полезным для научной работы, но вот незадача — приложение разработано под Windows, у меня стоит Ubuntu. Windows для разработки под это приложение от лаборатории получить пока не удалось. Чтобы не тратить время, решил освоить кросс-компиляцию и отладку этого приложения.
Итого, имеется:
Ubuntu 12.10 x64
Не-юникодное приложение Мастерская Граф-Моделей (МГМ) (В командах консоли будет называться gmw.exe)
Нужно:
Разрабатывать и отлаживать плагины (dll-библиотеки), не устанавливая Windows.
И тут нам помогут Wine, Code::Blocks, портированное GDB, и boost.
Wine, не юникодное приложение, английский интерфейс Ubuntu и русский язык
При попытке открыть не юникодное приложение под Wine
получаются зюки следующего вида:
На эту проблему интернет очень быстро дает следующую подсказку:
В моём случае, данный подход не улучшил ситуацию ни на йоту.
Как выяснилось, русских локалей в системе не было добавлено (тыц).
Теперь запускаем с выше-указанной подсказкой
И, вуаля, запускается приложение с читаемым русским текстом:
Настройка IDE Code::Blocks для кросс-компиляции и отладки
Установка Code::Blocks
В дальнейшем для отладки нам потребуется менять код плагина отладки поэтому лучше сразу взять версию Code::Blocks из под svn.
Устанавливаем svn:
С помощью svn получаем код C::B, для этого переходим в папку, в которую хотим сохранить код C::B, где и набираем:
Переходим в полученную папку 'trunk'.
Компиляция C::B происходит с помощью g++, autotools, automake и некоторых других утилит, которые необходимо установить:
Кроме того Code::Blocks зависит от wxWidgets:
Подстраиваем установщик под компьютер (можно запускать единожды):
И дальше, устанавливаем сам codeblocks (ключ --prefix можно упустить для использования настроек по-умолчанию):
Более подробно можно посмотреть по ссылке.
Настройка компиляции и линковки
Выполняем пункты с 1 по 5 с форума Code::Blocks. После этого компиляция программ должна работать, если не используется линковка к платформо-зависмым библиотекам (линковка с boost::regexp будет рассмотрена позже).
(*) В новом Code::Blocks немного изменилось меню по сравнению с инструкцией. Настройки искать нужно в 'Settings->Compiler. '. Для старого Code::Blocks (10.05) пункт 5 нужно выполнить полностью, для нового же (12.11) настройку касающуюся gdb в 5 пункте пока трогать не будем.
Если используется boost его лучше положить отдельно от /usr/include, т.к. по этому адресу лежит много linux-специфичных заголовочных файлов, которые мы не хотим включать в проект при компиляции под Windows.
UPD: При настройке линковки в поле «Other Linker Options» имеет смысл добавить опцию "-Wl,--subsystem,windows,--kill-at", которая помечает, что это реально Windows DLL, и, что самое главное, запрещает использовать декорирование символов (--kill-at) при экспорте функций с соглашением вызова __stdcall. Подрбнее здесь и здесь.
Начиная с пункта 7 по ссылке выше, описывается кросс-отладка, но, к сожалению, insight.exe, упоминающийся в инструкциях, найти не удается. Поэтому пойдем своим путем.
Кросс-отладка в Code::Blocks & MingW32 gdb для Windows
Теперь в этой же папке bin появился файл gdb.exe, он-то нам и нужен.
Создаем скрипт для имитации обычного gdb для этого в файл /usr/bin/i586-mingw32msvc-gdb
Заносим следующие строки:
Для старого C::B все уже настроенно, для нового же отладчик нужно настроить дополнительно. В пункте 'Settings->Debugger' кликаем по 'GDB/CDB debugger' затем по 'Create Config'. В новом конфиге меняем команду запуска отладчика на '/usr/bin/i586-mingw32msvc-gdb', остальные настройки по желанию. После этого идем в 'Settings->Compiler. ", в пункте 'Selected Compiler' выбираем тот компилятор, который настраивали до этого и затем на вкладке 'Toolchain executables' меняем 'Debugger' на наш свежесозданный конфиг. Теперь отладчик будет останавливаться на точках останова, хотя и остановить программу в произволльный момент не сможет (данная проблема пока еще не решена). Правда при попытке отладить,C::B выдает следующую ошибку:
Эта ошибка говорит о том, что плагин отладчика в C::B не понимает выдачу отладчика gdb.exe. Как выяснилось при ближайшем рассмотрении плагин отладчика имеет платформо-зависимый код, и вот тут-то и нужно вспомнить что у нас есть исходники C::B. Мы сейчас слегка подкоррекируем код этого плагина. Нужно будет поменять код только одного файла '/src/plugins/debuggergdb/gdb_driver.cpp'
Для этого нужно перейти в корень проекта C::B (откуда запускалась команды ./bootstrap), по умолчанию это папка 'trunk'. И накактить патч:
Ну и пересобираем Code::Blocks:
И почти все готово, остается только создать проект. Шаги 12-13 по ссылке. Если же вы хотите создать проект dll-библиотеки, то указывайти создание динамической библиотеки в мастере и переименовывайте разширение в dll.
Проверям, что в настройках проекта стоит выбранная нами цепь компилятор-линкер-отладчик. '-Build Options. ' пункт 'Selected compiler', и можно радоваться и отлаживаться. Напомню, что по какой-то причине отладчик не может быть прерван во время исполнения, т.е. все отладочные действия могут буть применены только во время останова программы. В частности нельзя поставить новую точку останова, если программа не стоит на какой-либо другой точке останова…
Линкование статической библиотеки boost'а
Библиотека boost в основном является набором заголовочных файлов, и потому никаких проблем с линковкой обычно не возникает. Но для некоторых частей boost'а необходимо линковаться к статической библиотеке, например, boost::regex. Пробуем собрать проект и получаем:
Ошибка возникает из-за того, что мы пытаемся прилинковаться к linux билиотеке, для того чтобы построить windows-приложение.
Чтобы слинковаться нужно скомпилировать boost::regex с помощью MingW32 (про кросс-компиляцию). Скачиваем boost, распаковываем и переходим в папку с распаковынным boost'ом. Создаем файл user-config.jam в корне домашней директории:
Со следующим содержанием:
Дальше настраиваем сборку и собираем:
После выполнения последней команды у меня были ошибки «failed updating 1 target», что, правда, не мешает собираться программам.
В результате, у нас есть полностью подготовленная среда для написания, сборки и отладки Windows-приложений или Windows-библиотек из под Linux. Теперь можно приступать к работе…
Отладчик GNU, также называемый gdb, является наиболее популярным отладчиком для систем UNIX для отладки программ на C и C ++.
GNU Debugger поможет вам получить информацию о следующем:
Если произошел дамп ядра, то при каком операторе или выражении произошел сбой программы?
Если во время выполнения функции возникает ошибка, какая строка программы содержит вызов этой функции и каковы параметры?
Каковы значения переменных программы в определенной точке во время выполнения программы?
Каков результат определенного выражения в программе?
Если произошел дамп ядра, то при каком операторе или выражении произошел сбой программы?
Если во время выполнения функции возникает ошибка, какая строка программы содержит вызов этой функции и каковы параметры?
Каковы значения переменных программы в определенной точке во время выполнения программы?
Каков результат определенного выражения в программе?
Как отладить GDB?
GDB позволяет вам запустить программу до определенной точки, затем остановить и распечатать значения определенных переменных в этой точке или выполнить пошаговое выполнение программы по одной строке за раз и распечатать значения каждой переменной после выполнения каждой строки.
GDB использует простой интерфейс командной строки.
Указывает на заметку
Хотя GDB может помочь вам обнаружить ошибки, связанные с утечкой памяти, но это не инструмент для обнаружения утечек памяти.
GDB нельзя использовать для программ, которые компилируются с ошибками, и это не помогает исправлять эти ошибки.
Хотя GDB может помочь вам обнаружить ошибки, связанные с утечкой памяти, но это не инструмент для обнаружения утечек памяти.
GDB нельзя использовать для программ, которые компилируются с ошибками, и это не помогает исправлять эти ошибки.
Перед тем, как приступить к установке, проверьте, установлен ли у вас gdb в вашей системе Unix, введя следующую команду:
Если GDB установлен, он отобразит все доступные опции в вашей GDB. Если GDB не установлен, перейдите к новой установке.
Вы можете установить GDB в вашей системе, выполнив простые шаги, описанные ниже.
Шаг 1: Убедитесь, что у вас есть необходимые условия для установки GDB:
115 МБ свободного дискового пространства требуется на разделе, на котором вы собираетесь создать GDB.
20 МБ свободного дискового пространства требуется на том разделе, на котором вы собираетесь установить GDB.
Программа распаковки GNU, gzip
115 МБ свободного дискового пространства требуется на разделе, на котором вы собираетесь создать GDB.
20 МБ свободного дискового пространства требуется на том разделе, на котором вы собираетесь установить GDB.
Программа распаковки GNU, gzip
Шаг 3: В вашей сборочной директории распакуйте gdb-6.6.tar.gz и извлеките исходные файлы из архива. Как только файлы будут извлечены, измените свой рабочий каталог на каталог gdb-6.6, который был автоматически создан в вашем каталоге сборки.
Шаг 4: Запустите скрипт configure для настройки дерева исходных текстов для вашей платформы.
Шаг 5: Сборка GDB с помощью утилиты make .
Шаг 6: Войдите в систему как root и установите gdb, используя следующую команду.
Шаг 7: При необходимости, дисковое пространство можно восстановить, удалив каталог сборки gdb и файл архива после завершения установки.
Теперь в вашей системе установлен gdb, и он готов к использованию.
Таблица символов отладки отображает инструкции в скомпилированной двоичной программе на соответствующие им переменные, функции или строки в исходном коде. Это отображение может быть что-то вроде:
Программная инструкция ⇒ имя элемента, тип элемента, исходный файл, номер строки.
Программная инструкция ⇒ имя элемента, тип элемента, исходный файл, номер строки.
Таблицы символов могут быть встроены в программу или сохранены в виде отдельного файла. Поэтому, если вы планируете отлаживать свою программу, то необходимо создать таблицу символов, которая будет содержать необходимую информацию для отладки программы.
Мы можем вывести следующие факты о таблицах символов:
Отладочные сборки часто больше и медленнее, чем обычные (не отладочные); отладочные сборки содержат таблицу символов и другую вспомогательную информацию.
Если вы хотите отладить бинарную программу, которую вы не скомпилировали самостоятельно, вы должны получить таблицы символов у автора.
Отладочные сборки часто больше и медленнее, чем обычные (не отладочные); отладочные сборки содержат таблицу символов и другую вспомогательную информацию.
Если вы хотите отладить бинарную программу, которую вы не скомпилировали самостоятельно, вы должны получить таблицы символов у автора.
Чтобы GDB мог читать всю эту информацию построчно из таблицы символов, нам нужно скомпилировать ее немного по-другому. Обычно мы компилируем наши программы как:
Вместо этого нам нужно скомпилировать с флагом -g, как показано ниже:
GDB предлагает большой список команд, однако чаще всего используются следующие команды:
Читайте также: