Что такое раздел стека в gdb

В gdb кажется, что все, что находится в разделе стека, всегда совпадает с регистром %rip. Например:

rip 0x0000555555554603
─── Stack ────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x0000555555554603 in main

И после выполнения si:

rip 0x0000555555554606
─── Stack ────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x0000555555554606 in main

Что такое раздел стека в gdb? Мне кажется, что это более или менее указатель инструкции (%rip) в текущей функции (и предыдущие %rip в стеке вызовов, которые не завершили выполнение). Это правильно, или что этот раздел говорит нам?

Если полезно, вот внешний интерфейс, который я использую в gdb, который называется gdb dashboard< /а>:

введите здесь описание изображения


person samuelbrody1249    schedule 22.08.2020    source источник
comment
Как вы заставили GDB отображать это? Это какой-то внешний интерфейс или часть режима TUI GDB? Это не часть обычного дисплея TUI layout reg. Но в любом случае это похоже на вывод команды GDB bt (backtrace).   -  person Peter Cordes    schedule 22.08.2020
comment
@PeterCordes обновил вопрос с его примером   -  person samuelbrody1249    schedule 22.08.2020
comment
Итак, это функция gdb-dashboard. Вероятно, просто показываю вам вывод bt или frame для сравнения.   -  person Peter Cordes    schedule 22.08.2020


Ответы (1)


Это стек вызовов. GDB позволяет вам видеть стек вызовов, чтобы вы могли понять, как вы оказались там, где вы находитесь (какие вызовы функций вы выполнили, чтобы добраться туда, где вы находитесь).

Стек вызовов — это список функций, которые были вызваны и еще не возвращены, начиная с текущей функции в кадре 0 и заканчивая основной в последнем кадре.

В вашем конкретном случае ваш стек вызовов является только основным, потому что вы не вызывали другие функции (или потому, что они уже вернулись). %rip указывает на текущую инструкцию, поэтому ваше местоположение в текущем фрейме всегда соответствует его содержимому.

person Omry    schedule 22.08.2020
comment
спасибо за это объяснение. В стеке вызовов, какая правильная терминология относится к родительской или дочерней функции? Например, если я нахожусь в кадре 1, как называется функция в кадре 0? на кадре 2 или выше? - person samuelbrody1249; 22.08.2020
comment
GDB называет это движением вверх или вниз на один кадр, причем вверх поднимает вас на один уровень вверх, к функции, которая вас вызвала, а вниз опускает вас на один уровень вниз, к функции, которую вы вызвали. Я не думаю, что есть другой термин, кроме как вверх или вниз. - person Omry; 22.08.2020
comment
спасибо, за пределами gdb (например, в c или asm) есть ли соглашение, отличное от up/down ? - person samuelbrody1249; 23.08.2020
comment
@ samuelbrody1249: ваш вызывающий объект — это родительская функция. Когда вы frame 1 восходите к своему родителю, frame 0 становится его потомком. Граф вызовов всей программы часто похож на дерево, но в общем случае это ориентированный граф, который может включать циклы. (например, корекурсивные функции, обратные вызовы.) - person Peter Cordes; 23.08.2020