在大多数情况下,在调试时,如果我有一个向量(在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
这是std :: vector数据摘要和格式化程序如何为引用变量工作的已知错误。请注意,在expr v
中,表达式解析器实际上认为v是一个直向量,而不是对向量的引用......这就是打印工作的原因。
抱歉,我在答案中添加了我的评论,因为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
最初是在另一个堆栈帧中创建并初始化的事实,因此当作为函数调用的结果传递初始向量时,关于向量的一些信息在较低的堆栈帧中是未知的。