문제

내가 가지고 있다면 std::vector 또는 std::map 변수가 있고 내용을 보고 싶은데 디버깅하는 동안 n번째 요소를 보는 것은 큰 고통입니다.디버깅하는 동안 STL 컨테이너 변수를 더 쉽게 볼 수 있는 플러그인이나 몇 가지 트릭이 있습니까? (VS2003/2005/2008)?

도움이 되었습니까?

해결책

벡터의 경우 이는 msdn 포럼에는 도움이 될 수 있는 벡터 인덱스에 시계를 설정하기 위한 코드 조각이 있습니다.

다른 팁

동시에 두 개 이상의 요소를 보고 싶다면 다음과 같이 쉼표와 요소 수를 추가할 수 있습니다.

(v._Myfirst)[startIndex], count

그러나 count는 상수여야 하며 다른 표현식의 결과일 수는 없습니다.

VS2005 및 VS 2008에서는 STL 컨테이너의 내용을 볼 수 있습니다.데이터를 가져오기 위한 규칙은 autoexp.dat "c:\Program Files\Microsoft Visual Studio 9\Common7\Packages\Debugger\autoexp.dat"에 있습니다.

AutoExp.dat는 사용자 정의하기 위한 것입니다.그러나 STL 정의는 [Visualizer]라는 섹션 아래에 있습니다.해당 섹션에 사용된 언어를 파악할 수 있다면 더 많은 힘을 얻을 수 있지만 해당 부분은 그대로 두는 것이 좋습니다.

Autoexp.dat는 VS2003에 존재했지만 STL 컨테이너는 지원하지 않았습니다([Visualizer]는 존재하지 않았습니다).VS2003에서는 기본 데이터 표현을 수동으로 탐색해야 합니다.

autoexp.dat를 수정하면 고유한 유형의 데이터 표현을 탐색하기 위한 규칙을 추가하여 디버그하기가 더 쉬워집니다.이렇게 하면 [AutoExp] 아래 항목에만 추가해야 합니다.이 파일을 수정하기 전에 주의하고 백업해 두십시오.

Visual Studio 디버거에서 컨테이너의 n번째 요소를 보려면 다음을 사용합니다.

container.operator[](n)

사용자 정의 Visualiser를 만들 수 있습니다. http://www.virtualdub.org/blog/pivot/entry.php?id=120

가장 간단한 방법은 이와 같은 변수를 감시하기 위한 포인터를 준비해야 한다는 것입니다.

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

VisualStudio2015에서 "a._Myfirst[0]"을 시도했지만 배열 데이터가 표시되지 않았습니다.

"를 사용할 수 있는 경우나트비스"라고 하면 문제가 해결될 것입니다.

Visual Studio 2015의 std::벡터 데이터를 표시하기 위한 "sample.natvis"입니다.

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::vector&lt;*&gt;">
    <DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
      <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
      <ArrayItems>
        <Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
        <ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

전에 enter image description here

후에 enter image description here

적어도 나에게 있어 Visual Studio 2008은 표준 마우스오버 콘텐츠 상자에 STL 컨테이너의 콘텐츠를 표시합니다.

시계의 값을 마우스 오른쪽 버튼으로 클릭하고 '시계 추가'를 선택할 수도 있습니다.이는 지도나 세트의 한 요소만 봐야 하는 경우 유용할 수 있습니다.

또한 christopher_f가 벡터에 대해 게시한 솔루션인 ((v)._Myfirst)[index]로 이어집니다.

위에서 논의한 방법 [((v)._Myfirst)[색인]] 가능한 모든 STL 컨테이너가 아닌 특정 컨테이너(std::Vector)에서만 작동합니다.예를 들어 std::deque의 내용을 보려면 std::deque의 내용을 탐색할 수 있는 다른 방법을 찾아야 합니다.

문제를 해결하기 위해 다음과 유사한 설정을 시도해 볼 수 있습니다.

[Microsoft Visual Studio 2010 서비스 팩 1이 설치된 Visual Studio 2010 Professional 버전에 대해서만 이 설정을 테스트했습니다.]

1 단계:Microsoft Visual Studio 2010 서비스 팩 1 제거 - 프로젝트 작업에는 서비스 팩 1이 실제로 필요하지 않으므로 서비스 팩 1을 제거해도 문제가 발생하지 않습니다.

2 단계:시스템을 다시 시작하십시오.

3단계:'LINK' 오류가 발생하지 않는 경우에는 이 단계가 필요하지 않습니다.치명적인 오류 LNK1123:COFF로 변환 중 실패:파일이 잘못되었거나 손상되었습니다'.그렇지 않으면 탐색해 보세요.

프로젝트 속성 -> 링커(일반) -> 증분 링크 활성화를 아니요(/INCREMENTAL:NO)로 변경합니다.

2015년과 비교하면 이 중 어떤 것도 작동하지 못했습니다.
그래서 나는 약간의 코드를 작성했다

1:나는 가지고 있었다 길고 긴 요소로 구성된 벡터로 구성된 벡터

std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
    std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
        vs[i].append(std::to_string(n));
        });
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger

기본적으로 내가 한 일은 벡터를 문자열로 변환한 것이었습니다.나는 벡터의 벡터를 가지고 있으므로 채울 문자열 벡터가 있었습니다.

2:방금 가지고 있다면 길고 긴 요소의 벡터, 그런 다음 아래와 같이 변환하십시오.

std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
    s.append(std::to_string(n));
    });
// now s is ready for use, for your debugger

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top