LLDB有时会显示矢量数据,而其他时间则不会

问题描述 投票:5回答:2

在大多数情况下,在调试时,如果我有一个向量(在Xcode 9中),我会看到一个表示向量中值的索引列表。

期望的enter image description here

其他时候,我得到这个无益的代表:

不受欢迎的enter image description here

我无法弄清楚什么条件会导致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

c++ xcode vector xcode9 lldb
2个回答
3
投票

这是std :: vector数据摘要和格式化程序如何为引用变量工作的已知错误。请注意,在expr v中,表达式解析器实际上认为v是一个直向量,而不是对向量的引用......这就是打印工作的原因。


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最初是在另一个堆栈帧中创建并初始化的事实,因此当作为函数调用的结果传递初始向量时,关于向量的一些信息在较低的堆栈帧中是未知的。

© www.soinside.com 2019 - 2024. All rights reserved.