簡體   English   中英

gdb 可以打印 64 位地址嗎?

[英]Can gdb print 64-bit address?

我在 gdb 中輸入了以下命令:

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

並得到以下輸出,它應該是一個變量地址類型(PyObject*)。

$4 = -246881136

然后我用 printf 將它轉換為十六進制格式,得到了一個錯誤的地址“0xf148e490”,真正的地址是“0x4f78f148e490”。 有誰知道如何解決這個問題?

如果您的目標程序沒有函數的任何調試信息,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") 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM