2016-10-27 7 views
1

Clang과 LLDB를 사용하여 복잡한 C++ 응용 프로그램의 동작을 탐색하려고합니다. 내 응용 프로그램에 중단 점을 설정했습니다. 그 중단 점에 도달하면 간단한 C++ 클래스의 인스턴스를 만든 다음 해당 중단 점의 컨텍스트에서 메서드를 호출하고 싶습니다. 예를 들어 LLDB에서 메서드를 호출하고 C++ 클래스의 인스턴스를 만들 수 있습니까?

, 여기에 내 응용 프로그램입니다 : 내가 좋아하는 것, 위의 중단 점 내부

#include <iostream> 
#include <vector> 

struct Point { 
    int x; 
    int y; 
}; 

int main() { 
    std::vector<Point> points; 
    points.push_back(Point{3, 4}); 
    // <--------- Breakpoint here 
    int total = 0; 
    for (const auto& p : points) { 
    total += p.x * p.y; 
    } 
    std::cout << "Total: " << total << std::endl; 
    return 0; 
} 

에 :

  1. 취소 points 벡터
  2. 새로운 Point 인스턴스를 생성
  3. 벡터에 추가하십시오
  4. 계속하기 execu

이 예제는 간단하지만 종종 상당히 큰 응용 프로그램을 가지고 있습니다. 가능한가 expr을 사용합니까? 내가 좋은 개체를 만들 수 있습니다

(lldb) expr points.clear() 
warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available. 
error: Couldn't lookup symbols: 
    __ZNSt3__16vectorI5PointNS_9allocatorIS1_EEE5clearEv 

:


업데이트

나는 점을 제거하려고이 오류가!

(lldb) expr auto $x = Point{1, 2} 
(lldb) expr $x 
(Point) $x = { 
    x = 1 
    y = 2 
} 

그러나, 나는 내 벡터에 밀어 수 없습니다 : 당신은 디버거에서 개체를 만들 수 있습니다

(lldb) expr points.push_back($x) 
error: Couldn't lookup symbols: 
    __ZNSt3__16vectorI5PointNS_9allocatorIS1_EEE9push_backERKS1_ 

답변

2

. 익스프레션 구문 분석기에서 영속 객체를 생성하고자하는 디버거에게 당신이 생성하거나 참조 할 때 "$"로 시작하는 이름을주는 것이 트릭입니다. 그러면 lldb는 객체가 지속되는지 확인합니다.

참고 그러나,주의 사항에 언급 된 STL 클래스를 사용한 작업 :

Printing/Debugging libc++ STL with XCode/LLDB

+0

감사 @Jim, 나는 개체를 만들 수 있었다. 내가 왜 내 목록에 추가 할 수 없는지 아십니까? (업데이트 된 질문보기) – sdgfsdh

+2

그 질문은 제가 답변에서 언급 한 링크로 처리됩니다. 짧게 대답하면 STL 라이브러리는 STL .h 파일의 템플릿 메서드의 라인 외부 복사본을 생성하지 않으며 디버거는 아직 SDK의 메서드를 구현할 수 없습니다. 따라서 "push_back"메소드를 호출 할 필요가 없습니다. –

관련 문제