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이 실행될 수 있습니다. WindowsGetStringLen 및 WindowsGetStringRawBuffer 는 실행 엔진(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
과 같은 네임스페이스 또는 모듈 수준 키워드