다양한 방법으로 사용자 모드 및 커널 모드 애플리케이션에서 예외를 catch하고 처리할 수 있습니다. 활성 디버거, 사후 시스템 디버거 또는 내부 오류 처리 루틴은 모두 예외를 처리하는 일반적인 방법입니다.
이러한 다양한 예외 처리기의 우선 순위에 대한 자세한 내용은 종료 후 디버깅 활성화를 참조하세요.
Microsoft Windows 운영 체제에서 디버거가 예외를 처리하도록 허용하면 예외를 생성한 프로그램이 디버거로 전환됩니다. 즉, 애플리케이션이 중지되고 디버거가 활성화됩니다. 그러면 디버거가 예외를 어떤 식으로든 처리하거나 상황을 분석할 수 있습니다. 그러면 디버거가 프로세스를 종료하거나 실행을 다시 시작하도록 할 수 있습니다.
디버거가 예외를 무시하고 애플리케이션이 계속 실행될 수 있게 하는 경우 운영 체제는 디버거가 없는 것처럼 다른 예외 처리기를 찾습니다. 예외가 처리되면 애플리케이션이 계속 실행됩니다. 그러나 예외가 처리되지 않은 상태로 유지되면 디버거에 상황을 처리할 수 있는 두 번째 기회가 제공됩니다.
디버거를 사용하여 예외 분석
예외 또는 이벤트가 디버거에 침입하는 경우 디버거를 사용하여 실행 중인 코드와 애플리케이션에서 사용 중인 메모리를 검사할 수 있습니다. 특정 수량을 변경하거나 애플리케이션의 다른 지점으로 이동하면 예외의 원인을 제거할 수 있습니다.
gh(예외 처리됨으로 이동) 또는 gn(처리되지 않은 예외로 이동) 명령을 실행하여 실행을 다시 시작할 수 있습니다.
디버거의 두 번째 기회에서 예외를 처리할 때 gn 명령을 실행하면 애플리케이션이 종료됩니다.
Kernel-Mode 예외
커널 모드 코드에서 발생하는 예외는 사용자 모드 예외보다 더 심각합니다. 커널 모드 예외가 처리되지 않으면 버그 검사가 실행되고 시스템이 중지됩니다.
사용자 모드 예외와 마찬가지로 커널 모드 디버거가 시스템에 연결된 경우 버그 확인 화면 ( 파란색 화면이라고도 함)이 나타나기 전에 디버거에 알림이 표시됩니다. 디버거가 연결되어 있지 않으면 버그 확인 화면이 나타납니다. 이 경우 운영 체제에서 크래시 덤프 파일을 만들 수 있습니다.
디버거에서 예외 및 이벤트 제어
특정 방식으로 지정된 예외 및 이벤트에 대응하도록 디버거를 구성할 수 있습니다.
디버거는 각 예외 또는 이벤트에 대한 중단 상태를 설정할 수 있습니다.
이 이벤트는 발생하는 즉시 디버거에 침입할 수 있습니다("첫 번째 기회").
다른 오류 처리기에 응답할 수 있는 기회가 제공된 후 이벤트가 중단됩니다("두 번째 기회").
또한 이 이벤트는 디버거에 메시지를 보낼 수 있지만 계속 실행할 수 있습니다.
디버거는 이벤트를 무시할 수 있습니다.
디버거는 각 예외 및 이벤트에 대한 처리 상태를 설정할 수도 있습니다. 디버거는 이벤트를 처리된 예외 또는 처리되지 않은 예외처럼 처리할 수 있습니다. (물론 실제로 오류가 아닌 이벤트는 처리할 필요가 없습니다.)
다음 중 하나를 수행하여 중단 상태 및 처리 상태를 제어할 수 있습니다.
(CDB 및 NTSD) 명령줄에서 -x, -xe, -xd, -xn 또는 -xi 옵션을 사용합니다.
(CDB, NTSD 및 KD) Tools.ini 파일에서 sxe 또는 sxd 키워드를 사용합니다.
(WinDbg만 해당) 디버그 메뉴에서 이벤트 필터를 선택하여 이벤트 필터 대화 상자를 연 다음 원하는 옵션을 선택합니다.
SX\* 명령, -x\* 명령줄 옵션 및 sx\* Tools.ini 키워드는 일반적으로 지정된 이벤트의 중단 상태를 설정합니다. 대신 처리 상태를 설정하도록 -h 옵션을 추가할 수 있습니다.
중단 상태 대신 처리 상태를 항상 지정하는 4개의 특수 이벤트 코드(cc, hc, bpec 및 ssec)가 있습니다.
.lastevent(마지막 이벤트 표시) 명령을 사용하여 가장 최근의 예외 또는 이벤트를 표시할 수 있습니다.
중단 상태 제어
예외 또는 이벤트의 중단 상태를 설정하는 경우 다음 옵션을 사용할 수 있습니다.
| Command | 상태 이름 | Description |
|---|---|---|
| SXE 또는 -xe | 휴식 시간 (활성화됨) |
이 예외가 발생하면 대상은 즉시 디버거에서 중단됩니다. 이 중단은 다른 오류 처리기가 활성화되기 전에 발생합니다. 이 메서드를 첫 번째 기회 처리라고 합니다. |
| SXD 또는 -xd | 두 번째 기회 재시도 (사용 안 함) |
디버거는 이러한 종류의 첫 번째 예외에 대해 중단되지 않습니다(메시지가 표시되지만). 다른 오류 처리기가 이 예외를 해결할 수 없는 경우 실행이 중지되고 대상이 디버거로 진입하여 중단됩니다. 이 메서드를 두 번째 기회 처리라고 합니다. |
| SXN 또는 -xn | 출력 (알림) |
이 예외가 발생하면 대상 애플리케이션이 디버거에 전혀 침입하지 않습니다. 그러나 사용자에게 이 예외를 알리는 메시지가 표시됩니다. |
| SXI 또는 -xi | 무시하다 |
이 예외가 발생하면 대상 애플리케이션이 디버거에 침입하지 않고 메시지가 표시되지 않습니다. |
SX* 설정에서 예외가 예상되지 않는 경우 대상 애플리케이션은 두 번째 기회에 디버거에 침입합니다. 이벤트의 기본 상태는 이 항목의 다음 "이벤트 정의 및 기본값" 섹션에 나열됩니다.
WinDbg 그래픽 인터페이스를 사용하여 중단 상태를 설정하려면 디버그 메뉴의 이벤트 필터에서 이벤트 필터 대화 상자의 목록에서 원하는 이벤트를 선택한 다음 사용, 사용 안 함, 출력 또는 무시를 선택합니다.
처리 상태 제어
gh(예외 처리로 이동) 명령을 사용하지 않는 한 모든 이벤트는 처리되지 않은 것으로 간주됩니다.
-h 옵션과 함께 * 명령을 사용하지 않는 한 모든 예외는 처리되지 않은 것으로 간주됩니다.
또한 SX* 옵션은 잘못된 핸들, STATUS_BREAKPOINT 중단 지침 및 단일 단계 예외에 대한 처리 상태를 구성할 수 있습니다. (이 구성은 중단 구성과는 별개입니다.) 중단 상태를 구성할 때 이러한 이벤트는 각각 ch, bpe 및 sse로 명명됩니다. 처리 상태를 구성할 때 이러한 이벤트는 각각 hc, bpec 및 ssec로 명명됩니다. (이벤트의 전체 목록은 다음 "이벤트 정의 및 기본값" 섹션을 참조하세요.)
Ctrl+C 이벤트(참조)에 대한 처리 상태를 구성할 수 있지만 중단 상태는 구성할 수 없습니다. 애플리케이션이 Ctrl+C 이벤트를 수신하는 경우 애플리케이션은 항상 디버거로 나뉩니다.
cc, hc, bpec 및 ssec 이벤트에서 SX* 명령을 사용하거나 예외 시 -h 옵션과 함께 SX* 명령을 사용하는 경우 다음 작업이 발생합니다.
| Command | 상태 이름 | Description |
|---|---|---|
SXE |
처리 |
이 이벤트는 실행이 다시 시작될 때 처리되는 것으로 간주됩니다. |
SXD, SXN, SXI |
처리되지 않음 |
이 이벤트는 실행이 다시 시작될 때 처리되지 않는 것으로 간주됩니다. |
WinDbg 그래픽 인터페이스를 사용하여 처리 상태를 설정하려면 디버그 메뉴에서 이벤트 필터를 선택하고, 이벤트 필터 대화 상자의 목록에서 원하는 이벤트를 선택한 다음, 처리됨 또는 처리 안 함을 선택합니다.
자동 명령
또한 디버거를 사용하면 이벤트 또는 예외로 인해 디버거에 침입하는 경우 자동으로 실행되는 명령을 설정할 수 있습니다. 첫 번째 기회 중단에 대한 명령 문자열과 두 번째 기회 중단에 대한 명령 문자열을 설정할 수 있습니다. SX\* 명령 또는 디버그 |를 사용하여 이러한 문자열을 설정할 수 있습니다. 이벤트 필터 명령입니다. 각 명령 문자열에는 세미콜론으로 구분된 여러 명령이 포함될 수 있습니다.
이러한 명령은 중단 상태에 관계없이 실행됩니다. 즉, 중단 상태가 "Ignore"이면 명령이 계속 실행됩니다. 중단 상태가 "두 번째 기회 중단"인 경우 예외가 처음 발생할 때 다른 예외 처리기가 관련되기 전에 첫 번째 기회 명령이 실행됩니다. 명령 문자열은 g(Go), gh(Go with Exception Handled) 또는 gn(처리되지 않은 예외로 이동)과 같은 실행 명령으로 끝날 수 있습니다.
이벤트 정의 및 기본값
다음 예외의 중단 상태 또는 처리 상태를 변경할 수 있습니다. 기본 중단 상태가 표시됩니다.
다음 예외의 기본 처리 상태는 항상 "처리되지 않음"입니다. 이 상태를 변경하는 데 주의하세요. 이 상태를 "처리됨"으로 변경하면 이 형식의 모든 첫 번째 및 두 번째 예외가 처리된 것으로 간주되며 이 구성은 모든 예외 처리 루틴을 무시합니다.
| 이벤트 코드 | Meaning | 기본 중단 상태 |
|---|---|---|
asrt |
어설션 실패 |
휴식 |
av |
액세스 위반 |
휴식 |
데시미터 |
잘못 정렬된 데이터 |
휴식 |
dz |
정수 나누기 0 |
휴식 |
c000008e |
부동 소수점의 0으로 나누기 |
휴식 |
어 |
C++ EH 예외 |
두 번째 기회를 위한 중단 |
gp |
보호 페이지 위반 |
휴식 |
ii |
잘못된 지침 |
두 번째 기회 휴식 |
iov |
정수 오버플로 |
휴식 |
ip |
페이지 내 I/O 오류 |
휴식 |
isc |
잘못된 시스템 호출 |
휴식 |
lsq |
잘못된 잠금 시퀀스 |
휴식 |
sbo |
스택 버퍼 오버플로 |
휴식 |
sov |
스택 오버플로 |
휴식 |
wkd |
디버거 활성화 |
휴식 |
aph |
애플리케이션 중단 이 예외는 Windows 운영 체제에서 프로세스가 응답을 중지했다고 결론지을 경우 트리거됩니다(즉, 중단됨). |
휴식 |
3c |
자식 애플리케이션 종료하기 |
두 번째 기회 제공 |
채널 |
잘못된 핸들 |
휴식 |
숫자 |
번호가 매겨진 예외 |
두 번째 기회의 재도전 |
메모ah(어설션 처리) 명령을 사용하여 특정 주소에 대한 asrt 중단 상태를 재정의할 수 있습니다. ch 및 hc 이벤트 코드는 동일한 예외를 참조합니다. 중단 상태를 제어하는 경우 sx* ch를 사용합니다. 처리 상태를 제어하는 경우 sx* hc를 사용합니다.
다음 예외의 중단 상태 또는 처리 상태를 변경할 수 있습니다. 기본 중단 상태가 표시됩니다.
다음 예외의 기본 처리 상태는 항상 "처리됨"입니다. 이러한 예외는 디버거와 통신하는 데 사용되므로 일반적으로 상태를 "처리되지 않음"으로 변경해서는 안 됩니다. 디버거에서 예외를 무시할 경우, 이 상태는 다른 예외 처리기가 예외를 포착하도록 합니다.
애플리케이션은 DBG_COMMAND_EXCEPTION(dbce)를 사용하여 디버거와 통신할 수 있습니다. 이 예외는 중단점과 유사하지만 이 예외가 발생할 때 SX* 명령을 사용하여 특정 방식으로 반응할 수 있습니다.
| 이벤트 코드 | Meaning | 기본 중단 상태 |
|---|---|---|
dbce |
특수 디버거 명령 예외 |
무시 |
vcpp |
특수 Visual C++ 예외 |
무시 |
wos |
WOW64 단일 단계 예외 |
휴식 |
wob |
WOW64 중단점 예외- |
휴식 |
SSE |
단일 단계 예외 |
휴식 |
bpe |
중단점 예외 |
휴식 |
cce |
Ctrl+C 또는 Ctrl+BREAK 이 예외는 대상이 콘솔 애플리케이션이고 Ctrl+C 또는 Ctrl+BREAK가 전달되는 경우 트리거됩니다. |
휴식 |
메모 앞의 테이블의 마지막 세 가지 예외에는 두 가지 이벤트 코드가 있습니다. 중단 상태를 제어하는 경우 sse, bpe 및 cce를 사용합니다. 처리 상태를 제어하는 경우 ssec, bpec 및 cc를 사용합니다.
다음 예외는 관리 코드를 디버깅할 때 유용합니다.
| 이벤트 코드 | Meaning | 기본 상태 |
|---|---|---|
clr |
공용 언어 런타임 예외 |
두 번째 기회의 재도전 처리되지 않음 |
clrn |
공용 언어 런타임 알림 예외 |
두 번째 기회의 재도전 Handled |
다음 이벤트의 중단 상태를 변경할 수 있습니다. 이러한 이벤트는 예외가 아니므로 처리 상태는 관련이 없습니다.
| 이벤트 코드 | Meaning | 기본 중단 상태 |
|---|---|---|
ser |
시스템 오류 |
무시 |
cpr[:프로세스] |
프로세스 만들기 이 이벤트의 중단 상태 설정은 사용자 모드 디버깅에만 적용됩니다. 이 이벤트는 커널 모드에서 발생하지 않습니다. -o명령줄 옵션 또는 .childdbg(자식 프로세스 디버그) 명령을 통해 CDB 또는 WinDbg에서 자식 프로세스의 디버 깅을 활성화한 경우에만 이 이벤트를 제어할 수 있습니다. 프로세스 이름에는 선택적 파일 이름 확장명과 별표() 또는 물음표(?)가 와일드카드 문자로 포함될 수 있습니다. 디버거는 가장 최근의 cpr 설정만 기억합니다. 별도의 프로세스에 대한 별도의 설정은 지원되지 않습니다. cpr와 프로세스 사이에 콜론이나 공백을 넣으세요. 프로세스를 생략하면 자식 프로세스 생성에 설정이 적용됩니다. |
무시 |
epr[:프로세스] |
프로세스 종료 이 이벤트의 중단 상태 설정은 사용자 모드 디버깅에만 적용됩니다. 이 이벤트는 커널 모드에서 발생하지 않습니다. -o명령줄 옵션 또는 .childdbg(자식 프로세스 디버그) 명령을 통해 CDB 또는 WinDbg에서 자식 프로세스의 디버 깅을 활성화한 경우에만 이 이벤트를 제어할 수 있습니다. 프로세스 이름에는 선택적 파일 이름 확장명과 별표() 또는 물음표(?)가 와일드카드 문자로 포함될 수 있습니다. 디버거는 가장 최근의 epr 설정만 기억합니다. 별도의 프로세스에 대한 별도의 설정은 지원되지 않습니다. epr와 Process 사이에 콜론 또는 공백을 포함합니다. 프로세스를 생략하면 자식 프로세스 종료에 설정이 적용됩니다. |
무시 |
코네티컷 |
스레드 만들기 |
무시 |
동부 표준시 |
스레드 종료 |
무시 |
ld[:모듈] |
모듈 로드 모듈을 지정하면 이 이름의 모듈이 로드될 때 중단이 발생합니다. 모듈은 모듈 의 이름 또는 주소를 지정할 수 있습니다. 이름을 사용하는 경우 모듈 에는 다양한 와일드카드 문자와 지정자가 포함될 수 있습니다. 구문에 대한 자세한 내용은 문자열 와일드카드 구문을 참조하세요. 디버거는 가장 최근의 ld 설정만 기억합니다. 별도의 모듈에 대한 별도의 설정은 지원되지 않습니다. 콜론 또는 ld 와 모듈 사이의 공백을 포함합니다. 모듈을 생략하면 모듈이 로드될 때 이벤트가 트리거됩니다. |
출력 |
ud[:모듈] |
모듈 언로드 모듈을 지정하면 이 이름을 가진 모듈 또는 이 기본 주소에서 언로드될 때 중단이 발생합니다. 모듈은 모듈 의 이름 또는 주소를 지정할 수 있습니다. 이름을 사용하는 경우 모듈 은 정확한 이름이거나 와일드카드 문자를 포함할 수 있습니다. 모듈이 정확한 이름인 경우 현재 디버거 모듈 목록을 사용하여 기본 주소로 즉시 확인되고 주소로 저장됩니다. 모듈에 와일드카드 문자가 포함된 경우 언로드 이벤트가 발생할 때 나중에 일치하기 위해 패턴 문자열이 유지됩니다. 디버거에는 언로드 이벤트에 대한 이름 정보가 없으며 기본 주소에서만 일치하는 경우가 거의 없습니다. 따라서 모듈 에 와일드카드 문자가 포함된 경우 디버거는 이 특정 언로드 사례에서 이름 일치를 수행할 수 없으며 모듈이 언로드될 때 중단됩니다. 디버거는 가장 최근의 ud 설정만 기억합니다. 별도의 모듈에 대한 별도의 설정은 지원되지 않습니다. 콜론 또는 ud 와 모듈 사이에 공백을 포함합니다. 모듈을 생략하면 모듈이 로드될 때 이벤트가 트리거됩니다. |
출력 |
out[:Output] |
대상 애플리케이션 출력 출력을 지정하면 지정된 패턴과 일치하는 출력이 수신될 때만 중단이 발생합니다. 출력 에는 다양한 와일드카드 문자와 지정자가 포함될 수 있습니다. 구문에 대한 자세한 내용은 문자열 와일드카드 구문을 참조하세요. 그러나 출력 에는 콜론이나 공백이 포함될 수 없습니다. 일치 항목은 대/소문자를 구분하지 않습니다. 출력과 출력 사이에 콜론 또는 공백을 포함합니다. |
무시 |
ibp |
초기 중단점 (이 이벤트는 디버그 세션의 시작 부분과 대상 컴퓨터를 다시 시작한 후에 발생합니다.) |
사용자 모드에서: 휴식. -g명령줄 옵션을 사용하여 이 상태를 "무시"로 변경할 수 있습니다. 커널 모드에서: 무시하다. 다양한 방법으로 이 상태를 "사용"으로 변경할 수 있습니다. 이 상태를 변경하는 방법에 대한 자세한 내용은 대상 컴퓨터 충돌 및 다시 부팅을 참조하세요. |
iml |
초기 모듈 로드 (커널 모드에만 해당) |
무시. 다양한 방법으로 이 상태를 "중단"으로 변경할 수 있습니다. 이 상태를 변경하는 방법에 대한 자세한 내용은 대상 컴퓨터 충돌 및 다시 부팅을 참조하세요. |