c++ - 如何在 lldb 上设置 std::string 类型?

标签 c++ string debugging lldb

我有以下代码:

#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"

我得到了:

错误:命名空间“std”中没有名为“string”的类型

有人知道这是怎么回事吗?我如何在 lldb 上创建一个 std::string

观察:

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

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

最佳答案

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

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

您可以更努力地阅读字符串 header ,然后发现您需要提供一个大小和一个分配器,然后得到如下内容:

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

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

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

但事实证明,从 c++ std header 构建 Clang 模块并非完全微不足道,因此我们仍在努力......

关于c++ - 如何在 lldb 上设置 std::string 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64279734/

相关文章:

java - 如何理解是否创建了一个新的String对象

visual-studio-2010 - VS2010 和 VS2012 “Script Documents” 部分从未出现,我无法调试 JavaScript

c++ - 痛饮 Perl : wrong ELF class

c++ - MPI 接收和发送 Eigen 压缩稀疏矩阵

c# - 在 C# 中将 14 数字转换为 DateTime

python - 字符串比较的时间复杂度

c++ - C++ stderr 输出在 OSX 中的哪里?

javascript - 从运行在 Web 浏览器控件中的 JavaScript 脚本调用 C++ 函数

c++ - 如何调试令人困惑的大代码?

c++ - 命中断点错误