2016-08-25 4 views
3

Предположим, что EAX содержит указатель на некоторое значение (двойное слово).Как написать выражение, которое связывает указатель в GDB?

Что я хотел бы сделать, так это изучить это значение, то есть написать выражение типа x /1wx [eax].

Однако GDB жалуется при написании [eax] в выражениях, говоря, что синтаксис неверен.

Как бы я почерпнул указатель в GDB?

+0

Помните, что синтаксис gdb является C-like, даже если вы отлаживаете asm. –

ответ

5

Как отметил другой ответ, вы можете за $ еах смотреть на этот специальный регистр.

(gdb) x /1wx $eax 
0x400523d <main>: 0xe5894855 

«info reg» предоставит регистрационный дамп, содержащий много полезной информации.

Вы также можете использовать gdb для разыменования указателя.

(gdb) print /x *(int*)0x400523d 
$3 = 0xe5894855 

Этот метод часто используется при отладке. Он полезен при копании внутри сложного класса/структуры для указателей. После цепочки указателей часто упрощается, а просто хватается за адрес и смотрит на разыменование.

+0

Благодарим вас, поэтому, в сущности, для обозначения указателя я должен просто использовать C-синтаксис, как ваш «* (int *) 0x40052d», где 0x40052d - значение указателя? – user111854

+0

Да, это правильно. gdb обрабатывает все базовый тип, int, float, double и т. д. Поддерживаются также простые типы пользователей. Типы шаблонов C++ могут быть сложными для ввода, но поддерживаются –

+0

Не пропустите «3» в вашем литье «/ x * (int *) 0x40052d»? – user111854

4

Вы можете обратиться к регистрам по общим названиям, используя $. Например

print $rax 

для печати rax значения, или

print *$rax 

разыменовать значения в качестве указателя rax.

https://sourceware.org/gdb/onlinedocs/gdb/Registers.html

+0

Благодарим за полезный ответ. – user111854