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;
}
에 :
- 취소
points
벡터 - 새로운
Point
인스턴스를 생성 - 벡터에 추가하십시오
- 계속하기 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_
감사 @Jim, 나는 개체를 만들 수 있었다. 내가 왜 내 목록에 추가 할 수 없는지 아십니까? (업데이트 된 질문보기) – sdgfsdh
그 질문은 제가 답변에서 언급 한 링크로 처리됩니다. 짧게 대답하면 STL 라이브러리는 STL .h 파일의 템플릿 메서드의 라인 외부 복사본을 생성하지 않으며 디버거는 아직 SDK의 메서드를 구현할 수 없습니다. 따라서 "push_back"메소드를 호출 할 필요가 없습니다. –