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