GNU-отладчик
Разработчик(и) | Проект GNU |
---|---|
Первоначальный выпуск | 1986 год |
Стабильная версия | 15.1 [1]
/ 7 июля 2024 г. |
Репозиторий | |
Написано в | С , С++ , Питон |
Операционная система | 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( "size of a = %lu\n", foo_len(a) );
exit( 0 );
}
Используя компилятор GCC в Linux , приведенный выше код необходимо скомпилировать с использованием -g
флаг, чтобы включить соответствующую отладочную информацию в сгенерированный двоичный файл, что позволяет проверить его с помощью GDB. Предполагая, что файл, содержащий приведенный выше код, называется example.c
, команда для компиляции может быть такой:
$ gcc example.c -Og -g -o example
И теперь двоичный файл можно запустить:
$ ./example
Segmentation fault
Поскольку код примера при выполнении генерирует ошибку сегментации , для проверки проблемы можно использовать GDB.
$ gdb ./example
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /path/example...done.
(gdb) run
Starting program: /path/example
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400527 in foo_len (s=0x0) at example.c:7
7 return strlen (s);
(gdb) print s
$1 = 0x0
Проблема присутствует в строке 7 и возникает при вызове функции strlen
(поскольку его аргумент, s
, является NULL
).
В зависимости от реализации strlen ( встроенной или нет) вывод может быть разным, например:
GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /tmp/gdb/example...done.
(gdb) run
Starting program: /tmp/gdb/example
Program received signal SIGSEGV, Segmentation fault.
0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6
(gdb) bt
#0 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6
#1 0x08048435 in foo_len (s=0x0) at example.c:7
#2 0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at 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 = "This is a test string";
printf( "size of a = %lu\n", foo_len(a) );
exit( 0 );
}
Перекомпиляция и повторный запуск исполняемого файла внутри GDB теперь дает правильный результат:
$ gdb ./example
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /path/example...done.
(gdb) run
Starting program: /path/example
size of a = 21
[Inferior 1 (process 14290) exited normally]
GDB печатает вывод printf
на экране, а затем сообщает пользователю, что программа завершилась нормально.
См. также
[ редактировать ]- Библиотека дескрипторов двоичных файлов (libbfd)
- dbx
- DDD , графический интерфейс для GDB и других отладчиков.
- gdbserver
- LLDB
Ссылки
[ редактировать ]- ^ Жоэль Бробекер (7 июля 2024 г.). «GDB 15.1 выпущен!» . Проверено 9 июля 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
Документация
[ редактировать ]- Ричард М. Столлман , Роланд Пеш , Стэн Шебс и др., Отладка с помощью GDB ( Фонд свободного программного обеспечения , 2011) ISBN 978-0-9831592-3-0
- Внутреннее устройство ГБД
Учебники
[ редактировать ]- Учебное пособие по GDB от RMS (Райан Майкл Шмидт, а не Ричард Мэтью Столлман )
- Учебное пособие по GDB