繁体   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