加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用XCode/LLDB打印/调试libc STL

发布时间:2020-12-15 01:53:05 所属栏目:百科 来源:网络整理
导读:我正在尝试在Xcode 8中使用LLDB来调试非常基本的STL。我曾经能够打印这样的矢量: p myvector[0] 看第一个向量索引中的内容。现在,当我这样做时,我收到此错误: error: Couldn't lookup symbols: __ZNSt3__16vectorI9my_classNS_9allocatorIS1_EEEixEm 相
我正在尝试在Xcode 8中使用LLDB来调试非常基本的STL。我曾经能够打印这样的矢量:

p myvector[0]

看第一个向量索引中的内容。现在,当我这样做时,我收到此错误:

error: Couldn't lookup symbols:
  __ZNSt3__16vectorI9my_classNS_9allocatorIS1_EEEixEm

相反,我必须输入:

p myvector.__begin_[0] in order to get any output.

我尝试从LLDB svn存储库导入libcxx.py和unordered_multi.py脚本,但这似乎没有改变任何东西。

有没有人能够通过libc从LLDB获得任何有用的输出?

解决方法

[]是std :: vector上的运算符方法,因此要打印所需的表达式,lldb必须能够调用[]方法。这里的问题是OS X上的STL积极地内联所有内容,而不是浪费空间来生成相同功能的外包副本。这对于优化代码来说非常好,但对于调试来说却不太好,因为它使调试器没有[]运算符来调用。这是你看到的错误信息。

如果您只想查看此向量中的元素,可以使用lldb“STL数据格式化程序”为您执行此操作。他们知道大多数STL类型的布局,并且可以打印大多数容器类型的元素。例如:

(lldb) expr my_vec[0]
error: Couldn't lookup symbols:
  __ZNSt3__16vectorI3FooNS_9allocatorIS1_EEEixEm

但:

(lldb) expr my_vec
(std::__1::vector<Foo,std::__1::allocator<Foo> >) $0 = size=2 {
  [0] = (var1 = 10,var2 = 20)
  [1] = (var1 = 10,var2 = 20)
}

还有另一个命令“frame variable”,它可以检查静态对象,并挂钩到数据格式化程序。它不能调用函数并执行其他更复杂的表达式解析器任务,但它确实知道如何使用STL数据格式化程序来检索单个元素:

(lldb) frame var my_vec[1]
(Foo) my_vec[1] = (var1 = 10,var2 = 20)

您甚至可以使用frame var的-L选项来定位向量的元素,然后您可以转换地址以将其传递给其他函数:

(lldb) frame var -L my_vec[1]
0x0000000100100348: (Foo) my_vec[1] = {
0x0000000100100348:   var1 = 10
0x000000010010034c:   var2 = 20
}
(lldb) expr printf("%dn",((class Foo *) 0x0000000100100348)->var1)
10
(int) $3 = 3

另一种解决此问题的方法是调试 – 如果你使用的是C 11 – 是通过以下方式:

template class std::vector<MyClass>

在你的代码中的某个地方。这将指示编译器为此专业化发出所有模板函数的外联副本。这不是一个很好的通用解决方案,你只想用于调试版本,但它确实允许你调用这些函数并在复杂的表达式中使用它们。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读