在LLDB中,我可以调用方法并生成C++;上课? 我试图用CLAN和LLDB来探索复杂的C++应用程序的行为。我在应用程序中设置了一个断点。一旦到达那个断点,我就想创建一个简单C++类的实例,然后在断点上下文中调用一个方法。p>

在LLDB中,我可以调用方法并生成C++;上课? 我试图用CLAN和LLDB来探索复杂的C++应用程序的行为。我在应用程序中设置了一个断点。一旦到达那个断点,我就想创建一个简单C++类的实例,然后在断点上下文中调用一个方法。p>,c++,debugging,clang,lldb,C++,Debugging,Clang,Lldb,例如,以下是我的应用程序: #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 au

例如,以下是我的应用程序:

#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;
}
我可以创建一个对象,这很好

(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_

可以在调试器中创建对象。告诉调试器要在表达式解析器中创建持久对象的诀窍是,在创建或引用它时,给它一个以“$”开头的名称。然后lldb将确保对象持续存在

但是,请注意,使用中提到的STL类时的注意事项:


谢谢@Jim,我能制作一个物体。你知道为什么我不能把它添加到我的列表中吗?(见更新的问题)我在回答中提到的链接解决了这个问题。简而言之,STL库不会从STL.h文件中生成模板方法的不一致副本,调试器也无法从SDK中实现这些方法。因此没有“push_back”方法可调用。
(lldb) expr points.push_back($x)
error: Couldn't lookup symbols:
  __ZNSt3__16vectorI5PointNS_9allocatorIS1_EEE9push_backERKS1_