Как интерпретировать вывод GDB "информационный фрейм"?

Могут ли некоторые помочь мне понять это:-

(gdb) info frame
Stack level 0, frame at 0xb75f7390:
 eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a
 called by frame at 0xb75f73b0
 source language c++.
 Arglist at 0xb75f7388, args: this=0x0
 Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390
 Saved registers:
  ebp at 0xb75f7388, eip at 0xb75f738c

Что означает "ebp, eip Locals at и предыдущий кадр sp "? Пожалуйста, объясни

2 ответа

(GDB) информационный фрейм

уровень стека 0

  • номер кадра в обратной трассировке, 0 - текущий исполняемый кадр, который увеличивается вниз в соответствии со стеком.

кадр в 0xb75f7390

  • начальный адрес памяти этого стекового фрейма

eip = 0x804877f в base::func() (testing.cpp:16); сохраненный eip 0x804869a

  • eip - это регистр для выполнения следующей инструкции (также называемый счетчиком программ). поэтому в данный момент следующий выполняется в "0x804877f", что является 16-й строкой testing.cpp.

  • сохраненный eip "0x804869a" является так называемым "адресом возврата", то есть инструкцией возобновления в кадре стека вызывающего абонента после возврата из этого стека вызываемого абонента. Он помещается в стек по команде "CALL" (сохраните для возврата).

вызывается кадром в 0xb75f73b0

  • адрес кадра стека вызывающего

исходный язык с ++

  • какой язык используется

Arglist в 0xb75f7388, args: this=0x0

  • начальный адрес аргументов

Местные жители в 0xb75f7388,

адрес локальных переменных.

Sp предыдущего кадра - 0xb75f7390

это то место, куда указывает указатель стека предыдущего кадра (кадр вызывающего абонента), в момент вызова он также является начальным адресом памяти вызываемого кадра стека.

Сохраненные регистры: это два адреса в стеке вызываемого для двух сохраненных регистров.

  • ebp at 0xb75f7388 - это адрес, на котором сохранен регистр "ebp" кадра стека вызывающего абонента (обратите внимание, что это регистр, а не адрес стека вызывающего абонента). т.е. соответствует "PUSH %ebp". "ebp" - это регистр, обычно рассматриваемый как начальный адрес локальных элементов этого стекового фрейма, которые используют "смещение" для адресации. Другими словами, все локальные переменные используют этот "ebp", поэтому вы увидите что-то вроде mov -0x4(%ebp), %eax, так далее.

  • eip в 0xb75f738c, как упоминалось ранее, но здесь адрес стека (который содержит значение "0x804877f").

Чтобы понять, что означают слова "ebp, eip Locals at и Previous Frame", вам необходимо понять соглашение о вызовах x86.

Как только вы поймете, как устроены кадры, все остальное станет очевидным.

Я знаю, что это вопросы от... 8 лет назад. Но для будущих пользователей я нашел очень четкую схему информации здесь.

Это извлечено из вышеупомянутой ссылки:

info frame
info f

This command prints a verbose description of the selected stack frame, including:

    the address of the frame
    the address of the next frame down (called by this frame)
    the address of the next frame up (caller of this frame)
    the language in which the source code corresponding to this frame is written
    the address of the frame’s arguments
    the address of the frame’s local variables
    the program counter saved in it (the address of execution in the caller frame)
    which registers were saved in the frame 
Другие вопросы по тегам