ターゲットプログラムに関数のデバッグ情報がない場合、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。 PyObject_GetAttrString)($ 2、 "_other_obj_m") '正しい答えを得てください。 –
私はコマンド 'p((PyObject *(PyObject *、char *)(PyObject *、char *))(PyObject_GetAttrString)($ 4、" _other_obj_m ")'によって正しい答えを得ることができますが、時には次の出力のような ' : –