2014-07-10 1 views
3

나는 C++ 클래스의 인스턴스를 포함하고있는 objective-C++ 코드를 신속하게 디버그 할 수 있기를 원합니다.Objective-C++의 C++ 클래스에 대한 "설명"과 동일합니까?

objective-c 클래스를 사용하면 사람이 읽을 수있는 문자열을 반환하기 위해 간단히 description을 구현 한 다음 lldb에서 po var을 입력하면 인스턴스에 대해 알아야 할 사항을 즉시 알 수 있습니다.

객관적인 C++ 코드에서 사용되는 C++ 클래스에도이 방법을 사용할 수 있습니까?

+0

Objective-C++에서 ** 사용되지 않는 C++ 클래스에 대해해야 할 일은 모두해야합니다. –

+0

'description()'메소드를 추가하고 lldb에서 호출 할 수 있다는 것을 알고 있습니다. 나는 Xcode의 (AppCode의) 디버거 변수 개요를 명시 적으로 볼 수 있을지 궁금하다.'- description'을 구현하는 objective-c 클래스처럼 할 수있다. – yonix

+1

저는 C++에서 파이썬으로 구현 된 lldb 확장을 사용해야한다고 생각합니다. – trojanfoe

답변

2

lldb에서이 작업을 수행하는 가장 쉬운 방법은 C++ 클래스에 "요약 포맷터"를 추가하는 것입니다. "타입 요약"섹션에 대한

http://lldb.llvm.org/varformats.html

봐 :이 웹 페이지는이 작업을 수행하는 방법에 꽤 좋은 소개를 제공합니다.

클래스의 ivar 값에 클래스에 대해보고 싶은 모든 것이 포함되어 있으면 LLDB Python API를 사용하지 않고도 ivar 값과 원하는 마크 업 텍스트를 제공하는 요약 문자열을 표시 할 수 있습니다 수업을 분해해라. 요약을 생성하기 위해 더 많은 작업을해야한다면, 트로이 목마가 제안한대로 Python API를 사용해야 할 것입니다.

예를 들어, C++ 클래스에 대한 "설명"메소드를 작성한 경우 LLDB의 Python API를 사용하여 해당 메소드를 호출하고 요약으로 문자열을 리턴 할 수 있습니다. 그러나 가능한 경우 디버거에서 코드를 실행하는 것이 일반적으로 메모리를 검사하는 것보다 느리기 때문에 클래스의 정적 지식에서 요약을 생성하는 것이 좋습니다.

LLDB Python 인터페이스를 사용하여 동일한 페이지에서 요약을 작성하는 방법에 대한 정보도 있습니다.

작성한 유형 요약을 .ldldbinit 파일에 추가 할 수 있으며 lldb에 클래스 인스턴스를 인쇄 할 때 요약 값이 표시되고 Xcode의 지역보기에 요약 열이 표시됩니다.

참고 : 모든 유형 (C, C++ 또는 ObjC)에서이 작업을 수행 할 수 있습니다. 많은 C++ STL 클래스와보다 일반적인 Foundation 클래스에는 동일한 메커니즘을 사용하는 기본 제공 요약이 있습니다. description 메소드가 아닌, lldb가 Xcode에서 볼 수있는 한 줄 개요를 생성하는 방법입니다.

+0

물론 이것은 형식 문자열에서 % @를 사용하면 ObjC 개체에서만 작동하고 LLDB에서는 po와 같지 않으므로 C++ 인스턴스 인 ObjC 개체에서 직접 ivars에 대한 작업을 수행해야 함을 의미합니다. 예 : GetDebugDescription() 멤버 함수를 C++ 객체에 추가 한 다음 NSLog (@ "foo {bar = % @, cppBar = % s}", self-> bar, self-> cppBar.GetDebugDescription(). c_str)); 또는 무엇이든. – uliwitness

+0

여기서 흥미로운 부분은 "po"가 언어 정의 동작이라는 것입니다. 즉, "내 표현을 평가 한 다음 언어에 대해 설명 된 메커니즘을 사용하여 설명을 표현"하는 것을 의미합니다. ObjC가 그러한 메커니즘 (설명)을 정의한 것입니다. OTOH, C++ 세계에는 그러한 명백하고 일반적으로 합의 된 것은 없습니다. ostream 연산자를 객체에 구현하거나 toString() 메서드를 사용하거나 dump() 메서드를 가질 수 있습니다.이 메서드는 모두 실제 코드에서 발생하는 것처럼 보입니다. 또한 C++에서 % @와 동등한 효과를 얻지 못한 이유는 무엇입니까? 어떻게 작동합니까? –

+0

굉장! 감사! '.lldbinit'에 대해 몰랐습니다.내가 코드에서 할 수있는 일이 있는지 궁금하다. 그래서 클래스 별 설정이 될 것이고 홈 디렉토리 설정이 아닐 것이다. – yonix