Когда gdb показывает что-то «в стеке»?

#assembly #stack #gdb #callstack #backtrace

#сборка #стек #gdb #callstack #обратная трассировка

Вопрос:

Со следующей сборкой:

 mov $2, %rax
push %rcx
call func
  

Раздел «стек» в gdb выглядит следующим образом:

 ─── Stack ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x0000000000400109 in func
[1] from 0x00000000004000be in _start
  

И не имеет значения, добавляю я или удаляю push %rcx инструкцию. Почему gdb показывает только «стек адресов функций» и не показывает никаких изменений в стеке при нажатии вручную? То есть и push %rcx и call func изменяют регистр стека rsp , но только последний фактически изменяет то, что gdb показывает в разделе «стек».

Не мог бы кто-нибудь, пожалуйста, объяснить причину этого?

Комментарии:

1. Это какая-то пользовательская модификация gdb, и она печатает стек вызовов , иначе известный как обратная трассировка. Он показывает только вызовы вложенных функций. Чтобы посмотреть на фактический стек, сделайте что-то вроде x/8x $rsp

2. @Jester: Да, но как он определяет, какие qwords в стеке из call , а какие из push , для написанного вручную asm без отладочной информации? Я бы предположил, что он может искать возможные обратные адреса, то есть значения, которые указывают на текстовый раздел? Или, может быть, OP не показывает нам достаточно полную картину.

Ответ №1:

Раздел «стек» в gdb выглядит следующим образом:

«Стек» здесь означает «стек вызовов», а не «память стека».