Команда Linux gdb
GDB (GNU Debugger) — наиболее часто используемый инструмент отладки программ в системах Linux. Он может помочь разработчикам:
- Отслеживать поток выполнения программы
- Устанавливать точки останова для приостановки выполнения программы
- Просматривать и изменять значения переменных
- Проанализируйте причины сбоев программ
- Изучите стек вызовов функций
GDB поддерживает множество языков программирования, включая C, C++, Objective-C, Fortran, Ada и т. д., и является незаменимым инструментом отладки для разработчиков Linux.
Установите gdb
В большинстве дистрибутивов Linux gdb можно легко установить через менеджер пакетов:
Примеры
sudo apt-get install gdb
# CentOS/RHEL
sudo yum install gdb
# Fedora
sudo dnf install gdb
# Arch Linux
sudo pacman -S gdb
После установки можно проверить, успешно ли прошла установка, с помощью следующей команды:
gdb --version
Скомпилируйте программу с возможностью отладки
Чтобы отлаживать программу с помощью gdb, необходимо добавить-gопция при компиляции для генерации отладочной информации:
gcc -g program.c -o program
-gЭта опция встраивает информацию об исходном коде в исполняемый файл, позволяя gdb сопоставлять машинные инструкции с исходным кодом.
Основные команды gdb
Запуск и выход из gdb
Примеры
gdb ./program
# Запустить gdb и подключиться к запущенному процессу
gdb -p PID
# Выйти из gdb
(gdb) quit
# Или сокращённо
(gdb) q
Запустить программу
Примеры
(gdb) run
# Или сокращённо
(gdb) r
# Запустить с аргументами
(gdb) run arg1 arg2
Управление точками останова
Примеры
(gdb) break 10
# Или сокращённо
(gdb) b 10
# Установить точку останова на входе в функцию
(gdb) break main
(gdb) break function_name
# Просмотреть все точки останова
(gdb) info breakpoints
# Удалить точки останова
(gdb) delete 1 # Удалить точку останова номер 1
(gdb) delete # Удалить все точки останова
Управление выполнением программы
Примеры
(gdb) continue
# Или сокращённо
(gdb) c
# Пошаговое выполнение (с заходом в функции)
(gdb) step
# Или сокращённо
(gdb) s
# Пошаговое выполнение (без захода в функции)
(gdb) next
# Или сокращённо
(gdb) n
# Завершить выполнение текущей функции и вернуться
(gdb) finish
Просмотреть код
Примеры
(gdb) list
# Или сокращённо
(gdb) l
# Просмотреть код рядом с указанной строкой
(gdb) list 15
# Просмотреть код указанной функции
(gdb) list main
Просмотреть переменные и память
Примеры
(gdb) print variable_name
# Или сокращённо
(gdb) p variable_name
# Изменить значение переменной
(gdb) print variable_name = new_value
# Просмотреть тип переменной
(gdb) ptype variable_name
# Просмотреть содержимое памяти
(gdb) x/10xw &variable # Просмотреть 10 слов в шестнадцатеричном формате
Анализ стека вызовов
Примеры
(gdb) backtrace
# Или сокращённо
(gdb) bt
# Переключиться на указанный кадр стека
(gdb) frame 2
# Или сокращённо
(gdb) f 2
Продвинутые методы отладки
Условная точка останова
Примеры
(gdb) break 10 if i == 5
Точки наблюдения
Примеры
(gdb) watch variable_name
# Пауза при чтении переменной
(gdb) rwatch variable_name
# Пауза при чтении или изменении переменной
(gdb) awatch variable_name
Многопоточная отладка
Примеры
(gdb) info threads
# Переключиться на указанный поток
(gdb) thread 2
# Разрешить выполнение только текущему потоку
(gdb) set scheduler-locking on
Отладка файлов дампа памяти
Примеры
gdb ./program core
# Просмотреть стек вызовов на момент сбоя
(gdb) bt
графический интерфейс gdb
gdb также поддерживает режим графического интерфейса, который можно запустить с помощью-tuioption:
gdb -tui ./program
Или переключиться на него во время использования:
Примеры
(gdb) layout asm # Отобразить окно ассемблера
(gdb) layout regs # Отобразить окно регистров
(gdb) layout split # Отобразить исходный код и ассемблер одновременно
Практическая настройка gdb
Вы можете добавить общие настройки в~/.gdbinitфайл:
Примеры
set print pretty on
# Установить размер истории
set history save on
set history size 1000
# Пользовательские команды
define printarray
set $i = 0
while $i < $arg0
printf "array[%d] = %dn", $i, $arg1[$i]
set $i = $i + 1
end
end
Устранение типичных проблем
Невозможно увидеть исходный код при отладке
- Убедитесь, что
-gопция используется во время компиляции - Проверьте, находится ли исходный код в том же месте, что и во время компиляции
- Используйте
directoryкоманда для добавления пути к исходному коду:
(gdb) directory /path/to/source
Отладка оптимизированного кода
Оптимизация может изменить порядок выполнения кода, что затрудняет отладку. При отладке рекомендуется отключить оптимизацию:
gcc -O0 -g program.c -o program
Итог
gdb — мощный инструмент отладки в Linux. Его освоение может значительно повысить эффективность отладки. В этой статье были представлены основы использования и распространённые команды gdb. Читателям рекомендуется закрепить эти знания на практике отладки. По мере накопления опыта вы обнаружите, что gdb может помочь решить различные сложные проблемы отладки.
Другие расширения
Справочник команд Linux