Jump to content

GNU-отладчик

(Перенаправлено с GDB )
GNU-отладчик
Разработчик(и) Проект GNU
Первоначальный выпуск 1986 год ; 38 лет назад ( 1986 )
Стабильная версия
15.1 [1]  Отредактируйте это в Викиданных / 7 июля 2024 г.
Репозиторий
Написано в С , С++ , Питон
Операционная система Unix-подобный , Windows
Тип Отладчик
Лицензия лицензия GPLv3
Веб-сайт www .gnu .org /программное обеспечение /gdb

( Отладчик 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 на экране, а затем сообщает пользователю, что программа завершилась нормально.

См. также

[ редактировать ]
  1. ^ Жоэль Бробекер (7 июля 2024 г.). «GDB 15.1 выпущен!» . Проверено 9 июля 2024 г.
  2. ^ «Документация GDB — Поддерживаемые языки» . Архивировано из оригинала 28 декабря 2017 г. Проверено 28 ноября 2011 г.
  3. ^ «Документация GDB — Резюме» . Архивировано из оригинала 1 июля 2012 г. Проверено 28 ноября 2011 г.
  4. ^ Перейти обратно: а б «Лекция Ричарда Столлмана в Королевском технологическом институте, Швеция (30 октября 1986 г.)» . Проверено 21 сентября 2006 г. Затем, когда GNU Emacs стал достаточно стабильным, что в общей сложности заняло около полутора лет, я начал возвращаться к другим частям системы. Я разработал отладчик, который назвал GDB, который представляет собой символический отладчик для кода C, который недавно поступил в распространение. Этот отладчик во многом соответствует духу DBX, отладчика, поставляемого с Berkeley Unix.
  5. ^ «Джон Гилмор (активист)» . Hyperleap.com . Архивировано из оригинала 26 февраля 2021 г. Проверено 13 октября 2020 г.
  6. ^ «Руководящий комитет ГББ» . Проверено 11 мая 2008 г.
  7. ^ «Документация GDB — Резюме — Участники» . Архивировано из оригинала 29 сентября 2011 г. Проверено 1 декабря 2011 г.
  8. ^ «Примечания к выпуску GDB 7.0» . Проверено 28 ноября 2011 г.
  9. ^ Джоэл Бробекер (29 июля 2014 г.). «GDB 7.8 выпущен!» . Проверено 30 июля 2014 г.
  10. ^ «Обратная отладка с помощью GDB» . Проверено 20 января 2014 г.
  11. ^ «Как: удаленный последовательный протокол GDB: написание сервера RSP» (PDF) .
  12. ^ «Реализация удаленной заглушки» .
  13. ^ «Отладка ядра с помощью Dcons» .
[ редактировать ]

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

[ редактировать ]

Учебники

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 332c666748c32c4be9723267dac30cc2__1722594960
URL1:https://arc.ask3.ru/arc/aa/33/c2/332c666748c32c4be9723267dac30cc2.html
Заголовок, (Title) документа по адресу, URL1:
GNU Debugger - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)