gdb可以打印64位地址吗?

时间:2017-01-17 10:54:57

标签: gdb memory-address

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

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

并得到以下输出,该输出应该是变量地址类型(PyObject *)。

$4 = -246881136

然后我使用printf将其转换为十六进制格式并得到一个错误的地址“0xf148e490”,真实地址是“0x4f78f148e490”。 谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分: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")