Как интерпретировать вывод GDB «информационный фрейм»? - PullRequest
39 голосов
/ 28 февраля 2011

Может кто-нибудь помочь мне понять это: -

(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 и Previous Frame sp"?Пожалуйста, объясните

Ответы [ 3 ]

71 голосов
/ 14 мая 2013

(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»).

5 голосов
/ 01 марта 2011

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

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

0 голосов
/ 30 января 2019

Я знаю, что это вопросы от ... 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...