Самые сложные / полезные команды для отладчика gdb [закрыто]

138

Можете ли вы публиковать свои самые сложные и полезные команды при запуске отладчика, такого как gdb или dbx.

Виджай
источник
Я нашел, что эта документация хороша. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Рик

Ответы:

136
  1. backtrace full : полная обратная трассировка с локальными переменными
  2. вверх , вниз , кадр : перемещение по кадрам
  3. смотреть : Приостановить процесс при выполнении определенного условия
  4. установить красивую печать : распечатывает красиво отформатированный исходный код C
  5. установить вход : журнал сеанса отладки, чтобы показать другим для поддержки
  6. установить массив печати : Печать красивого массива
  7. конец : Продолжать до конца функции
  8. включить и отключить : включить / отключить точки останова
  9. tbreak : один раз прервать , а затем удалить точку останова
  10. где : номер строки, выполняемой в данный момент
  11. info locals : просмотр всех локальных переменных
  12. info args : просмотреть все аргументы функции
  13. list : просмотреть исходный код
  14. rbreak : прерывание функции, соответствующей регулярному выражению
Рамкумар Рамачандра
источник
7
info locals- Просмотр всех локальных переменных; список - просмотреть источник; rbreak - прерывание функции, соответствующей регулярному выражению.
Пол Биггар,
source / path / to / macro / file И все мои изящные макросы помогут мне отладить за секунды.
Sudhanshu
1
set print object onдля полиморфных элементов, и set print elements 0это две команды, которые я использую очень часто. Довольно полезно.
Кирилл Киров
1
Также t a a bt(значение thread apply all backtrace). Может использоваться (почти) со всеми другими командами. Особенно полезно с bt full.
Кирилл Киров
102

Запустите gdb с текстовым пользовательским интерфейсом

gdb -tui
Амро
источник
21
Не могу поверить, что эта функция ускользнула от меня все эти годы. Спасибо Спасибо спасибо!
DevSolar
Спасибо, Вы сэкономили мне много времени .. Замечательно ....
Суджин
1
И еще: <минус> RET
SullX
1
или используйте cgdb
Patryk
очень приятные особенности. Пропустил пока ...
PraveenMax
44

Начиная с gdb 7.0, существует обратимая отладка , поэтому ваши новые любимые команды:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.
Пол Биггар
источник
21

Вместо запуска GDB с параметром «-tui» вы также можете через некоторое время переключиться в текстовый режим, набрав «wh».

Мартин
источник
3
Ctrl-a a, чтобы вернуться в «нормальный» вид командной строки!
Кевин
2
"-" можно использовать вместо "wh". Чем короче, тем лучше .. :)
raj_gt1
6
Ctrl-a a? Это шутка? Больше похоже на tmux/ screencommand. И у меня не работает. Он должен быть один из , как в документации : C-x C-a, C-x a, C-x A.
x-yuri
На самом деле C-x a. Вы также можете переключать представления с помощью C-x 1и C-x 2в режиме tui, чтобы также видеть сборку (при необходимости).
Сэм Уитлок,
16

thread apply all btили thread apply all print $pc: Чтобы быстро узнать, что делают все потоки.

Olof
источник
Это была команда, которую я искал очень-очень давно! Действительно противно проверять все 30 потоков по очереди!
tothphu
6

Использование -command=<file with gdb commands>опции при запуске gdb. То же, что и -x <command file>. Этот командный файл может содержать команды gdb, такие как точки останова, параметры и т. Д. Полезно в случае, если конкретный исполняемый файл должен быть подвергнут последовательным запускам отладки с использованием gdb.

рагава
источник
Вы также можете использовать -iexопцию для добавления отдельных команд в командную строку gdb.
doug65536
5

скриптинг gdb - хороший трюк, кроме этого мне нравится включать / выключать блокировку планировщика, чтобы предотвратить запуск других потоков, когда вы входите в один.

Бен
источник
1
Как установить блокировку планировщика?
deft_code 01
3
set scheduler-locking onвнутри gdb
Бен
как сделать это по умолчанию? Я пробовал использовать .gdbinit, но gdb печатает /home/omry/.gdbinit:1: Ошибка в исходном командном файле: Target 'None' не может поддерживать эту команду.
Omry Yadan
4
  • Использование .gdbinit (стартовый файл, в котором можно писать макросы и вызывать из gdb). Поместите .gdbinit в свой домашний каталог, чтобы он загружался каждый раз при загрузке gdb
  • info thread, чтобы перечислить все активные потоки, и f (#) -> # номер потока, на который вы хотите переключиться

  • иногда я использую gdb для преобразования из шестнадцатеричного в десятичное или двоичное, это очень удобно, вместо того, чтобы открывать калькулятор

    • p / d 0x10 -> дает десятичный эквивалент 0x10
    • p / t 0x10 -> двоичный эквивалент 0x10
    • p / x 256 -> шестнадцатеричный эквивалент 256
суббул
источник
4

Вместо того, чтобы запускать gdb с опцией -tui, чтобы увидеть дочерний процесс, содержащий экран, который выделяет, где исполняемая строка кода находится в вашей программе, переходите к этой функции и выходите из нее с помощью Cx o и Cx a. Это полезно, если вы используете эту функцию и временно не используете ее, поэтому вы можете использовать стрелку вверх для получения предыдущей команды.

Роза Перроне
источник
2
вы можете изменить фокус на командное окно, используя focus cmdтак, чтобы стрелки вверх / вниз работали. Вы переключаетесь обратно, используя focus src.
Натан Феллман,
3

Это может быть полезно, я уверен, что это можно улучшить, помогите добро пожаловать:

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)
Эльмарко
источник