Если ваша целевая программа не имеет никакой информации об отладке для функции, 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")
Большое спасибо @MarkP. Команда '(gdb) p ((void * (*) (void *, char *)) PyObject_GetAttrString) ($ 2," _other_obj_m ")' получите правильный ответ. –
Несколько раз я могу получить правильный ответ командой 'p ((PyObject * (*) (PyObject *, char *)) PyObject_GetAttrString) ($ 4," _other_obj_m ")', но иногда получил «Ошибка сегментации», как следующий вывод : –