Visual Studio 디버깅에서 STL 컨테이너 검사
-
01-07-2019 - |
문제
내가 가지고 있다면 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<*>">
<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>
적어도 나에게 있어 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
도움이 되었기를 바랍니다.