2017-01-17 3 views
1

я ввел следующую команду в БГДЕ:Может ли gdb распечатать 64-битный адрес?

(gdb) p PyObject_GetAttrString($2, "_other_obj_m") 

и получил следующий результат, который должен быть переменным типом адреса (PyObject *).

$4 = -246881136 

Тогда я использовал Printf, чтобы преобразовать его в шестнадцатеричный формат и получил неверный адрес «0xf148e490», реальный адрес «0x4f78f148e490». Кто-нибудь знает, как решить эту проблему?

ответ

1

Если ваша целевая программа не имеет никакой информации об отладке для функции, gdb будет считать, что функция имеет тип возврата int. В x86_64 Linux это может быть 4 байта.

$ gdb -q python2.7 
(gdb) ptype PyObject_GetAttrString 
type = int() 
(gdb) p sizeof(int) 
$1 = 4 

Если ваша цель имеет отладочную информацию, вы получите правильный результат.

$ gdb -q python2.7-dbg 
Reading symbols from python2.7-dbg...done. 
(gdb) ptype PyObject_GetAttrString 
type = struct _object { 
    struct _object *_ob_next; 
    struct _object *_ob_prev; 
    Py_ssize_t ob_refcnt; 
    struct _typeobject *ob_type; 
} *(PyObject *, const char *) 

Если у вас нет какой-либо информации отладки, вы можете бросить символ функции для правильного типа подписи, или тот, который достаточно близко, такие как указатель на функцию, возвращающую void *. Попробуйте следующее:

(gdb) p ((void * (*)(void *, char *))PyObject_GetAttrString)($2, "_other_obj_m") 
+0

Большое спасибо @MarkP. Команда '(gdb) p ((void * (*) (void *, char *)) PyObject_GetAttrString) ($ 2," _other_obj_m ")' получите правильный ответ. –

+0

Несколько раз я могу получить правильный ответ командой 'p ((PyObject * (*) (PyObject *, char *)) PyObject_GetAttrString) ($ 4," _other_obj_m ")', но иногда получил «Ошибка сегментации», как следующий вывод : –