다음을 통해 공유


Visual Studio 디버거에서의 식 표현

Visual Studio 디버거에는 빠른 조사 (QuickWatch) 대화 상자, 조사 (Watch) 창, 또는 직접 실행 (Immediate) 창에 식을 입력할 때 작동하는 변수 식이 포함되어 있습니다. 식 계산기는 중단점 창과 디버거의 다른 여러 위치에서도 작동합니다.

다음 섹션에서는 Visual Studio에서 지원하는 언어에 대한 식 평가의 제한 사항에 대해 설명합니다.

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

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

C++ 식

C++에서 식과 함께 컨텍스트 연산자를 사용하는 방법에 대한 자세한 내용은 컨텍스트 연산자(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++ 함수를 호출하는 방법을 제공합니다.

디버거 내장 함수:

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

  • 모든 표현식에서 허용되며, 부작용이나 함수 평가가 허용되지 않는 시나리오에서도 가능합니다.

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

    디버거 내장 함수는 식을 더 편리하게 평가할 수도 있습니다. 예를 들어 strcmp(str, "asd")은(는) 디버그 조건에서 str[0] == 'a' && str[1] == 's' && str[2] == 'd'보다 훨씬 쉽게 작성할 수 있습니다. )

Area 내장 함수
문자열 길이 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) 배열 크기(부호 없는 int).
- 반환 값: (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 대한 연산자[]입니다. 키가 '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<>] 및 operator(index<>)

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

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

ConcurrencyArrayView_OperatorBracket_idx // 동시성::array_view<>::operator[index<>] 및 operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // 동시성::array_view<>::operator(int, int, ...)

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

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

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

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

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

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

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

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

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

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

C# - 지원되지 않는 식

동적 개체

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

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

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

  • 숫자 캐스트 및 형식 인수 캐스트를 포함한 많은 캐스트

  • 인수가 두 개 이상인 메서드 호출

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

  • 인수가 있는 속성 setter

  • 인덱서에 할당

  • 부울 연산자 &&||

익명 메서드

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

Visual Basic - 지원되지 않는 식

동적 개체

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

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

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

  • 숫자 캐스트 및 형식 인수 캐스트를 포함한 많은 캐스트

  • 인수가 두 개 이상인 메서드 호출

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

  • 인수가 있는 속성 설정자

  • 인덱서에 할당

  • 부울 연산자 &&||

로컬 상수

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

별칭 가져오기

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

변수 선언

디버거 창에서는 명시적 새 변수를 선언할 수 없습니다. 그러나 직접 실행 창 내에 새 암시적 변수를 할당할 수 있습니다. 이러한 암시적 변수는 디버그 세션으로 범위가 지정되며 디버거 외부에서 액세스할 수 없습니다. 예를 들어 문 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.