iOS   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用XCode/LLDB打印/调试libc STL大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试在Xcode 8中使用LLDB来调试非常基本的STL。我曾经能够打印这样的矢量: p myvector[0] 看第一个向量索引中的内容。现在,当我这样做时,我收到此错误: error: Couldn't lookup symbols: __ZNSt3__16vectorI9my_classNS_9allocatorIS1_EEEixEm 相反,我必须输入: p myvector.__
我正在尝试在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("%d\n",((class Foo *) 0x0000000100100348)->var1)
10
(int) $3 = 3

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

template class std::vector<MyClass>

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

@H_607_74@

大佬总结

以上是大佬教程为你收集整理的使用XCode/LLDB打印/调试libc STL全部内容,希望文章能够帮你解决使用XCode/LLDB打印/调试libc STL所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。