在大多数情况下,在调试时,如果我有一个向量(在Xcode 9中),我会看到一个表示向量中值的索引列表。
其他时候,我得到了这个无益的代表:
我无法弄清楚哪种情况会导致LLDB以不合需要的方式显示向量。
问题
是什么导致了不良行为?可以在不重写代码的情况下修复吗?这是LLDB中的错误吗?
这是一个重现不良行为的简短代码示例:
#include <iostream>
#include <vector>
std::vector<int> createVector()
{
std::vector<int> v = { 1, 2, 3 };
return v;
}
int main(int argc, const char * argv[])
{
const auto& v = createVector();
std::cout << v.front() << std::endl;
return 0;
}
这是Xcode项目的链接:
http://s000.tinyupload.com/?file_id=21020556485232357417
答案 0 :(得分:3)
抱歉,我在答案中添加了我的评论,因为Stack Overflow评论不支持格式化。
这绝对是lldb的问题。您的图片不包含完整的v说明:
v = (const std::__1::vector<int, std::__1::allocator<int> > &) size=1
size=1
不正确。
除了lldb控制台中的print命令正确打印v
:
(lldb) p v
(const std::__1::vector<int, std::__1::allocator<int> >) $1 = size=3 {
[0] = 1
[1] = 2
[2] = 3
}
似乎Xcode使用lldb frame var
命令来显示变量。这将显示Xcode显示的完全相同的输出:
(lldb) frame variable -T
(int) argc = 1
(const char **) argv = 0x00007fff5fbff710
(const std::__1::vector<int, std::__1::allocator<int> > &) v = size=1: {
(std::__1::__vector_base<int, std::__1::allocator<int> >) std::__1::__vector_base<int, std::__1::allocator<int> > = {
(std::__1::__vector_base<int, std::__1::allocator<int> >::pointer) __begin_ = 0x000000010103fa40
(std::__1::__vector_base<int, std::__1::allocator<int> >::pointer) __end_ = 0x000000010103fa4c
(std::__1::__compressed_pair<int *, std::__1::allocator<int> >) __end_cap_ = {
(std::__1::__libcpp_compressed_pair_imp<int *, std::__1::allocator<int>, 2>) std::__1::__libcpp_compressed_pair_imp<int *, std::__1::allocator<int>, 2> = {
(int *) __first_ = 0x000000010103fa4c
}
}
}
}
我认为这个问题来自于变量v
最初是在另一个堆栈帧中创建并初始化的事实,因此当初始向量作为一个传递时,下层堆栈帧中有关该向量的一些信息是未知的。函数调用的结果。
答案 1 :(得分:3)
这是std :: vector数据摘要&amp;格式化程序适用于参考变量。请注意,在expr v
中,表达式解析器实际上认为v是一个直向量,而不是对向量的引用......这就是打印工作的原因。