Visual Studio 디버거의 식

Visual Studio 디버거에는 간략한 조사식 대화 상자, 조사식 창 또는 직접 실행 창에 식을 입력할 때 사용되는 식 계산기가 포함되어 있습니다. 식 계산기는 중단점 창과 디버거의 여러 가지 다른 부분에서도 사용됩니다.

다음 섹션에서는 Visual Studio에서 지원되는 언어의 식 계산 제한 사항을 설명합니다.

F# 식은 지원되지 않습니다.

F# 식은 인식되지 않습니다. F# 코드를 디버그하는 경우 디버거 창 또는 대화 상자에 식을 입력하기 전에 식을 C# 구문으로 변환해야 합니다. F#에서 C#으로 식을 변환하는 경우 C#은 == 연산자를 사용하여 같은지 테스트하는 반면 F#은 단일 =를 사용한다는 것에 유의하세요.

C++ 식

C++에서 식과 함께 컨텍스트 연산자를 사용하는 방법에 대한 자세한 내용은 Context Operator (C++)를 참조하세요.

C++에서 지원되지 않는 식

생성자, 소멸자 및 변환

개체에 대한 생성자 또는 소멸자를 명시적으로 또는 암시적으로 호출할 수 없습니다. 예를 들어 다음 식을 사용하여 명시적으로 생성자를 호출하면 오류 메시지가 나타납니다.

my_date( 2, 3, 1985 )

변환 대상이 클래스인 경우에는 변환 함수를 호출할 수 없습니다. 이러한 변환에는 개체 생성이 포함됩니다. 예를 들어 myFraction 이 변환 함수 연산자 CFraction를 정의하는 FixedPoint의 인스턴스인 경우에 다음 식을 사용하면 오류가 발생합니다.

(FixedPoint)myFraction

새 연산자 또는 삭제 연산자를 호출할 수 없습니다. 예를 들어 다음 식은 지원되지 않습니다.

new Date(2,3,1985)

전처리기 매크로

전처리기 매크로는 디버거에서 지원되지 않습니다. 예를 들어 상수가 VALUE 다음과 #define VALUE 3같이 선언되면 조사식 창에서 사용할 VALUE 수 없습니다. 이 제한을 방지하려면 가능한 경우 항상 #define을 열거형 및 함수로 바꿔야 합니다.

네임스페이스 선언 사용

선언은 사용할 using namespace 수 없습니다. 현재 네임스페이스 외부에서 유형 이름 또는 변수에 액세스하려면 정규화된 이름을 사용해야 합니다.

익명 네임스페이스

익명 네임스페이스는 지원되지 않습니다. 다음 코드가 있는 경우 조사식 창에 추가할 test 수 없습니다.

namespace mars
{
    namespace
    {
        int test = 0;
    }
}
int main()
{
    // Adding a watch on test doesn't work.
    mars::test++;
    return 0;
}

디버거 내장 함수를 사용하여 상태 유지

디버거 내장 함수는 애플리케이션의 상태를 변경하지 않고 식에서 특정 C/C++ 함수를 호출하는 방법을 제공합니다.

디버거 내장 함수의 특징은 다음과 같습니다.

  • 안전이 보장됩니다. 디버거 내장 함수를 실행해도 디버깅 중인 프로세스가 손상되지 않습니다.

  • 부작용 및 함수 평가가 허용되지 않는 시나리오에서도 모든 식에서 허용됩니다.

  • 미니덤프 디버깅과 같이 일반 함수 호출이 불가능한 시나리오에서 작동합니다.

    디버거 내장 함수를 사용하면 식 계산도 보다 편리해질 수 있습니다. 예를 들어 strncmp(str, "asd")str[0] == 'a' && str[1] == 's' && str[2] == 'd'보다 중단점 조건에서 작성하기가 훨씬 쉽습니다. )

지역 내장 함수
문자열 길이 strlen, wcslen, strnlen, wcsnlen
문자열 비교 strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
문자열 검색 strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

이러한 함수를 사용하려면 디버깅 중인 프로세스가 Windows 8에서 실행되어야 합니다. Windows 8 디바이스에서 생성된 덤프 파일을 디버깅하려면 Visual Studio 컴퓨터에서 Windows 8이 실행되어야 합니다. 그러나 Windows 8 디바이스를 원격으로 디버그하는 경우에는 Visual Studio 컴퓨터에서 Windows 7이 실행될 수 있습니다.
WindowsGetStringLenWindowsGetStringRawBuffer는 실행 엔진(EE)에서 소스 수준으로만 사용합니다.
기타 __log2 - 가장 가까운 낮은 정수로 반올림된 밑이 2인 지정된 정수의 로그 값을 반환합니다.

__findNonNull - 포인터 배열을 검색하여 null이 아닌 첫 번째 요소의 인덱스를 반환합니다.
- 매개 변수: (1) 배열의 첫 번째 요소에 대한 포인터(void*), (2) 배열 크기(부호 없는 정수).
- 반환 값: (1) 배열에서 null이 아닌 첫 번째 요소의 0부터 시작하는 인덱스 또는 찾을 수 없는 경우 -1.

DecodeHString - HSTRING 값의 형식을 지정하는 도우미 함수입니다. 스택에서 HSTRING 값이 표시되며, EE가 활용하여 문자열의 위치를 알려줄 수 있는 StringInfo 구조체의 바이트를 푸시합니다. 이는 EE에서 내부적으로만 사용됩니다. 사용자가 직접 호출할 수 없습니다.

DecodeWinRTRestrictedException - WinRT 제한된 예외를 디코딩하여 제한된 설명을 얻습니다.
- 매개 변수: (1) 제한된 참조 문자열을 나타내는 null로 끝나는 문자열의 문자입니다.
- 반환 값: 표시할 실제 오류 메시지를 포함하는 null로 끝나는 문자열의 문자입니다.

DynamicCast - dynamic_cast를 구현합니다.
- 매개 변수: (1) 캐스팅할 개체에 대한 포인터입니다.
- 데이터 항목: CDynamicCastData 개체는 대응하는 ExecuteIntrinsic() 명령에 데이터 항목으로 연결되어야 합니다. 데이터 항목은 캐스팅하는 형식과 natvis 식을 평가하는지 여부(무한 재귀를 중단하는 데 진단 필요)를 인코딩합니다.
- 반환 값: (1) 올바른 형식으로 캐스팅된 개체에 대한 포인터이거나, 캐스팅되는 개체가 올바른 형식의 인스턴스가 아닌 경우 NULL입니다.

DynamicMemberLookup - 클래스 멤버의 값을 동적으로 얻는 도우미 함수입니다

GetEnvBlockLength - 환경 블록의 길이를 문자 단위로 얻는 도우미 함수입니다. $env에 사용합니다.

Stdext_HashMap_Int_OperatorBracket_idx - stdext::hash_map의 operator[]입니다. 키가 'int'인 기본 해시 함수를 가정합니다. 값을 반환합니다. 내장 연산자[]는 해시 테이블에서 기존 항목을 검색하는 것만 지원합니다. 메모리 할당과 같은 원치 않는 복잡성을 포함할 수 있으므로 테이블에 새 항목을 삽입하는 것은 지원되지 않습니다. 그러나 operator[]를 사용하여 테이블에 이미 있는 키와 연결된 값을 수정할 수는 있습니다.
- 스택 매개 변수: (1) stdext::hash_map 개체의 주소, (2) 테이블에 입력되는 키(int), (3) 함수 구현이 조회를 수행하는 데 필요한 멤버의 필드 오프셋을 지정하는 HashMapPdb 구조체입니다. 기호에 대한 직접 액세스는 원격 쪽에서 사용할 수 없으므로 이 작업이 필요합니다.
- 반환 값: (1) 키가 테이블에 있는 경우 키에 대응하는 값의 주소입니다. 그렇지 않으면 NULL입니다.

Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map은 해시 함수가 다르다는 점만 제외하면 stdext::hash_map과 같은 방식으로 작동합니다.

ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] and operator(index<>)

ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] and operator(tiled_index<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] and operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] and operator(tiled_index<>)

TreeTraverse_Init - 새 트리 순회를 초기화합니다.
.natvis 파일에서 사용할 수 없는 확장 기반 시각화 도우미를 지원합니다.

TreeTraverse_Next - 보류 중인 트리 순회에서 노드를 검색합니다.
.natvis 파일에서 사용할 수 없는 확장 기반 시각화 도우미를 지원합니다.

TreeTraverse_Skip - 보류 중인 트리 순회의 노드를 건너뜁니다.
.natvis 파일에서 사용할 수 없는 확장 기반 시각화 도우미를 지원합니다.

C++/CLI - 지원되지 않는 식

  • 포인터 또는 사용자 정의 캐스트를 포함하는 캐스트는 지원되지 않습니다.

  • 개체 비교 및 할당은 지원되지 않습니다.

  • 오버로드된 연산자와 오버로드된 함수는 지원되지 않습니다.

  • Boxing 및 unboxing은 지원되지 않습니다.

  • Sizeof 연산자는 지원되지 않습니다.

C# - 지원되지 않는 식

동적 개체

디버거 식에서 정적으로 형식화된 변수를 동적으로 사용할 수 있습니다. IDynamicMetaObjectProvider를 구현하는 개체가 조사식 창에서 평가될 때 동적 뷰 노드가 추가됩니다. 동적 보기 노드는 개체 멤버를 표시하지만 멤버의 값 편집을 허용하지 않습니다.

동적 개체의 다음 기능은 지원되지 않습니다.

  • 복합 연산자 +=, -=, %=, /=*=

  • 숫자 캐스트 및 형식 인수 캐스트를 비롯한 다양한 캐스트

  • 세 개 이상의 인수가 있는 메서드 호출

  • 세 개 이상의 인수가 있는 속성 getter

  • 여러 인수가 있는 속성 setter

  • 인덱서에 할당

  • 부울 연산자 &&||

무명 메서드

새 익명 메서드 만들기는 지원되지 않습니다.

Visual Basic - 지원되지 않는 식

동적 개체

디버거 식에서 정적으로 형식화된 변수를 동적으로 사용할 수 있습니다. IDynamicMetaObjectProvider를 구현하는 개체가 조사식 창에서 평가될 때 동적 뷰 노드가 추가됩니다. 동적 보기 노드는 개체 멤버를 표시하지만 멤버의 값 편집을 허용하지 않습니다.

동적 개체의 다음 기능은 지원되지 않습니다.

  • 복합 연산자 +=, -=, %=, /=*=

  • 숫자 캐스트 및 형식 인수 캐스트를 비롯한 다양한 캐스트

  • 세 개 이상의 인수가 있는 메서드 호출

  • 세 개 이상의 인수가 있는 속성 getter

  • 여러 인수가 있는 속성 setter

  • 인덱서에 할당

  • 부울 연산자 &&||

지역 상수

로컬 상수는 지원되지 않습니다.

Import 별칭

가져오기 별칭은 지원되지 않습니다.

변수 선언

디버거 창에서는 명시적 새 변수를 선언할 수 없습니다. 그러나 직접 실행 창 내에서 새 암시적 변수를 할당할 수 있습니다. 이러한 암시적 변수는 디버그 세션으로 범위가 지정되며 디버거 외부에서 액세스할 수 없습니다. 예를 들어 o = 5 문은 새 변수 o 를 암시적으로 만들고 이 변수에 5를 값으로 할당합니다. 디버거에서 형식을 유추할 수 없는 경우 이와 같은 암시적 변수의 형식은 Object 입니다.

지원되지 않는 키워드

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • End Sub 또는 Module과 같은 네임스페이스 또는 모듈 수준 키워드