如何设置std ::字符串类型lldb?

问题描述 投票:0回答:2
#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'

上创建一个

std::string

OBS:

当我打印

lldb时,lldb给我这种类型的name

std::__1::string

std::string
	

p foo
(std::__1::string) $2 = "foo"
从外面看起来很简单,但实际上是一个相当复杂的小野兽……
c++ string debugging lldb
2个回答
7
投票
实例,除复制构造函数外,所有copy构造函数除了大多数普通C ++用户从未覆盖的默认参数(分配器等),因此不知道。由于我们正在从矮化调试信息中获取有关类型的信息,因此我们受其代表的限制。 但是,它不能代表违约参数的值,因此我们不知道如何填充它们。

您可以通过阅读字符串标题来更加努力,并且您发现您需要提供尺寸和分配器,然后进行类似:

std::string

失败,因为分配器到处都是内衬的,因此LLDB找不到构造函数。

真正的解决方案是让LLDB从标题中重建
std::string

模块,将最终的Clang模块导入LLDB的编译器,并使用它来创建这些值。 那时,我们将拥有完成这项工作所需的信息。 例如,我们会知道默认参数,并可以实例化模块中缺失的分配器。

但是,从C ++ STD标头构建一个叮当模块并不完全是微不足道的,因此我们仍在努力……


您可以使用:

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


1
投票

    expr const char * $foo
  • 
    
  • 明显地仅在您知道char-array的维度时才可以使用最后一个
  • 您正在使用哪种编译器?据我发现,这个问题存在于clang 5.0.1,但没有Clang 7.0.0。这可能是与地址消毒剂有关的问题。
    
  • 
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.