(GDB) информационный фрейм
уровень стека 0
- frame num in backtrace, 0 - текущий исполняемый кадр, который увеличивается вниз , в соответствии со стеком.
кадр в 0xb75f7390
- начальный адрес памяти этого стекового фрейма
eip = 0x804877f в base :: func () (testing.cpp: 16); сохраненный eip 0x804869a
eip - это регистр для выполнения следующей инструкции (также называемый счетчиком программ).
поэтому в данный момент следующий выполняется в "0x804877f", что является 16-й строкой testing.cpp.
сохраненный eip "0x804869a" - это так называемый "адрес возврата", т. Е. Инструкция возобновления в кадре стека вызывающих абонентов после возврата из этого стека вызываемых. Он помещается в стек по команде «CALL» (сохраните для возврата).
вызывается по кадру в 0xb75f73b0
- адрес кадра стека вызывающего абонента
исходный язык c ++
Arglist на 0xb75f7388, args: this = 0x0
- начальный адрес аргументов
Местные жители в 0xb75f7388 ,
адрес локальных переменных.
SP предыдущего кадра равен 0xb75f7390
это то место, куда указывает указатель стека предыдущего кадра (кадр вызывающего абонента), в момент вызова он также является начальным адресом памяти вызываемого кадра стека.
Сохраненные регистры:
Это два адреса в стеке вызываемого для двух сохраненных регистров.
отлив в 0xb75f7388
это адрес, на котором сохранен регистр «ebp» кадра стека вызывающего абонента (обратите внимание, это регистр, а не адрес стека вызывающего абонента).
то есть соответствует "PUSH% ebp". «ebp» - это регистр, обычно рассматриваемый как начальный адрес локальных элементов этого стекового фрейма, которые используют «смещение» для адресации.
Другими словами, все локальные переменные используют этот «ebp», поэтому вы увидите что-то вроде mov -0x4(%ebp), %eax
и т. Д.
eip at 0xb75f738c
как упоминалось ранее, но здесь адрес стека (который содержит значение «0x804877f»).