Разработчики) | Проект GNU |
---|---|
изначальный выпуск | 1986 |
Стабильный выпуск | 10.1 [1] / 24 октября 2020 года |
Репозиторий | |
Написано в | C |
Операционная система | Unix-подобный , Windows |
Тип | Отладчик |
Лицензия | GPLv3 |
Интернет сайт | www |
GNU Debugger ( GDB ) является портативный отладчик , который работает на многих Unix-подобных систем и работ для многих языков программирования , включая Ada , C , C ++ , Objective-C , Free Pascal , Fortran , Go , [2] и частично другие. [3]
История [ править ]
Впервые GDB был написан Ричардом Столлманом в 1986 году как часть его системы GNU , после того как его GNU Emacs стал «достаточно стабильным». [4] GDB - бесплатное программное обеспечение, выпущенное под Стандартной общественной лицензией GNU (GPL). Он был смоделирован по образцу отладчика DBX , который поставлялся с дистрибутивами Berkeley Unix . [4]
С 1990 по 1993 год его обслуживал Джон Гилмор . [5] Сейчас он поддерживается Руководящим комитетом GDB, который назначается Free Software Foundation . [6]
Технические детали [ править ]
Особенности [ править ]
GDB предлагает обширные возможности для отслеживания и изменения выполнения компьютерных программ . Пользователь может отслеживать и изменять значения внутренних переменных программы и даже вызывать функции независимо от нормального поведения программы.
Целевые процессоры GDB (по состоянию на 2003 год) включают: Alpha , ARM , AVR , H8 / 300 , Altera Nios / Nios II , System / 370 , System 390 , X86 и его 64-битное расширение X86-64 , IA-64 "Itanium" , 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 , Stormy16 и 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 можно использовать для удаленной отладки программы без необходимости вносить в нее какие-либо изменения.
Тот же режим также используется KGDB для отладки работающего ядра Linux на уровне исходного кода с помощью gdb. С помощью KGDB разработчики ядра могут отлаживать ядро почти так же, как они отлаживают прикладные программы. Это позволяет размещать точки останова в коде ядра, выполнять пошаговое выполнение кода и наблюдать за переменными. В архитектурах, где доступны регистры аппаратной отладки, можно установить точки наблюдения, которые запускают точки останова при выполнении или доступе к указанным адресам памяти. KGDB требует дополнительной машины, которая подключена к машине для отладки с помощью последовательного кабеля или Ethernet . На FreeBSD также возможна отладка с использованием прямого доступа к памяти FireWire. (DMA). [13]
Графический интерфейс пользователя [ править ]
Отладчик не содержит собственного графического пользовательского интерфейса и по умолчанию использует интерфейс командной строки , хотя и содержит текстовый пользовательский интерфейс . Для него было создано несколько интерфейсов, таких как UltraGDB , Xxgdb , Data Display Debugger (DDD), Nemiver , KDbg , отладчик Xcode , GDBtk / Insight и графический интерфейс HP Wildebeest Debugger (WDB GUI). IDE, такие как Codelite , Code :: Blocks , Dev-C ++ , Geany , GNAT Programming Studio (GPS), KDevelop, Qt Creator , Lazarus , MonoDevelop , Eclipse , NetBeans и Visual Studio могут взаимодействовать с GDB. В GNU Emacs есть «режим GUD» и существуют инструменты для VIM (например, clewn). Они предлагают возможности, аналогичные отладчикам в IDE.
Некоторые другие инструменты отладки были разработаны для работы с GDB, например, детекторы утечки памяти .
Внутреннее [ править ]
GDB использует системный вызов с именем ptrace (название является сокращением от «трассировки процесса»), чтобы наблюдать и контролировать выполнение другого процесса, а также проверять и изменять память и регистр процесса. Список общих команд gdb и соответствующих вызовов ptrace приведен ниже:
- (gdb) start: PTRACE_TRACEME - делает родителя трассировщиком (вызывается трассировщиком)
- (gdb) attache PID: PTRACE_ATTACH - присоединить к запущенному процессу
- (gdb) stop: kill (child_pid, SIGSTOP) (или PTRACE_INTERRUPT)
- (gdb) продолжить: PTRACE_CONT
- (gdb) регистры информации: PTRACE_GET (FP) REGS (ET) и PTRACE_SET (FP) REGS (ET)
- (gdb) x: PTRACE_PEEKTEXT и PTRACE_POKETEXT
Точка останова реализуется путем замены инструкции по заданному адресу памяти другой специальной инструкцией. Выполнение инструкции точки останова вызывает SIGTRAP.
Примеры команд [ править ]
программа gdb | Отладка "программы" (из оболочки) |
---|---|
запустить -v | Запускаем загруженную программу с параметрами |
bt | Backtrace (в случае сбоя программы) |
регистры информации | Выгрузить все регистры |
disas $ pc-32, $ pc + 32 | Разобрать |
Пример сеанса [ править ]
Рассмотрим следующий исходный код, написанный на C :
#include <stdio.h>#include <stdlib.h>#include <string.h>size_t foo_len ( const char * s ) { return strlen ( s ); }int main ( int argc , char * argv [] ) { const char * a = NULL ; printf ( "размер a =% lu \ n " , foo_len ( a ) ); выход ( 0 ); }
При использовании компилятора GCC в Linux приведенный выше код должен быть скомпилирован с использованием -g
флага, чтобы включить соответствующую отладочную информацию в сгенерированный двоичный файл, что позволяет проверить его с помощью GDB. Предполагая, что файл, содержащий приведенный выше код, назван example.c
, команда для компиляции может быть следующей:
$ gcc example.c -Og -g -o пример
И теперь двоичный файл можно запустить:
$ ./example Ошибка сегментации
Поскольку пример кода при выполнении генерирует ошибку сегментации , GDB можно использовать для проверки проблемы.
$ gdb ./example GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. Лицензия GPLv3 +: GNU GPL версии 3 или более поздней <https://gnu.org/licenses /gpl.html> Это бесплатное программное обеспечение: вы можете изменять и распространять его. НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом. Для получения подробной информации введите "показать копирование" и "показать гарантию". Этот GDB был настроен как «x86_64-redhat-linux-gnu». Инструкции по сообщению об ошибках см. На странице <https://www.gnu.org/software/gdb/bugs/> ... Чтение символов из /path/example...done. (gdb) run Запуск программы: / путь / примерПрограмма получила сигнал SIGSEGV, Ошибка сегментации. 0x0000000000400527 в foo_len (s = 0x0) в example.c: 8 8 return strlen (s); (gdb) print s $ 1 = 0x0
Проблема присутствует в строке 8 и возникает при вызове функции strlen
(потому что ее аргументом s
является NULL
). В зависимости от реализации strlen ( встроенной или нет) вывод может быть другим, например:
GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. Лицензия GPLv3 +: GNU GPL версии 3 или более поздней <https://gnu.org/licenses/gpl.html> Это бесплатное программное обеспечение: вы являетесь свободно изменять и распространять его. НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом. Для получения подробной информации введите "показать копирование" и "показать гарантию". Этот GDB был сконфигурирован как «i686-pc-linux-gnu». Инструкции по сообщению об ошибках см. На странице <https://www.gnu.org/software/gdb/bugs/> ... Чтение символов из /tmp/gdb/example...done. (gdb) run Запуск программы: / 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 = <optimized out>, argv = <optimized out> ) в example.c: 16
Чтобы устранить проблему, переменная a
(в функции main
) должна содержать допустимую строку. Вот фиксированная версия кода:
#include <stdio.h>#include <stdlib.h>#include <string.h>size_t foo_len ( const char * s ) { return strlen ( s ); }int main ( int argc , char * argv [] ) { const char * a = "Это тестовая строка" ; printf ( "размер a =% lu \ n " , foo_len ( a ) ); выход ( 0 ); }
Перекомпиляция и повторный запуск исполняемого файла внутри GDB теперь дает правильный результат:
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)Авторское право (C) 2011 Free Software Foundation, Inc.Лицензия GPLv3 +: GNU GPL версии 3 или более поздней < https://gnu.org/licenses/gpl.html >Это бесплатное программное обеспечение: вы можете изменять и распространять его.НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом. Типа "показать копирование"и "показать гарантию" для подробностей.Этот GDB был настроен как «x86_64-redhat-linux-gnu».Инструкции по сообщению об ошибках см. На странице:< https://www.gnu.org/software/gdb/bugs/ > ...Чтение символов из /path/example...done.(gdb) запуститьЗапуск программы: / путь / примерразмер a = 21[Нижний 1 (процесс 14290) завершился нормально]
GDB выводит на printf
экран вывод , а затем сообщает пользователю, что программа завершилась нормально.
См. Также [ править ]
- Библиотека дескрипторов двоичных файлов (libbfd)
- dbx
- DDD , графический интерфейс для GDB и других отладчиков
- gdbserver
Ссылки [ править ]
- ^ Бробекер, Джоэл (2020-10-24). "GDB 10.1 выпущен!" . Проверено 24 октября 2020 .
- ^ «Документация GDB - Поддерживаемые языки» . Проверено 28 ноября 2011 .
- ^ "Документация GDB - Резюме" . Проверено 28 ноября 2011 .
- ^ a b "Лекция Ричарда Столмена в Королевском технологическом институте Швеции (1986-10-30)" . Проверено 21 сентября 2006 .
Затем, после того как GNU Emacs стал достаточно стабильным, на что потребовалось в общей сложности около полутора лет, я начал возвращаться к другим частям системы.
Я разработал отладчик, который я назвал GDB, который представляет собой символический отладчик для кода C, который недавно поступил в дистрибутив.
Теперь этот отладчик в значительной степени соответствует духу DBX, отладчика, поставляемого с Berkeley Unix.
- ^ «Джон Гилмор (активист)» . hyperleap.com .
- ^ "Руководящий комитет GDB" . Проверено 11 мая 2008 .
- ^ «Документация GDB - Резюме - Соавторы» . Проверено 1 декабря 2011 .
- ^ «Примечания к выпуску GDB 7.0» . Проверено 28 ноября 2011 .
- ^ Joel Brobecker (2014-07-29). "Выпущен GDB 7.8!" . Проверено 30 июля 2014 .
- ^ «Обратная отладка с GDB» . Проверено 20 января 2014 .
- ^ «Практическое руководство: удаленный последовательный протокол GDB: написание сервера RSP» (PDF) .
- ^ "Реализация удаленной заглушки" .
- ^ «Отладка ядра с помощью Dcons» .
Внешние ссылки [ править ]
- Официальный веб-сайт
- UltraGDB: отладка Visual C / C ++ с помощью GDB в Windows и Linux
- KGDB: отладчик уровня ядра ядра Linux
- Веб-сайт MyGDB: GDB Frontend на корейском языке
- Плагин Visual Studio для отладки с помощью GDB
- Сравнение интерфейсов GDB, 2013 г.
- Использование Eclipse в качестве интерфейса для отладчика GDB
Документация [ править ]
- Ричард М. Столлман , Роланд Пеш , Стэн Шебс и др., Отладка с помощью GDB ( Фонд свободного программного обеспечения , 2011 г.) ISBN 978-0-9831592-3-0
- Внутреннее устройство GDB
Учебники [ править ]
- Учебник RMS по gdb (Райан Майкл Шмидт, а не Ричард Мэтью Столлман )