Как читать локальные переменные с помощью GDB? - PullRequest
6 голосов
/ 11 мая 2011

Я знаю, что вы можете найти любые параметры, посмотрев на положительное смещение от $ ebp, используя gdb:

(gdb) x/4wx $ebp

Затем я бы посмотрел на 3-й и 4-й адреса, используя x/s, потому что онибыть первым и вторым параметром.Как насчет локальных переменных?Как бы я посмотрел на значения с отрицательным смещением от $ ebp?Кроме того, есть ли возможность посмотреть значение $ eax?Всякий раз, когда я пытаюсь напечатать значение $ eax, используя x/s $eax, адрес выходит за пределы или значение равно 0, что я уверен, что это не так, потому что я просто поместил постоянное значение в регистр.

Я пытался info locals, но получаю сообщение "Информация о таблице символов недоступна".

Ответы [ 2 ]

6 голосов
/ 11 мая 2011

Сначала вам нужно скомпилировать отладочные символы в ваш двоичный файл. Используйте параметр -g на gcc с вашей текущей командой, чтобы сделать это. Если вы используете другой компилятор, вам нужно будет обратиться к его документации. После этого «info localals» и команда печати будут работать.

Чтобы просмотреть любую локальную переменную, все, что вам нужно сделать, это использовать команду «print». Например, посмотреть на локальную переменную 'i' так же просто, как 'print i'.

Вы должны иметь возможность обрабатывать $ eax так же, как и $ ebp. Я подозреваю, что у вас есть проблемы, потому что вы используете х / с. x / s попытается распечатать строку и будет продолжаться до тех пор, пока не достигнет нулевого символа. Если это не произойдет в течение длительного времени, длина строки выйдет за пределы. Попробуйте «x / d $ eax». Вы даже можете сделать 'print $ eax'. Вы также можете использовать «информационные регистры», чтобы получить все данные регистра.

0 голосов
/ 12 мая 2011

Я знаю, что вы можете найти любые параметры, посмотрев на положительное смещение от $ ebp с помощью gdb

Это работает только для некоторых процессоров и некоторых соглашений о вызовах и ни в коем случаеuniversal.

При условии, что вы заботитесь только о x86, и что ваш код скомпилирован с указателями фреймов (которые раньше использовались по умолчанию, но больше не являются значениями по умолчанию для GCC 4.6 в режиме opt), местные жители размещаются вфиксированное отрицательное смещение от %ebp.

Очевидно, что если вы можете перестроить свой код с помощью символов отладки (с -g), то GDB сможет просто напечатать их значения, и вам не нужновсе равно, как GDB их находит.

Если вы не можете (например, потому что код был получен от третьей стороны), вам придется внимательно посмотреть на разборку и угадать.Если вы предполагаете, что какое-то значение хранится в %ebp-8, вы можете проверить это значение с помощью GDB точно так же, как вы проверяете положительные смещения: (gdb) x/wx $ebp-8.

Осторожно: компилятор может свободно размещать любые локальные значения.так, как он хочет, поэтому, если вы объявите

int x, y, z;

, компилятор может свободно хранить x в %ebp-16, y в %ebp-20 и z в %ebp-12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...