2008-10-24 3 views

답변

28

해당 변수의 유형이 불완전하게 지정되었음을 의미합니다. 예를 들어 :

struct hatstand; 
struct hatstand *foo; 

GDB는 foohatstand 구조에 대한 포인터는 것을 알고 있지만, 그 구조체의 멤버가 정의되지 않았습니다. 따라서 "불완전 유형".

값을 인쇄하려면 호환 가능한 유형으로 변환 할 수 있습니다. 이 정수 인 것처럼 일반적인 포인터로 인쇄하거나 취급 할 수,

print (struct lampshade *)foo 

또는 : 당신이 foo 정말 lampshade 구조에 대한 포인터는 것을 알고있는 경우 예를 들어

,

print (void *)foo 
print (int)foo 

볼 수있는 GDB 매뉴얼에서 이러한 페이지 :

  • 내가 찾은 무엇
+0

좋은 답변이지만 링크는 404입니다. –

+1

수정 됨. 이전에 링크 된 내용을 기억할 수는 없지만이 두 링크가 도움이 될 것입니다. :). –

5

  • http://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html#Symbols는 불완전한 구조체 형 GDB를 사용하는 기능을 분해하면 구조체 멤버를 '발견'과 이후에 표시 할 수 있다는 것입니다.

    struct my_string { 
        char * _string, 
        int _size 
    } ; 
    

    일부 기능 포인터를 통해 문자열을 생성하고 얻을 :

    int main(int argc, char *argv[]) { 
        my_string *str = create_string("Hello World!") ; 
        printf("String value: %s\n", get_string(str)) ; 
        ... 
    } 
    

    : 문자열을 생성

    my_string * create_string(const char *) {...} 
    const char * get_string(my_string *){...} 
    

    및 테스트를 예를 들어, 문자열 구조체가 있다고 gdb에서 실행하고 'print * str'을 시도하면 '불완전한 유형'응답을 받게됩니다. 그러나 'get_string'을 분해 한 다음 'print * str'을 시도하면 구조체와 값이 올바르게 표시됩니다. 왜이 방법이 효과가 있는지 모르겠지만 그렇습니다.

  • 0

    동일한 문제가있었습니다. 수동으로 라이브러리에서 기호를로드하는 경우 :

    set auto-solib-add off 
    attach thread_id 
    shared any_lib 
    shared another_lib 
    

    당신은이 객체뿐만 아니라 같은 명령으로 선언 된 라이브러리에서 기호를로드해야합니다.

    0

    필자는 오류의 모든 의미를 모르지만 Peter가 지적한 것처럼 관련 메서드를 디스 어셈블리하면 이러한 형식 정의 중 일부를 사용할 수 있습니다.

    내 예 : 외부 클래스가에 대한 포인터를 포함 할 수 있도록 클래스의 .H에서

    는, 그 클래스는 내부 헬퍼 클래스의 전방 선언을 포함. 해당 .cpp는 전체 내부 도우미 클래스 정의를가집니다.

    외부 클래스의 메서드를 중단하면 gdb가 외부 클래스의 인스턴스를 통해 내부 클래스 인스턴스에 대한 포인터를 역 참조하기 위해 불완전한 형식을보고했습니다.

    외부 클래스의 메소드 중 하나에서 disasemble 명령을 실행하면 gdb가 이전에 실패한 포인터와 동일한 포인터를 사용하여 내부 클래스의 구조를 이해할 수있었습니다.

    관련 문제