2017-12-17 6 views
4

디버깅 할 때 대부분 벡터 (Xcode 9)가있는 경우 벡터의 값을 나타내는 인덱스 목록이 표시됩니다. 나는 조건이 LLDB이의 벡터를 표시하는 원인이 무엇인지 알아낼 수 없습니까 enter image description hereLLDB가 벡터 데이터를 표시하고 다른 시간이 표시되지 않는 경우가 있음

원하지 않는 :

원하는 enter image description here

다른 시간, 나는이 도움이되지 않는 표현을 얻을 바람직하지 않은 방법.

질문
바람직하지 않은 동작의 원인은 무엇입니까? 코드를 다시 작성하지 않고도 고칠 수 있습니까? 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

둘 사이의 유일한 명백한 차이는 하나가 완전히 STL 유형이라는 것입니다. 즉 int에 대한 고유 포인터의 벡터입니다. 두 번째는 사용자 지정 또는 타사 라이브러리 유형을 포함합니다. 아마도 XCode가 "Imxr :: MxrLinked [List]"유형을 구문 분석하는 방법을 모르는 경우 고유 한 ptr/벡터를 모두 파싱하는 것을 포기할 것입니까? – jwimberley

+0

나는 이것이 문제가 아니라는 것을 분명히하기 위해 질문을 편집했다. 편집이 도움이되는지 알려주세요. –

+0

어떤 최적화 작업을 수행합니까? – Niall

답변

3

이것은 std :: vector 데이터 요약 & 포매터가 참조 변수에 대해 작동하는 방법의 알려진 버그입니다. expr v 표현 파서는 실제로 v가 벡터에 대한 참조가 아닌 직선 벡터라고 간주한다는 점에 유의하십시오. 이것이 인쇄가 작동하는 이유입니다.

+0

오픈 버그 리포트가 있습니까? 그렇다면 링크가 대답을 완료합니다. –

+1

Apple Bug Reporter 시스템에는 버그가 있지만 버그를 제기 한 사람에게만 외부에서 볼 수 있습니다. http://llvm.org/bugs 추적기에서 동일한 버그를 찾지 못했습니다. 누군가 외부에서 우리가 그것에 적응하기 전에 그것을 고칠 시간이 있다면 그것을 추가하는 것이 가치가 있습니다. –

3

미안, 나는 여기에 내 코멘트를 추가 스택 오버플로 주석은 서식을 지원하지 않기 때문에 답변이 필요합니다.

확실히 lldb의 문제입니다.

v = (const std::__1::vector<int, std::__1::allocator<int> > &) size=1 

size=1이 잘못된 : 당신의 사진이 전체 V 설명이 포함되어 있지 않습니다. 제대로 lldb 콘솔 인쇄 v에서 인쇄 명령 게다가 은 :

(lldb) p v 
(const std::__1::vector<int, std::__1::allocator<int> >) $1 = size=3 { 
    [0] = 1 
    [1] = 2 
    [2] = 3 
} 

이 엑스 코드는 변수를 표시 할 lldb frame var 명령을 사용하는 것 같다. 이 엑스 코드로 표시됩니다 정확히 같은 출력을 표시 :

(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 처음에 따라서 벡터에 대한 몇 가지 정보에 알 수 만들고 다른 스택 프레임에서 초기화되었다는 사실에서 오는 생각 함수 호출의 결과로 초기 벡터가 전달되었을 때 하부 스택 프레임.

관련 문제