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을 실행할 수 있습니다. WindowsGetStringLen 은 WindowsGetStringRawBuffer 소스 수준의 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 형식입니다.
지원되지 않는 키워드
AddressOfEndErrorExitGotoOn ErrorResumeReturnSelect/CaseStopSyncLockThrowTry/Catch/FinallyWith네임스페이스 또는 모듈 수준 키워드(예:
End Sub또는Module.