Подтвердить что ты не робот

Как интерпретировать вывод информационного фрейма 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 sp is 0xb75f7390
 Saved registers:
  ebp at 0xb75f7388, eip at 0xb75f738c

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

4b9b3361

Ответ 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" ).

Ответ 2

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

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

Ответ 3

Я знаю, что это вопросы от... 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 frames arguments
    the address of the frames local variables
    the program counter saved in it (the address of execution in the caller frame)
    which registers were saved in the frame