Как использовать gdb для изучения стека/кучи?

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

Спасибо.

Ответ 1

Мой первый подход к использованию 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.

Ответ 2

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

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

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

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

Ответ 3

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

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

скомпилируйте мою программу с помощью отладочных символов:

gcc -g program.c -o program

выполните ddd:

ddd program

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

Ответ 4

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

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

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

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

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

Изучение стека