【问题标题】:How set std::string type on lldb?如何在 lldb 上设置 std::string 类型?
【发布时间】:2021-01-24 12:24:11
【问题描述】:

我有以下代码:

#include <iostream>
#include <string>

int main() {
    std::string name = "Foo";
    return 0;
}

当我使用lldb 进行调试时,我想设置一个std::string,就像我设置这个int

expr int $num = 4

我试试:

expr std::string $name = "Foo"

我得到了:

error: no type named 'string' in namespace 'std'

有人知道发生了什么吗?如何在lldb 上创建std::string

观察:

当我打印name 时,lldb 给我这个类型std::__1::stringstd::string

p foo
(std::__1::string) $2 = "foo"

【问题讨论】:

  • std::stringstd::basic_string&lt;char&gt; 的别名,所以也许可行?
  • @NikosC。没用,我得到了:error: no template named 'basic_string' in namespace 'std'
  • 尝试使用返回给您的名称...在您的问题std::__1::string
  • 所以尝试使用const char *const char[]const char[5]。让我知道其中一个是否有效。
  • 所以我在回答中转换评论以解决问题

标签: c++ string debugging lldb


【解决方案1】:

std::string 从表面上看很简单,但实际上它是一个相当复杂的小野兽......

例如,除了复制构造函数之外的所有 std::string 构造函数都采用大多数普通 C++ 用户从不覆盖的默认参数(分配器等),因此不知道。由于我们从 DWARF 调试信息中获取有关类型的信息,因此我们受到它所代表的内容的限制。但是,它不代表默认参数的值,所以我们不知道如何填写它们。

您可以通过阅读字符串标题更努力地尝试,并发现您需要提供一个大小和一个分配器,然后得到类似的东西:

expr std::string $myStr("Foo", 4, std::allocator<char>())
error: Couldn't lookup symbols:
  __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EPKcmRKS4_

这失败了,因为分配器到处都是内联的,所以 lldb 找不到构造函数来调用它。

真正的解决方案是让 lldb 从头文件中重建 std 模块,将生成的 clang 模块导入 lldb 的编译器并使用它来创建这些值。那时,我们将拥有完成这项工作所需的信息。例如,我们会知道默认参数,并可以从模块中实例化丢失的分配器。

但是从 c++ 标准头文件构建 Clang 模块并不是一件容易的事,所以我们仍在努力……

【讨论】:

    【解决方案2】:

    你也可以使用:

    • expr const char * $foo
    • expr const char $foo[]
    • expr const char $foo[4]

    显然,只有知道字符数组的维度后才能使用最后一个

    【讨论】:

      【解决方案3】:

      您使用的是哪种编译器?从我发现这个问题存在于clang 5.0.1 但不存在于clang 7.0.0。这可能是与地址清理程序相关的问题。

      试试brew install llvm --with-toolchain --with-lldb

      【讨论】:

      • g++ -v Apple clang version 11.0.0
      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 2021-12-18
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多