Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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.

Примеры команд [ править ]

Пример сеанса [ править ]

Рассмотрим следующий исходный код, написанный на 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 теперь дает правильный результат:

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

См. Также [ править ]

  • Библиотека дескрипторов двоичных файлов (libbfd)
  • dbx
  • DDD , графический интерфейс для GDB и других отладчиков
  • gdbserver

Ссылки [ править ]

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