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> >)(lldb) frame var my_vec[1](Foo) my_vec[1] = (var1 = 10,var2 = 20)= size=2 { [0] = (var1 = 10,var2 = 20) [1] = (var1 = 10,var2 = 20)}
还有另一个命令“frame variable”,它可以检查静态对象,并挂钩到数据格式化程序。它不能调用函数并执行其他更复杂的表达式解析器任务,但它确实知道如何使用STL数据格式化程序来检索单个元素:
(lldb) frame var -L my_vec[1]0x0000000100100348: (Foo) my_vec[1] = {0x0000000100100348: var1 = 100x000000010010034c: var2 = 20}(lldb) expr printf("%d\n",((class Foo *) 0x0000000100100348)->var1)10(int) = 3
您甚至可以使用frame var的-L选项来定位向量的元素,然后您可以转换地址以将其传递给其他函数:
template class std::vector<MyClass>
另一种解决此问题的方法是调试 – 如果你使用的是C 11 – 是通过以下方式:
在你的代码中的某个地方。这将指示编译器为此专业化发出所有模板函数的外联副本。这不是一个很好的通用解决方案,你只想用于调试版本,但它确实允许你调用这些函数并在复杂的表达式中使用它们。
总结以上是内存溢出为你收集整理的使用XCode/LLDB打印/调试libc STL全部内容,希望文章能够帮你解决使用XCode/LLDB打印/调试libc STL所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)