【问题标题】:Error: Couldn't lookup symbols when calling an stl method in LLDB错误:在 LLDB 中调用 stl 方法时无法查找符号
【发布时间】:2022-01-23 11:12:41
【问题描述】:

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

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

【问题讨论】:

  • 我假设 std::vector&lt;string_id&lt;mtype&gt;, std::allocator&lt;string_id&lt;mtype&gt; &gt; &gt;::resize(unsigned long) 没有内线,并且没有这种方法的异常副本。您可以查看源代码并尝试调用此方法调用的函数。
  • 如果您没有在代码中使用std_vector_foo.resize,那么编译器将不会为其生成代码,因此调试器将无法运行该代码

标签: c++ debugging stl lldb


【解决方案1】:

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

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

settings set target.import-std-module 1

在你的 ~/.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>>;

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

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2016-10-15
    • 2019-01-05
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多