Как использовать GDB для изучения стека / кучи? - PullRequest
17 голосов
/ 06 октября 2010

Может ли кто-нибудь дать мне краткий обзор / указать мне документацию о способе проверки стека (и кучи?) Программы на C? Я думал, что это должно быть сделано с помощью GDB, но если есть и другие более простые альтернативы, то это тоже подойдет.

Спасибо.

Ответы [ 4 ]

15 голосов
/ 06 октября 2010

вы можете сбросить необработанную память с помощью команды 'x'

, поэтому, если вы хотите посмотреть биты стека или кучи, попробуйте что-то вроде

x/10b &stackvar
x/200b &heapvar-20

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

3 голосов
/ 06 октября 2010

Попробуйте использовать ddd. DDD Manual

ОК.Может быть, я уточню немного.Я использую это так.

скомпилируйте мою программу с символами отладки:

gcc -g program.c -o program

run ddd:

ddd program

В графическом интерфейсе вы можете делать всевещи, просмотр машинного кода, просмотр памяти и т. д.Смотреть по сторонам.В руководстве есть также раздел изучения стека.ddd предоставляет хороший интерфейс для изучения C-программы.

2 голосов
/ 09 февраля 2018

Просмотр стека: gdb> backtrace

Просмотр текущего кадра стека: gdb> info frame

Просмотр аргументов текущего кадра стека: gdb> info args

Просмотр локальной переменной текущегокадр стека: gdb> info locals

Перейти к родительскому кадру стека: gdb> frame 1

Исследование стека

2 голосов
/ 06 октября 2010

Мой первый подход к использованию GDB для отладки - установка точек останова.Это делается так:

prompt> gdb ./x_bstree.c
(gdb) #prompt
(gdb) b 123 #break at line 123
(gdb) r #start program

Теперь ваша программа останавливается в строке 123 вашей программы.Теперь вы можете исследовать переменные в стеке или куче, используя print.Для переменных стека просто используйте print <varname>.Для переменных кучи (указателей) используйте print <*varname>.Не уверен, что есть что-то особенное для изучения переменных стека / кучи?

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

Для всего остального есть обширная документация gdb , и многие сайты также предоставляют шпаргалки gdb

...