WinDbg 및 기타 Windows 디버거의 조건부 중단점
WinDbg 및 기타 Windows 디버거의 조건부 중단점은 특정 조건이 충족되는 경우에만 중단해야 하는 경우에 유용합니다.
조건부 중단점은 bp(중단점 설정) 또는 다른 중단점 명령에 대한 "/w" 매개 변수를 사용하여 만들어집니다. 명령의 기본 구문은 다음과 같습니다.
0:000> bp /w "(Condition)" Address
중단점은 지정된 조건이 true일 때만 디버거에 침입합니다. "w"는 "when"의 약어입니다. 조건 식은 dx(디버거 개체 모델 식 표시) 명령과 함께 사용할 수 있는 모든 항목일 수 있습니다. 여기에는 비교, 산술, 포인터 작업 등을 비롯한 대부분의 C++ 스타일 식이 포함됩니다. 예를 들어 변수가 20을 초과하는 경우에만 중단되는 기본 조건부 중단점을 다음과 같이 작성할 수 있습니다.
0:000> bp /w "MyVar > 20" `mysource.cpp:143`
조건은 디버거 개체 모델을 사용하여 평가되므로 NatVis 지원과 같은 항목을 활용할 수도 있습니다. 예를 들어 myVec이 a라고 std::vector<int>
가정하면 다음과 같은 조건을 만들 수 있습니다.
0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`
myVec 변수에 4개 요소가 있는 동안 mysource.cpp 줄 143이 실행되면 이 작업이 중단됩니다.
natvis 외에도 JavaScript 함수를 호출할 수도 있습니다. WinDbg 스크립트 창 또는 "myFunc"라는 함수가 포함된 .scriptload(스크립트 로드) 명령을 사용하여 스크립트를 로드하는 경우 다음과 같이 중단점을 설정할 수 있습니다.
0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`
디버거에서 JavaScript 함수 및 확장을 작성하는 방법에 대한 자세한 내용은 JavaScript 디버거 스크립팅을 참조 하세요.
상위 수준 식은 일반적으로 가장 유용하지만 이러한 식을 사용하여 레지스터를 평가할 수도 있습니다. 예를 들어 스택 포인터가 일부 임계값에 도달할 때만 트리거되는 중단점을 만들 수 있습니다.
0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`
레거시 조건부 중단점 구문
중단점 명령에 "/w" 매개 변수를 사용할 수 있도록 하기 전에 조건부 중단점을 설정하는 권장 방법은 j(Execute If - Else) 명령 또는 .if 토큰을 사용한 다음 gc(조건부 중단점에서 이동) 명령을 사용하는 것이었습니다. 조건부 중단점을 설정하는 이러한 메서드는 더 이상 권장되지 않지만 여전히 작동하며 다른 원본에서 참조되는 이 구문을 볼 수 있습니다.
j 명령을 사용하는 조건부 중단점에 대한 기본 구문은 다음과 같습니다.
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
.if 토큰을 사용하는 조건부 중단점에 대한 기본 구문은 다음과 같습니다.
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"