GNU-отладчик
![]() | |
![]() | |
Разработчики) | Проект GNU |
---|---|
Начальная версия | 1986 год |
Стабильная версия | 14.2 [1] ![]() |
Репозиторий | |
Написано в | С , С++ , Питон |
Операционная система | Unix-подобный , Windows |
Тип | Отладчик |
Лицензия | лицензия GPLv3 |
Веб-сайт | www |
Отладчик GNU ( GDB ) — портативный отладчик , который работает во многих Unix-подобных системах и работает со многими языками программирования , включая Ada , Assembly , C , C++ , D , Fortran , Haskell , Go , Objective-C , OpenCL C , Modula. -2 , Паскаль , Руст , [2] и частично другие. [3]
История [ править ]
GDB был впервые написан Ричардом Столлманом в 1986 году как часть его системы GNU , после того как его GNU Emacs стал «достаточно стабильным». [4] GDB — бесплатное программное обеспечение , выпущенное под лицензией GNU General Public License (GPL). Он был создан по образцу отладчика DBX , который входил в состав дистрибутивов Berkeley Unix . [4]
С 1990 по 1993 год его поддерживал Джон Гилмор . [5] Сейчас его поддерживает Руководящий комитет GDB, назначенный Фондом свободного программного обеспечения . [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 и З8000 . (Более новые версии, скорее всего, не будут поддерживать некоторые из них.) 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, Seer и графический интерфейс отладчика HP Wildebeest (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 (например, clown). Они предлагают возможности, аналогичные отладчикам, имеющимся в IDE.
Некоторые другие инструменты отладки были разработаны для работы с GDB, например утечек памяти детекторы .
Внутренности [ править ]
GDB использует системный вызов с именем ptrace (это название является аббревиатурой от «трассировка процесса») для наблюдения и управления выполнением другого процесса, а также для проверки и изменения памяти и регистров процесса.
Общие команды GDB | Соответствующие вызовы ptrace |
---|---|
(gdb) start | PTRACE_TRACEME — делает родителя трассировщиком (вызываемым трассируемым объектом) |
(gdb) attach PID | PTRACE_ATTACH – присоединить к запущенному процессу |
(gdb) stop | kill(child_pid, SIGSTOP) (или PTRACE_INTERRUPT ) |
(gdb) continue | PTRACE_CONT |
(gdb) info registers | PTRACE_GET(FP)REGS(ET) и PTRACE_SET(FP)REGS(ET) |
(gdb) x | PTRACE_PEEKTEXT и PTRACE_POKETEXT |
Точка останова реализуется путем замены инструкции по заданному адресу памяти другой специальной инструкцией. Выполнение инструкции точки останова вызывает SIGTRAP.
Примеры команд [ править ]
$ gdb program
|
Отладка «программы» (из оболочки) |
---|---|
(gdb) run -v
|
Запустите загруженную программу с параметрами |
(gdb) bt
|
Backtrace (в случае сбоя программы) |
(gdb) info registers
|
Дамп всех регистров |
(gdb) 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 пример
И теперь двоичный файл можно запустить:
$ ./пример
Ошибка сегментации
Поскольку пример кода при выполнении генерирует ошибку сегментации , для проверки проблемы можно использовать GDB.
$ 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) run
Запуск программы: /path/example
Программа получила сигнал SIGSEGV, ошибка сегментации.
0x0000000000400527 в foo_len (s=0x0) в example.c:7
7 return strlen (s);
(gdb) напечатайте s
$ 1 = 0x0
Проблема присутствует в строке 7 и возникает при вызове функции strlen
(поскольку его аргумент, s
, является NULL
).
В зависимости от реализации strlen ( встроенной или нет) вывод может быть разным, например:
GNU gdb (GDB) 7.3.1
Авторские права (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:7
# 2 0x0804845a в основном ( argc = <оптимизированный вывод>, argv = <оптимизированный вывод> ) в example.c:14
Чтобы решить проблему, переменная 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 теперь дает правильный результат:
$ 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) запустить
Стартовая программа: /path/example
размер = 21
[Низший 1 (процесс 14290) завершился нормально]
GDB печатает вывод printf
на экране, а затем сообщает пользователю, что программа завершилась нормально.
См. также [ править ]
- Библиотека дескрипторов двоичных файлов (libbfd)
- dbx
- DDD , графический интерфейс для GDB и других отладчиков.
- gdbserver
- LLDB
Ссылки [ править ]
- ^ Жоэль Бробекер (3 марта 2024 г.). «GDB 14.2 выпущен!» . Проверено 3 марта 2024 г.
- ^ «Документация GDB — Поддерживаемые языки» . Архивировано из оригинала 28 декабря 2017 г. Проверено 28 ноября 2011 г.
- ^ «Документация GDB — Резюме» . Архивировано из оригинала 1 июля 2012 г. Проверено 28 ноября 2011 г.
- ^ Перейти обратно: а б «Лекция Ричарда Столлмана в Королевском технологическом институте, Швеция (30 октября 1986 г.)» . Проверено 21 сентября 2006 г.
Затем, когда GNU Emacs стал достаточно стабильным, что в общей сложности заняло около полутора лет, я начал возвращаться к другим частям системы. Я разработал отладчик, который назвал GDB, который представляет собой символический отладчик для кода C, который недавно поступил в распространение. Этот отладчик во многом соответствует духу DBX, отладчика, поставляемого с Berkeley Unix.
- ^ «Джон Гилмор (активист)» . Hyperleap.com . Архивировано из оригинала 26 февраля 2021 г. Проверено 13 октября 2020 г.
- ^ «Руководящий комитет ГББ» . Проверено 11 мая 2008 г.
- ^ «Документация GDB — Резюме — Участники» . Архивировано из оригинала 29 сентября 2011 г. Проверено 1 декабря 2011 г.
- ^ «Примечания к выпуску GDB 7.0» . Проверено 28 ноября 2011 г.
- ^ Джоэл Бробекер (29 июля 2014 г.). «GDB 7.8 выпущен!» . Проверено 30 июля 2014 г.
- ^ «Обратная отладка с помощью GDB» . Проверено 20 января 2014 г.
- ^ «Как: удаленный последовательный протокол GDB: написание сервера RSP» (PDF) .
- ^ «Реализация удаленной заглушки» .
- ^ «Отладка ядра с помощью Dcons» .
Внешние ссылки [ править ]
- Официальный веб-сайт
- UltraGDB: отладка Visual C/C++ с помощью GDB в Windows и Linux. Архивировано 12 декабря 2017 г. на Wayback Machine.
- KGDB: отладчик уровня исходного кода ядра Linux
- Веб-сайт «MyGDB: GDB Frontend» на корейском языке.
- Плагин Visual Studio для отладки с помощью GDB.
- Сравнение интерфейсов GDB, 2013 г.
- Использование Eclipse в качестве интерфейса для отладчика GDB
Документация [ править ]
- Ричард М. Столлман , Роланд Пеш , Стэн Шебс и др., Отладка с помощью GDB ( Фонд свободного программного обеспечения , 2011) ISBN 978-0-9831592-3-0
- Внутреннее устройство ГБД
Учебники [ править ]
- Учебное пособие по GDB от RMS (Райан Майкл Шмидт, а не Ричард Мэтью Столлман )
- Учебное пособие по GDB