2016-11-04 5 views
1

디버깅 할 때 메모리에 주소가 있으며 그 주소에있는 객체의 유형을 알고 디버거에 해당 인스턴스를 표시하려고합니다. 그 물체. 템플릿이 아니지만 템플릿을 인스턴스화하는 유형의 경우 실패하는 것으로 보이는 유형의 인쇄 명령을 통해이 작업을 수행 할 수 있습니다. 전자는 실패, 내가 프로그램을 실행할 때LLDB가 주소 유형을 템플릿 인스턴스화 객체에 대한 포인터로 재 해석합니다.

template<typename T> 
class X 
{ 
public: 
    X() { 
     printf("a\n"); 
    } 
}; 

class Y 
{ 
public: 
    Y() { 
     printf("a\n"); 
    } 
}; 



int main(void) 
{ 
    X<int> x; 
    Y y; 

    return 1; 
} 

는, 메인에 휴식 및 X와 Y 객체 모두에 대한 포인터로 임의 유효 주소를 해석하려고 :

이 예제 코드를 참조

(lldb) p *(Y*)0x0000000100000ee6 
(Y) $0 = {} 
(lldb) p *(X<int>*)0x0000000100000ee6 
warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available. 
error: use of undeclared identifier 'X' 
error: expected '(' for function-style cast or type construction 
error: expected expression 

lldb에서 이것을 수행하는 방법이 있습니까? (편집 : Mac OS X lldb-360.1.65 및 lldb-310.2.37)

답변

2

C++ 용 디버그 정보는 현재 추상화 된 템플릿을 나타내지는 않으며 프로그램에있는 특정 템플릿 인스턴스화에 대해서만 이야기합니다 . 하지만 lldb의 expression 명령은 실제 ​​C++ 파서 (clang)를 사용합니다. 시도한 것과 같은 표현식을 파싱 할 때 먼저 X를 추상 템플릿으로보고 싶어합니다. 우리가 그들에 대해 알지 못하기 때문에 우리는 X에 대한 clang의 타입 요청을 수행 할 수 없다. 그래서 당신이 보는 오류는 "선언되지 않은 식별자 X"이다.

이렇게 캐스팅 할 포인터 유형에 대한 typedef를 만들어이 문제를 해결할 수 있습니다. 그다지 만족스럽지 않습니다. 왜냐하면 디버그 정보의 크기를 관리하기 쉽도록하기 때문에 코드에서 typedef를 사용해야합니다. clang은 그렇지 않은 유형의 디버그 정보를 방출하지 않기 때문입니다 익숙한. 하지만 작동합니다 (예 : 주에 나중에 다음

typedef X<int> * x_int_ptr; 

과 : 나는 당신의 샘플 코드에 추가

x_int_ptr bar = (x_int_ptr) &x; 

가 다음 LDB에서 내가 할 수있는 기록됩니다 확인 :

(lldb) expr *((x_int_ptr) 0x00007fff5fbff798) 
(X<int>) $1 = {}