如果你的目標程序沒有函數的任何調試信息,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」)'得到正確的答案,但有時會出現'Segmentation fault'像下面的輸出: –