2014-04-01 19 views
9

std::unique_ptr 좋은데, DDD 또는 gdb에서 디버깅 할 때 편안함을 느낍니다.DDD (또는 gdb)에서 unique_ptr을 사용하여 C++ 11 코드를 디버깅하는 방법은 무엇입니까?

저는 gcc의 일부인 gdb 프린터를 사용하고 있습니다 (예 : /usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py). 즉, 큰 예를 들어 읽기 쉽 승리이다 : 그러나

$ print pTest 
std::unique_ptr<MyType> containing 0x2cef0a0 

, 포인터를 역 참조하는 것은 작동하지 않습니다

$ print *pTest 
Could not find operator*. 

를 내가 값에 접근 할 필요가있을 때, 내가 수동으로 포인터를 복사해야하고 예를 들어, 올바른 유형으로 캐스트 : 프로세스가 계속 실행되고

print *((MyType*) 0x2cef0a0) 

경우,이 버전은 작업 (여전히 추한하지만 더 나은) :

print *pTest.get() // will not work if analyzing a core dump 

DDD의 Display *pTest에 대한 직접적인 접근법도 작동하지 않습니다. 그것은 단지 다음과 같은 오류가 발생합니다

<error: Could not find operator*.> 

(내 성가신 해결 방법과는 같은 흐름을 깨지 않고) DDD에 unique_ptr와 C++ (11) 코드를 디버깅하는 방법이 있나요?


나는 gdb 명령을 사용하는 것을 두려워하지 않지만 DDD 통합은 더할 나위없이 좋습니다. 예를 들어, 데이터 구조의 포인터를 더블 클릭하는 것만으로는 입력하는 것보다 빠르다.

이미 예쁜 프린터를 떨어 뜨리려고했으나 최적이 아닙니다.

print pTest._M_t->_M_head_impl 
+0

이 바보 같은 질문처럼 들리 겠지만,하지만 당신은을 구축해야했다 처음부터 상자에 gcc 컴파일러? RPM 업데이트였습니까? 최근에 gdb에서 C++ 11 코드를 디버깅 할 때 문제가 발생하여 gdb를 다시 컴파일하지 못하는 것으로 나타났습니다. 나는 그것이 사실이 아니라고 확신하지만, 물을만한 가치가 있다고 생각했다. – Welshboy

+0

@Welshboy 현재 공식 gcc 4.8.2 (20140206)와 gdb 7을 사용하고 있습니다.7 아치 리눅스에서. –

+1

다음을 시도해보십시오. http://stackoverflow.com/questions/322322/displaying-dereferenced-stl-iterators-in-gdb 특히 gdbinit 파일을 살펴보십시오. gdb가 할 수있는 많은 것들이있는 것 같습니다. 행운을 빕니다. – Ben

답변

7

이 문제는 실제로 C++ (11), unique_ptr 또는 꽤 인쇄 관련이 없습니다 : 내가 가지고 올 수있는 최선은 다음과 같다. 문제는 gcc가 unique_ptr을 참조 해제하기 위해 gdb에 의해 호출 될 수있는 std :: unique_ptr :: operator *에 대한 코드를 방출하지 않는다는 것입니다. 예를 들어 코드에 *pTest;을 추가하면 gdb는 역 참조를 수행합니다.

비슷한 문제는 SO 게시물 How to `print`/evaluate c++ template functions in gdb에 설명되어 있습니다. auto_ptr에 대해서도 거의 동일한 문제가 https://sourceware.org/ml/archer/2012-q1/msg00003.html에 기술되어 있습니다. 스레드를 올바르게 이해한다면 한 가지 해결 방법은 예쁜 프린터를 패치하고 unique_ptr을 인쇄 할 때 역 참조 된 포인터를 출력하는 것입니다. gdb 버그보고는 http://sourceware.org/bugzilla/show_bug.cgi?id=12937에 있습니다.

https://sourceware.org/gdb/wiki/STLSupport의 gdb wiki는 다른 해결 방법이있을 수있는 더 멋진 인쇄 솔루션을 설명합니다.

편집 : 운영자 * 명시 적으로 클래스의 인스턴스를하는 것입니다 포함한 모든 구성원 템플릿 코드를 방출하는 컴파일러를 강제 더 우아한 해결책 :

template class std::unique_ptr<MyType>; 
+0

어디에서이 명시적인 인스턴스화를 정의해야합니까? – q0987

+0

'memory' 헤더를 넣고'MyType' (또는 각각의 include)을 선언 한 후에 번역 단위 ("cpp 파일") 중 하나의 기술적 인 관점에서 - http : //en.cppreference를보십시오. .com/w/cpp/language/class_template # Explicit_instantiation – user1225999