Отладчик GNU - GNU Debugger

Отладчик GNU
Gdb лучник fish.svg
GDB-screenshot.gif
Разработчики)Проект GNU
изначальный выпуск1986; 34 года назад (1986)
Стабильный выпуск
10.1[1] / 24 октября 2020; 45 дней назад (2020-10-24)
Репозиторий Отредактируйте это в Викиданных
Написано вC
Операционная системаUnix-подобный, Windows
ТипОтладчик
ЛицензияGPLv3
Интернет сайтwww.gnu.org/программного обеспечения/ gdb

В Отладчик GNU (GDB) это портативный отладчик это работает на многих Unix-подобный систем и работает для многих языки программирования, включая Ада, C, C ++, Цель-C, Free Pascal, Фортран, Идти,[2] и частично другие.[3]

История

GDB был впервые написан Ричард Столмен в 1986 году в рамках его GNU система, после его GNU Emacs был «достаточно стабильным».[4] GDB - это бесплатно программное обеспечение выпущен под Стандартная общественная лицензия GNU (GPL). Он был смоделирован после DBX отладчик, поставляемый с Беркли Unix раздачи.[4]

С 1990 по 1993 год его обслуживала Джон Гилмор.[5] Теперь он поддерживается Руководящим комитетом GDB, который назначается Фонд свободного программного обеспечения.[6]

Технические детали

Функции

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

Целевые процессоры GDB (по состоянию на 2003 г.) включают: Альфа, РУКА, AVR, H8 / 300, Альтера Ниос / Ниос II, Система / 370, Система 390, X86 и его 64-битное расширение X86-64, IA-64 "Итаниум", Motorola 68000, MIPS, PA-RISC, PowerPC, SuperH, SPARC, и VAX. Менее известные целевые процессоры, поддерживаемые в стандартной версии, включают A29K, ARC, ETRAX CRIS, D10V, D30V, FR-30, FR-V, Intel i960, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K, Бурный16, и Z8000. (Новые выпуски, скорее всего, не будут поддерживать некоторые из них.) GDB скомпилирован. тренажеры для даже менее известных целевых процессоров, таких как M32R или же V850.[7]

GDB все еще активно развивается. Начиная с версии 7.0 новые функции включают поддержку Python сценарии[8] и начиная с версии 7.8 GNU Guile сценарии тоже.[9] Начиная с версии 7.0, доступна поддержка «обратимой отладки», позволяющая откатить сеанс отладки назад, что очень похоже на перемотку сбойной программы, чтобы увидеть, что произошло.[10]

Удаленная отладка

GDB предлагает «удаленный» режим, который часто используется при отладке встроенных систем. Удаленная работа - это когда GDB работает на одной машине, а отлаживаемая программа - на другой. GDB может связываться с удаленной «заглушкой», которая понимает протокол GDB, через последовательное устройство или TCP / IP.[11] Программа-заглушка может быть создана путем связывания с соответствующими файлами-заглушками, поставляемыми с GDB, которые реализуют целевую сторону протокола связи.[12] В качестве альтернативы, gdbserver может использоваться для удаленной отладки программы без каких-либо изменений.

Этот же режим также используется КГДБ для отладки запущенного Ядро Linux на исходном уровне с помощью gdb. С помощью KGDB разработчики ядра могут отлаживать ядро ​​почти так же, как отлаживают прикладные программы. Это позволяет размещать точки останова в коде ядра, выполнять пошаговое выполнение кода и наблюдать за переменными. В архитектурах, где доступны регистры аппаратной отладки, могут быть установлены точки наблюдения, которые запускают точки останова при выполнении или доступе к указанным адресам памяти. KGDB требует дополнительной машины, которая подключена к машине для отладки с помощью последовательный кабель или же Ethernet. На FreeBSD, также можно отладить, используя FireWire прямой доступ к памяти (DMA).[13]

Графический пользовательский интерфейс

Отладчик не содержит собственных графический интерфейс пользователя, и по умолчанию Интерфейс командной строки, хотя в нем есть текстовый пользовательский интерфейс. Для этого было построено несколько интерфейсов, таких как UltraGDB, Xxgdb, Отладчик отображения данных (DDD), Немивер, KDbg, то Xcode debugger, GDBtk / Insight и графический интерфейс HP Wildebeest Debugger (WDB GUI). Иды Такие как Коделайт, Код :: Блоки, Dev-C ++, Geany, Студия программирования GNAT (GPS), KDevelop, Qt Creator, Лазарь, MonoDevelop, Затмение, NetBeans, и Visual Studio может взаимодействовать с GDB. GNU Emacs есть «режим ГУД» и инструменты для VIM существуют (например, расколотый). Они предлагают возможности, аналогичные отладчикам в IDE.

Некоторые другие инструменты отладки были разработаны для работы с GDB, например утечка памяти детекторы.

Примеры команд

программа gdbОтладка "программы" (из оболочки)
запустить -vЗапускаем загруженную программу с параметрами
bt Backtrace (в случае сбоя программы)
регистры информацииВыгрузить все регистры
disas $ pc-32, $ pc + 32Разобрать

Пример сеанса

Рассмотрим следующий исходный код, написанный на C:

#включают <stdio.h>#включают <stdlib.h>#включают <string.h>size_t foo_len( const char *s ){  возвращаться Strlen( s );}int главный( int argc, char *argv[] ){  const char *а = НОЛЬ;  printf( "размер a =% lu п", foo_len(а) );  выход( 0 );}

С использованием GCC компилятор на Linux, приведенный выше код должен быть скомпилирован с использованием -грамм flag, чтобы включить соответствующую отладочную информацию в сгенерированный двоичный файл, что делает возможным его проверку с помощью GDB. Предполагая, что файл, содержащий приведенный выше код, называется example.c, команда для сборник может быть:

$ gcc example.c -Og -g -o пример

И теперь двоичный файл можно запустить:

$ ./примерОшибка сегментации

Поскольку код примера при выполнении генерирует ошибка сегментации, GDB можно использовать для проверки проблемы.

$ gdb ./exampleGNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)Авторское право (C) 2011 Free Software Foundation, Inc.Лицензия GPLv3 +: GNU GPL версии 3 или более поздней Это бесплатное программное обеспечение: вы можете изменять и распространять его.НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом. Типа "показать копирование"и "показать гарантию" для подробностей.Этот GDB был настроен как "x86_64-redhat-linux-gnu".Инструкции по сообщению об ошибках см. ...Чтение символов из /path/example...done.(GDB) пробегЗапуск программы: / путь / примерПрограмма получила сигнал SIGSEGV, Ошибка сегментации.0x0000000000400527 в foo_len (s = 0x0) в example.c: 88 возвратных строк;(GDB) печать с$1 = 0x0

Проблема присутствует в строке 8 и возникает при вызове функции Strlen (потому что его аргумент, s, является НОЛЬВ зависимости от реализации strlen (в соответствии или нет) вывод может быть другим, например:

GNU gdb (GDB) 7.3.1Авторское право (C) 2011 Free Software Foundation, Inc.Лицензия GPLv3 +: GNU GPL версии 3 или более поздней Это бесплатное программное обеспечение: вы можете изменять и распространять его.НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом. Типа "показать копирование"и "показать гарантию" для подробностей.Этот GDB был сконфигурирован как «i686-pc-linux-gnu».Инструкции по сообщению об ошибках см. В следующих разделах: ...Чтение символов из /tmp/gdb/example...done.(GDB) пробегЗапуск программы: / tmp / gdb / exampleПрограмма получила сигнал SIGSEGV, Ошибка сегментации.0xb7ee94f3 в strlen () из /lib/i686/cmov/libc.so.6(GDB) bt#0  0xb7ee94f3 в strlen () из /lib/i686/cmov/libc.so.6#1  0x08048435 в foo_len (s=0x0) в example.c: 8#2  0x0804845a в основном (argc=<оптимизировано>, argv=<optimized out>) в example.c: 16

Чтобы устранить проблему, переменная а (в функции главный) должен содержать допустимую строку. Вот фиксированная версия кода:

#включают <stdio.h>#включают <stdlib.h>#включают <string.h>size_t foo_len( const char *s ){  возвращаться Strlen(s);}int главный( int argc, char *argv[] ){  const char *а = «Это тестовая строка»;  printf( "размер a =% lu п", foo_len(а) );  выход( 0 );}

Перекомпиляция и повторный запуск исполняемого файла внутри GDB теперь дает правильный результат:

GDB печатает вывод printf на экране, а затем информирует пользователя, что программа завершилась нормально.

Смотрите также

Рекомендации

  1. ^ Бробекер, Джоэл (2020-10-24). "Выпущен GDB 10.1!". Получено 2020-10-24.
  2. ^ «Документация GDB - Поддерживаемые языки». Получено 2011-11-28.
  3. ^ "Документация GDB - Резюме". Получено 2011-11-28.
  4. ^ а б «Лекция Ричарда Столмена в Королевском технологическом институте Швеции (1986-10-30)». Получено 2006-09-21. Затем, когда GNU Emacs стал достаточно стабильным, на что в общей сложности потребовалось около полутора лет, я начал возвращаться к другим частям системы. Я разработал отладчик, который я назвал GDB, который представляет собой символический отладчик для кода C, который недавно поступил в дистрибутив. Теперь этот отладчик в значительной степени выполнен в духе DBX, отладчика, поставляемого с Berkeley Unix.
  5. ^ «Джон Гилмор (активист)». hyperleap.com.
  6. ^ «Руководящий комитет GDB». Получено 2008-05-11.
  7. ^ «Документация GDB - Резюме - Соавторы». Получено 2011-12-01.
  8. ^ «Примечания к выпуску GDB 7.0». Получено 2011-11-28.
  9. ^ Джоэл Бробекер (29.07.2014). "Выпущен GDB 7.8!". Получено 2014-07-30.
  10. ^ «Обратная отладка с GDB». Получено 2014-01-20.
  11. ^ "Как: удаленный последовательный протокол GDB: написание сервера RSP" (PDF).
  12. ^ «Реализация удаленной заглушки».
  13. ^ «Отладка ядра с помощью Dcons».

внешняя ссылка

Документация

Учебники