2017-01-17 124 views
1

我進入在gdb以下命令: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」)'得到正確的答案,但有時會出現'Segmentation fault'像下面的輸出: –