gdb 可以打印 64 位地址吗?
Can gdb print 64-bit address?
我在 gdb 中输入了以下命令:
(gdb) p PyObject_GetAttrString(, "_other_obj_m")
得到如下输出,应该是一个可变地址类型(PyObject*)。
= -246881136
然后我用printf把它转成十六进制格式,得到了一个错误的地址“0xf148e490”,真正的地址是“0x4f78f148e490”。
有人知道如何解决这个问题吗?
如果您的目标程序没有函数的任何调试信息,gdb 将假定该函数具有 return 类型 int
。在 x86_64 Linux 上,这可能是 4 个字节。
$ gdb -q python2.7
(gdb) ptype PyObject_GetAttrString
type = int ()
(gdb) p sizeof(int)
= 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 *)
如果您没有任何调试信息,您可以将函数符号转换为正确的类型签名,或者转换为足够接近的类型签名,例如 指向函数的指针 returning void *
。试试这个:
(gdb) p ((void * (*)(void *, char *))PyObject_GetAttrString)(, "_other_obj_m")
我在 gdb 中输入了以下命令:
(gdb) p PyObject_GetAttrString(, "_other_obj_m")
得到如下输出,应该是一个可变地址类型(PyObject*)。
= -246881136
然后我用printf把它转成十六进制格式,得到了一个错误的地址“0xf148e490”,真正的地址是“0x4f78f148e490”。 有人知道如何解决这个问题吗?
如果您的目标程序没有函数的任何调试信息,gdb 将假定该函数具有 return 类型 int
。在 x86_64 Linux 上,这可能是 4 个字节。
$ gdb -q python2.7
(gdb) ptype PyObject_GetAttrString
type = int ()
(gdb) p sizeof(int)
= 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 *)
如果您没有任何调试信息,您可以将函数符号转换为正确的类型签名,或者转换为足够接近的类型签名,例如 指向函数的指针 returning void *
。试试这个:
(gdb) p ((void * (*)(void *, char *))PyObject_GetAttrString)(, "_other_obj_m")