Ответ 1
(gdb) информационный кадр
уровень стека 0
- frame num in backtrace, 0 - текущий исполняемый кадр, который растет вниз, в соответствии со стеком.
кадр на 0xb75f7390
- начальный адрес памяти этого фрейма стека
eip = 0x804877f в базе:: func() (testing.cpp: 16); сохраненный eip 0x804869a
-
eip - это регистр для следующей команды для выполнения (также называемый счетчиком программ). поэтому в этот момент следующий для выполнения находится в "0x804877f", который является строкой 16 test.cpp.
-
сохраненный eip "0x804869a" - это так называемый "обратный адрес", то есть инструкция для возобновления в кадре стека вызывающего абонента после возврата из этого стека вызовов. Он помещается в стек по команде "CALL" (сохранить ее для возврата).
, вызываемый по кадру при 0xb75f73b0
- адрес кадра стека вызывающего абонента
исходный язык С++
- используемый язык
Аргист в 0xb75f7388, args: this = 0x0
- начальный адрес аргументов
Локали на уровне 0xb75f7388,
адрес локальных переменных.
Предыдущий фрейм sp равен 0xb75f7390
здесь указатель стека предыдущего кадра указывает на (кадр вызывающего абонента) в момент вызова, это также начальный адрес памяти вызываемого кадра стека.
Сохраненные регистры: Это два адреса в стеке вызываемых, для двух сохраненных регистров.
-
ebp при 0xb75f7388 это адрес, в котором сохранен регистр "ebp" кадра стека вызывающего абонента (обратите внимание, что это регистр, а не адрес стека вызывающего абонента). то есть соответствует "PUSH% ebp". "ebp" - это регистр, который обычно считается стартовым адресом локалей этого фрейма стека, которые используют "смещение" для адреса. Другими словами, операции локальных переменных используют этот "ebp" , поэтому вы увидите что-то вроде
mov -0x4(%ebp), %eax
и т.д. -
eip на 0xb75f738c как упоминалось ранее, но вот адрес стека (который содержит значение "0x804877f" ).