Error: Couldn't lookup symbols when calling an stl method in LLDB

Error: Couldn't lookup symbols when calling an stl method in LLDB

当我想通过调整向量的大小来改变我正在调试的程序的执行时,我得到了一个错误:

(lldb) expression std_vector_foo.resize(1)
error: Couldn't lookup symbols:
  std::vector<string_id<mtype>, std::allocator<string_id<mtype> > >::resize(unsigned long)

奇怪的是,以下运行正常:

expression std_vector_foo.reserve(1)

有两种方法可以解决缺少要调用的模板方法的问题。

最直接的——如果它适合你的话——是打开构建“stl 模块”以在表达式解析器中使用,方法是:

settings set target.import-std-module true

在你的 ~/.lldbinit 中。这将导致 lldb 为 stl 库构建一个“clang 模块”,lldb 可以从中按需构建所需的专业化。然而,这是一个相当新的功能,并且要开始工作非常棘手,所以 YMMV ......我不知道 GNU STL 是否可模块化,所以它可能只适用于最新版本的 clang STL。 ““模块”原来是一个高度重载的术语;在这种情况下,它意味着 clang 功能:

https://clang.llvm.org/docs/Modules.html

如果您确实发现了问题,请使用 http://bugs.llvm.org 提交错误。

如果这不起作用,使这些方法可用的蛮力方法是放置等同于:

template class std::vector<string_id<mtype>>;

对于您尝试访问其中一个源文件的方法的任何类型。这会强制编译器发出此 class 专业化的完整版本,从而为您提供可以调用的方法。当然,这也会使您的代码膨胀,并且您必须逐个专业化地进行,因此这不是通用的解决方案。不过,把它放在后兜里还是很有用的。