INTERESTING FACTS BLOG

Painting and Sketches

Краткое руководство Beej к GDB

Оригинальная статья: Beej's Quick Guide to GDB

Автор статьи: Beej Jorgensen

Источник: http://beej.us/guide/bggdb/

Это очень быстрое и грязное руководство, предназначенное для начала работы с GNU Debugger, gdb, из командной строки в терминале. Часто gdb запускается через IDE, но многие люди там избегают IDE по разным причинам, и этот урок для вас!

Опять же, это только руководство по началу работы. Намного больше узнать надо о том, что делает отладчик, чем написано в этих нескольких коротких абзацах. Ознакомьтесь с вашими «man» страницами или онлайн-ресурсами, перечисленными ниже, для получения дополнительной информации.

Это учебное пособие предназначено для чтения в порядке, но не включая раздел «Misc».

 

Содержание

Компилирование 

Вы должны сообщить своему компилятору компилировать свой код с включенной символической отладочной информацией. Вот как это сделать с помощью gcc, с -g switch:

$ gcc -g hello.c -o hello

$ g++ -g hello.cpp -o hello

 После того, как вы это сделали, вы сможете просматривать списки программ в отладчике.

Дополнительная информация

Ознакомьтесь с официальной документацией GDB для получения дополнительной информации, чем вы можете встряхнуть палку!

Кроме того, хорошим GNU GDB front-end является DDD, DataDisplayDebugger.

Лицензия

Краткое руководство Beej к GDB от зала Брайана «Beej Jorgensen» лицензировано по лицензии Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License.

Запуск Отладчика

Во-первых: вы можете ввести help в любом gdb prompt и получить дополнительную информацию. Кроме того, вы можете ввести quit для выхода из отладчика. Наконец, просто нажав RETURN, повторите введенную последнюю команду. Теперь давайте запустим его!

Существует несколько способов запуска отладчика (например, если вы были IDE, вы можете запустить его с особым режимом, который не так удобен для людей), но я расскажу о двух из них: режим консоли ванили и режим ручного графического интерфейса. Графический интерфейс лучше, но давайте быстро рассмотрим простой и запустим программу, названную hello в отладчике:

$ gdb hello
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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 "i486-slackware-linux"...
(gdb) run
Starting program: /home/beej/hello 
Hello, world!

Program exited normally.
(gdb) 

Последняя строка - это gdb prompt, ожидающее, когда вы скажете, что делать. Введите r или run для запуска программы. (gdb позволяет сокращать команды до тех пор, пока они не станут двусмысленными).

Чтобы начать работу с neato и настоятельно рекомендуемым графическим интерфейсом, запустите отладчик с помощью gdb -tui. (Для многих примеров, приведенных ниже, я показываю вывод режима немого терминала gdb, но в реальной жизни я использую только режим TUI.)

И вот скриншот того, что вы увидите, примерно: 

code

Все нормальные команды gdb будут работать в режиме графического интерфейса, а кроме того, клавиши со стрелками и клавиши pgup / pgdown будут прокручивать окно источника (если у него есть фокус, который он делает по умолчанию). Кроме того, вы можете изменить, какой файл или функция отображается в исходном окне, указав list команд в качестве аргумента, например «list hello.c: 5, чтобы открыть файл hello.c в строке 5. ( См. «Точки останова» ниже, для мест выборки - те же местоположения, которые работают с точками останова, будут работать с командой list.) В качестве примечания стороны list также работает в режиме терминала.

Теперь обратите внимание, что мы передали имя исполняемого файла в командной строке. Другой вариант, который у вас есть, - просто запустить gdb, не имея ничего другого в командной строке, а затем передать ему команды file hello, и это приведет к загрузке «hello» исполняемого файла.

Аргументы командной строки! Что делать, если вам нужно что-то сделать в argv в своей программе? Передайте их в качестве аргументов в команду run при запуске выполнения:

$ gdb hello
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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 "i486-slackware-linux"...
(gdb) run arg1 arg2
Starting program: /home/beej/hello arg1 arg2
Hello, world!

Program exited normally.
(gdb) 

Обратите внимание, где указано «Starting Program» выше, это показывает, что аргументы «arg1» и «arg2» передаются «hello».

Контрольные точки

Просто начать отладчик, чтобы запустить программу прямо, не очень полезно - нам нужно остановить выполнение и перейти в степпинг.

Во-первых, прежде чем вы выполните команду run, вам нужно установить точку останова, которую вы хотите остановить. Вы используете команду break или b и указываете местоположение, которое может быть именем функции, номером строки или исходным файлом и номером строки. Это примеры местоположений, которые используются различными командами, а также break

 

break main

Разрыв в начале функции main()

break 5 Перерыв в строке 5 текущего файла
break hello.c:5 Перерыв в строке 5 hello.c

 

Итак, для этого теста давайте установим точку останова в main() и запустим программу:

$ gdb hello
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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 "i486-slackware-linux"...
(gdb) b main
Breakpoint 1 at 0x8048395: file hello.c, line 5.
(gdb) r
Starting program: /home/beej/hello 

Breakpoint 1, main () at hello.c:5
5		printf("Hello, world!\n");
(gdb)

Как вы видите, мы пришли к main(), и выполнение остановилось в точке останова, которую мы установили там. Если вы работаете в режиме терминала, gdb напечатает строку, которую он выполнит следующим образом. Если вы работаете в прохладном графическом режиме, то строка, которую он будет выполнять дальше, будет выделена в исходном окне.

Чтобы перечислить текущие точки останова, используйте команду info, например: «info breakpoints» (или более короткий «i b»): 

(gdb) b main
Breakpoint 1 at 0x8048395: file hello.c, line 5.
(gdb) i b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048395 in main at hello.c:5

Чтобы очистить точку останова, используйте команду clear с местом останова. Вы также можете очистить точку останова по номеру командой delete.

Кроме того, вы можете enable или disable точки останова, хотя эти две команды принимают номер точки останова в качестве аргумента, а не местоположение! Статус включения / отключения точки останова отображается в столбце «Enb» в списке точек останова.

(gdb) i b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048395 in main at hello.c:5
(gdb) disable 1
(gdb) i b
Num     Type           Disp Enb Address    What
1       breakpoint     keep n   0x08048395 in main at hello.c:5
(gdb) clear main
Deleted breakpoint 1 
(gdb) i b
No breakpoints or watchpoints.

Шаги вокруг

Когда выполнение останавливается в точке останова, вы можете сказать отладчику сделать несколько вещей. Начнем с next команды (или n). Эта команда переводит вас к следующему оператору в текущей функции (или возвращается к вызывающей функции, если вы отступили от конца функции.) Вот пример запуска; помните, что gdb печатает строку, которую он выполнит следующим образом перед «(gdb)» prompt. Также обратите внимание, что, когда мы запускаем next строку printf(), мы видим вывод.

(gdb) b main
Breakpoint 1 at 0x8048395: file hello.c, line 5.
(gdb) r
Starting program: /home/beej/hello 

Breakpoint 1, main () at hello.c:5
5		printf("Hello, world!\n");
(gdb) next
Hello, world!
7		return 0;
(gdb) next
8	}
(gdb) next
0xb7d6c6a5 in __libc_start_main () from /lib/libc.so.6
(gdb) next
Single stepping until exit from function __libc_start_main, 
which has no line number information.

Program exited normally.
(gdb) 

(Этот странный материал в конце о __libc_start_main() показывает вам, что была другая функция, которая вызвала вашу функцию main()! Она не была скомпилирована с информацией об отладке, поэтому мы не можем видеть источник, но мы все равно можем пройти через нее - что мы делаем - и программа выйдет нормально.)

Теперь обратите внимание, что next steps over вызовами функций. Это не означает, что функция не вызвана; это означает, что next функция будет выполняться до тех пор, пока она не будет выполнена, а затем вернет вас к следующей строке в вашей текущей функции.

Что делать, если у вас есть функция, с которой вы хотите перейти от текущей функции, и отслеживать эту функцию по очереди? Для этого используйте команду step (или s). Он работает так же, как и следующий, за исключением того, что он выполняет функции.

Предположим, вы устали от одного шага, и просто хотите, чтобы программа запускалась снова. Используйте команду continue (или c) для продолжения выполнения.

Что делать, если программа работает, но вы забыли установить точки останова? Вы можете нажать CTRL-C, и это остановит программу, где бы она ни находилась, и вернет вам «(gdb)» prompt. В этот момент вы можете где-то настроить правильную точку останова и продолжить (continue) эту точку останова.

Одним из последних ярлыков является то, что просто нажатие RETURN повторит введенную последнюю команду; это позволит вам печатать снова и снова.

Изучение переменных

Если у вас есть переменные, которые вы хотите проверить в ходе прогона, вы можете отобразить display их, но только если переменная в настоящее время находится в области видимости. Каждый раз, когда вы вводите код, будет отображаться значение переменной (если оно находится в области видимости).

(Следующий вывод не позволяет получить исходный код между строками для ясности - это то, что вы увидите в режиме графического интерфейса. Представьте, что вы видите подсветку, отскакивающую вокруг исходного кода, когда вы используете это :)

(gdb) b main
Breakpoint 1 at 0x8048365: file hello.c, line 5.
(gdb) r
Starting program: /home/beej/hello 

Breakpoint 1, main () at hello.c:5
(gdb) disp i
1: i = -1207447872
(gdb) next
1: i = 1
(gdb) next
1: i = 1
(gdb) next
1: i = 2
(gdb) next
1: i = 2
(gdb) next
1: i = 4
(gdb) next
1: i = 4
(gdb) next
1: i = 4
(gdb) 

Число слева от «i», выше, является номером дисплея переменной. Используйте этот номер, чтобы отключить (undisplay) переменную. Если вы забыли номера дисплея, вы можете ввести информационный дисплей (info display), чтобы получить их:

(gdb) b main
Breakpoint 1 at 0x8048365: file hello.c, line 5.
(gdb) r
Starting program: /home/beej/hello 

Breakpoint 1, main () at hello.c:5
(gdb) display i
1: i = -1207447872
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1:   y  i
(gdb) undisplay 1
(gdb)

Если вы просто хотите разобраться в значении переменной, вы можете ее распечатать (print). Здесь мы видим, что значение «i» равно 40:

(gdb) print i
$1 = 40
(gdb)

(«$» c номером после того, как это что-то значит, но это не важно для новичков.)

Также есть удобная команда printf, которую вы можете использовать для лучшего форматирования вывода, если хотите:

(gdb) printf "%d\n", i
40
(gdb) printf "%08X\n", i
00000028
(gdb)

Misc Материал

Это материал, который не подходит для предыдущих разделов, но он достаточно забав, чтобы что-то перечислить.

Манипуляция стеками

Команда backtrace (или bt) покажет вам текущий стек вызовов функций с текущей функцией вверху и вызывающими абонентами под ним:

(gdb) backtrace
#0  subsubfunction () at hello.c:5
#1  0x080483a7 in subfunction () at hello.c:10
#2  0x080483cf in main () at hello.c:16
(gdb)

Введите help stack для получения дополнительной информации о том, что вы можете с этим сделать.

Дополнительные методы шага

Чтобы выйти из текущей функции и вернуться к вызывающей функции, используйте команду finish.

Чтобы выполнить одну командную команду, используйте команду stepi.

Чтобы продолжить в определенном месте, используйте команду advance, указав расположение, как показано в разделе" Breakpoints" выше. Вот пример, который продвигается от текущего местоположения до вызова функции subsubfunction():

Breakpoint 1, main () at hello.c:15
15		printf("Hello, world!\n");
(gdb) advance subsubfunction
Hello, world!
subsubfunction () at hello.c:5
5		printf("Deepest!\n");
(gdb) 

advance - это просто сокращение для «продолжения этой временной точки останова».

Прыжки к произвольной секции кода

Команда jump работает точно так же, как и continue, за исключением того, что для перехода в качестве аргумента требуется местоположение. (См. Раздел «Точки останова», выше, для получения дополнительной информации о местах.)

Если вам нужно остановиться в пункте назначения прыжка, сначала установите точку останова.

Изменение переменных и значений во время выполнения

Вы можете использовать команду set variable с выражением для оценки, и это позволяет вам изменить значение переменной во время прогона. Вы также можете сократить это, просто используя set с заключенным в скобки выражением после него:

Breakpoint 1, main () at hello.c:15
15		int i = 10;
(gdb) print i
$1 = -1208234304
(gdb) set (i = 20)
(gdb) print i
$2 = 20
(gdb) set variable i = 40
(gdb) print i
$3 = 40
(gdb) 

Это, наряду с командой jump, может помочь вам повторить разделы кода без перезапуска программы.

Аппаратные точки наблюдения

Аппаратные точки наблюдения - это специальные точки останова, которые будут срабатывать при каждом изменении выражения. Часто вы просто хотите знать, когда переменная изменяется (записывается), и для этого вы можете использовать команду watch:

Breakpoint 1, main () at hello.c:5
5		int i = 1;
(gdb) watch i
Hardware watchpoint 2: i
(gdb) continue
Continuing.
Hardware watchpoint 2: i

Old value = -1208361280
New value = 2
main () at hello.c:7
7		while (i < 100) {
(gdb) continue
Continuing.
Hardware watchpoint 2: i

Old value = 2
New value = 3
main () at hello.c:7
7		while (i < 100) {
(gdb)

Обратите внимание, что watch принимают выражение в качестве аргумента, поэтому вы можете поместить там имя переменной или нечто более сложное, например *(p+5) или [15]. Я даже пробовал его с условными выражениями вроде i> 10, но имел смешанные результаты.

Вы можете получить список точек наблюдения с info break или info watch, и вы можете удалить их по номеру с помощью команды delete.

Наконец, вы можете использовать rwatch для обнаружения, когда переменная читается, и вы можете использовать awatch для обнаружения, когда переменная читается или записывается.

Присоединить к запущенному процессу

Если ваша программа уже идет, и вы хотите ее остановить и отладить, сначала вам понадобится идентификатор процесса (PID), который будет числом. (Получите его от команды ps от Unix.) Затем вы будете использовать команду attach с PID для присоединения (и разрыва) запущенной программы.

Для этого вы можете просто запустить gdb без аргументов.

В следующем полном запуске вы заметите несколько вещей. Сначала я присоединяюсь к запущенному процессу, и он говорит мне, что он находится в некоторой функции в глубине, называемой __nanosleep_nocancel(), что не слишком удивительно, так как я назвал sleep() в моем коде. Действительно, запрос на backtrace показывает именно этот стек вызовов. Поэтому я говорю, что закончу (finish) пару раз, чтобы вернуться к main().

$ gdb
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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 "i486-slackware-linux".
(gdb) attach 3490
Attaching to process 3490
Reading symbols from /home/beej/hello...done.
Reading symbols from /lib/libsafe.so.2...done.
Loaded symbols for /lib/libsafe.so.2
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libdl.so.2...done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
0xb7eab21b in __nanosleep_nocancel () from /lib/libc.so.6
(gdb) backtrace 
#0  0xb7eab21b in __nanosleep_nocancel () from /lib/libc.so.6
#1  0xb7eab05f in sleep () from /lib/libc.so.6
#2  0x080483ab in main () at hello.c:10
(gdb) finish
Run till exit from #0  0xb7eab21b in __nanosleep_nocancel ()
   from /lib/libc.so.6
0xb7eab05f in sleep () from /lib/libc.so.6
(gdb) finish
Run till exit from #0  0xb7eab05f in sleep () from /lib/libc.so.6
0x080483ab in main () at hello.c:10
10			sleep(1);
(gdb) list
5	{
6		int i = 1;
7	
8		while (i < 60) {
9			i++;
10			sleep(1);
11		}
12	
13		return 0;
14	}
(gdb) print i
$1 = 19
(gdb) quit
The program is running.  Quit anyway (and detach it)? (y or n) y
Detaching from program: /home/beej/hello, process 3490

Обратите внимание, что когда я вернусь к main(), я распечатаю значение i, а 19 - потому что в этом случае программа работает в течение 19 секунд, и я получаю инкремент раз в секунду.

Как только мы покинем debugger и отделимся от программы, программа вернется к нормальной работе.

Смешайте это с set variable, выше, и у вас есть сила!

Использование Coredumps для анализа Postmortem

Предположим, вы создаете и запускаете программу, и по какой-то причине она сбрасывает ядро:

$ cc -g -o foo foo.c
$ ./foo
Segmentation fault (core dumped)

Это означает, что основной файл (с моментальным снимком памяти с момента сбоя) был создан с именем «core». Если вы не получаете основной файл (то есть он говорит только «Ошибка сегментации» и не создается основной файл), у вас может быть слишком низкий уровень ulimit; попробуйте ввести ulimit -c limited в командной строке.

Вы можете запустить gdb с параметром -c, чтобы указать основной файл:

$ gdb -tui -c core foo

И, если в режиме TUI вас встретит экран информации, рассказывающий вам, почему программа вышла («сигнал 11, ошибка сегментации»), и подсветка будет на линии нарушения. (В режиме немой клеммы печатается строка нарушения.)

В этом примере я печатаю переменную, вызывающую проблему. Действительно, это NULL:

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

Функции окна

В режиме TUI вы можете получить список существующих окон с помощью команды info win. Затем вы можете изменить, какое окно фокусируется с помощью команды focus (или fs). focus принимает либо имя окна, либо «prev» или «next» в качестве аргумента. Допустимыми именами окна являются «SRC» (исходное окно), «CMD» (окно команд), «REGS» (окно регистров) и «ASM» (окно сборки). См. Следующий раздел о том, как использовать эти другие окна.

Обратите внимание, что когда окно SRC имеет фокус, клавиши со стрелками перемещают исходный код, но когда окно CMD имеет фокус, клавиши со стрелками будут выбирать предыдущую и следующую команды в истории команд. (Для записи команды для перемещения отдельных окон SRC и отдельных страниц +-<, and >).

(gdb) info win
        SRC     (36 lines)  
        CMD     (18 lines)
(gdb) fs next
Focus set to CMD window.
(gdb) info win
        SRC     (36 lines)
        CMD     (18 lines)  
(gdb) fs SRC
Focus set to SRC window.
(gdb)

(Названия окон являются чувствительными к регистру.)

Команда winheight (или wh) задает высоту определенного окна, но мне не повезло, что это хорошо работает.

Отображать регистры и сборку

В режиме TUI команда layout управляет окнами, которые вы видите. Кроме того, tui reg позволяет управлять окном регистра и открывает его, если он еще не открыт.

Команды:

layout src Стандартная планировка - источник сверху, окно команды внизу
layout asm Точно так же, как планировка «src», кроме окна сборки сверху
layout split Три окна: источник сверху, сборка посередине и команда внизу
layout reg Открывает окно регистрации поверх источника или сборки, в зависимости от того, что было открыто последним
tui reg general Показать общие регистры
tui reg float Показать регистры с плавающей запятой
tui reg system Показать «системные» регистры
tui reg next Показать следующую страницу регистров - это важно, потому что могут быть страницы регистров, которые не входят в «общие», «плавающие» или «системные» наборы

 

Вот отличный скриншот, чтобы поднять аппетит, показывая источник и сборку в режиме «split»:

Код сборки поставляется в двух вариантах на компьютерах Intel: Intel и AT&T. Вы можете установить, какой из них отображается в окне разборки, с set disassembly-flavor. Допустимыми значениями являются «intel» и «att». Если у вас уже открыто окно сборки, вам придется закрыть его и снова открыть (например, layout src, за которым следует layout split).

Чтобы отображать регистры в режиме терминала, введите info registers для целых регистров или info all-registers для всех.

Написание интерфейса

Вы думаете: «Ого, это довольно круто, но я могу написать интерфейс для убийцы для этой вещи, которая работала намного лучше! Как мне это сделать?»

GDB поддерживает то, что он называет «интерпретатор машинного интерфейса», или GDB/MI. Интерпретатор выбирается в командной строке gdb с помощью переключателя --interpreter.

В основном вы запускаете gdb и читаете команды и результаты в и из него (возможно, используя каналы). Довольно просто.

Для получения подробной информации см. Документацию GDB.

Краткий справочник

Параметры команды выделены курсивом. Дополнительные параметры заключены в квадратные скобки. Все команды могут быть сокращены до тех пор, пока они не станут двусмысленными.

Этот список очень неполный и показывает только то, о чем говорится в этом уроке!

Help Команды

help команд получить справку по определенной команде
apropos ключевое слово Search поможет для определенного ключевого слова

Запуск и выход

gdb [-tui] [-c core] [exename] (Команда Unix) Запустите gdb в исполняемом или автономном режиме; указать «-tui», чтобы запустить GUI TUI; укажите «-c» с именем основного файла, чтобы увидеть, где произошел сбой
run [arg1] [arg2] [...] Запустить текущую загруженную программу с данными командной строки
quit Выход из отладчика
file exename Загрузите исполняемый файл по имени

Точки останова и точки наблюдения

break location Установите точку останова в месте, номере линии или файле (например, «main», «5» или «hello.c: 23»)
watch expression Разрыв, когда переменная записывается
rwatch expression Разрыв, когда переменная считывается
awatch expression Разрыв, когда переменная записывается или читается
info break Отобразить точку останова и информацию о точках наблюдения и номера
info watch То же, что и info break
clear location Очистить точку останова от местоположения
delete num Удалить точку останова или точку наблюдения по номеру

Stepping and Running

next Выполнить следующую строку этой функции
step Шаг в функцию на этой линии, если это возможно
stepi Шаг с одной инструкцией по сборке
continue Продолжайте бежать отсюда
CTRL-C Прекратить работу, где бы вы ни находились
finish Работает до конца текущей функции
advance location Переход к местоположению, номеру строки или файлу (например, «somefunction», «5» или «hello.c: 23»)
jump location Так же, как и ​​​​​​continue, исключением jump в конкретное место.

Изучение и изменение переменных

display expression Отображение значения переменной или выражения на каждом шаге программы - выражение должно иметь смысл в текущей области
info display Показать список отображаемых в настоящее время выражений и их число
undisplay num Остановить показ выражения, идентифицированного его номером (см. info display)
print expression Вывести значение переменной или выражения
printf formatstr expressionlist Сделайте некоторый отформатированный вывод с помощью printf() e.g. printf "i = %d, p = %s\n", i, p
set variable expression Установить значение переменной, например. установить переменную x=20
set (expression) Работает как set variable

Команды окна

info win Показывает текущую информацию об окне
focus winname Устанавливать фокус на определенное имя bby окна («SRC», «CMD», «ASM» или «REG») или по положению («next» или «prev»)
fs Псевдоним для focus
layout type Установите макет окна («src», «asm», «split» или «reg»)
tui reg type Установить макет окна регистра ("general", "float", "system", or "next")
winheight val Установите высоту окна (либо абсолютное значение, либо относительное значение, предваряемое «+» или «-»)
wh Псевдоним для ​​​​​​​winheight
set disassembly-flavor flavor Установите внешний вид разборки. На компьютерах Intel действительные вкусы - это intel и att

Команды Misc

RETURN Нажмите RETURN, чтобы повторить последнюю команду
backtrace Показывать текущий стек
bt Псевдоним для ​​​​​​​backtrace
attach pid Присоединить к уже запущенному процессу с помощью PID
info registers Вывести целочисленные регистры на экран
info all-registers Сброс всех регистров на экран