대상 프로그램에 함수에 대한 디버깅 정보가없는 경우 gdb는 함수의 반환 유형이 int
이라고 가정합니다. x86_64 리눅스에서는 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")
감사합니다. @MarkP. Command (gdb) p ((void * (*) (void *, char *) PyObject_GetAttrString) ($ 2, "_other_obj_m")'정답을 얻으십시오. –
때때로'p ((PyObject * (PyObject *, char *) (PyObject *, char *)) PyObject_GetAttrString ($ 4, "_other_obj_m")'명령으로 올바른 대답을 얻을 수 있지만 때로 다음 출력과 같은'Segmentation fault ' : –