2017-01-17 3 views
1

난 GDB의 다음 명령 입력 :gdb가 64 비트 주소를 인쇄 할 수 있습니까?

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

를 가변 어드레스 타입 (의 PyObject *)되어야하는 다음과 같은 결과를 얻었다.

$4 = -246881136 

은 그럼 진수 형식으로 변환의 printf를 사용하고, 잘못된 주소 "0xf148e490"실제 주소가 "0x4f78f148e490"를 얻었다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변

1

대상 프로그램에 함수에 대한 디버깅 정보가없는 경우 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") 
+0

감사합니다. @MarkP. Command (gdb) p ((void * (*) (void *, char *) PyObject_GetAttrString) ($ 2, "_other_obj_m")'정답을 얻으십시오. –

+0

때때로'p ((PyObject * (PyObject *, char *) (PyObject *, char *)) PyObject_GetAttrString ($ 4, "_other_obj_m")'명령으로 올바른 대답을 얻을 수 있지만 때로 다음 출력과 같은'Segmentation fault ' : –