예외 및 이벤트 제어

다양한 방법으로 사용자 모드 및 커널 모드 애플리케이션에서 예외를 catch하고 처리할 수 있습니다. 활성 디버거, 사후 시스템 디버거 또는 내부 오류 처리 루틴은 모두 예외를 처리하는 일반적인 방법입니다.

이러한 다양한 예외 처리기의 우선 순위에 대한 자세한 내용은 사후 관리 디버깅 사용을 참조하세요.

Microsoft Windows 운영 체제에서 디버거가 예외를 처리하도록 허용하면 예외를 생성한 애플리케이션이 디버거 로 나뉩니다 . 즉, 애플리케이션이 중지되고 디버거가 활성화됩니다. 그런 다음 디버거는 어떤 식으로든 예외를 처리하거나 상황을 분석할 수 있습니다. 그러면 디버거가 프로세스를 종료하거나 실행을 다시 시작할 수 있습니다.

디버거가 예외를 무시하고 애플리케이션이 계속 실행되면 운영 체제는 디버거가 없는 것처럼 다른 예외 처리기를 찾습니다. 예외가 처리되면 애플리케이션이 계속 실행됩니다. 그러나 예외가 처리되지 않은 상태로 유지되면 디버거에 상황을 처리할 수 있는 두 번째 기회가 제공됩니다.

디버거를 사용하여 예외 분석

예외 또는 이벤트가 디버거에 침입하는 경우 디버거를 사용하여 실행 중인 코드와 애플리케이션이 사용하는 메모리를 검사할 수 있습니다. 특정 수량을 변경하거나 애플리케이션에서 다른 지점으로 이동하면 예외의 원인을 제거할 수 있습니다.

gh(예외 처리됨으로 이동) 또는 gn(처리되지 않은 예외로 이동) 명령을 실행하여 실행을 다시 시작할 수 있습니다.

디버거의 두 번째 예외 처리 기회에서 gn 명령을 실행하면 애플리케이션이 종료됩니다.

커널 모드 예외

커널 모드 코드에서 발생하는 예외는 사용자 모드 예외보다 더 심각합니다. 커널 모드 예외가 처리되지 않으면 버그 검사 실행되고 시스템이 중지됩니다.

사용자 모드 예외와 마찬가지로 커널 모드 디버거가 시스템에 연결된 경우 버그 검사 화면(파란색 화면이라고도 함)이 나타나기 전에 디버거에 알림이 표시됩니다. 디버거가 연결되어 있지 않으면 버그 검사 화면이 나타납니다. 이 경우 운영 체제에서 크래시 덤프 파일을 만들 수 있습니다.

디버거에서 예외 및 이벤트 제어

특정 방식으로 지정된 예외 및 이벤트에 대응하도록 디버거를 구성할 수 있습니다.

디버거는 각 예외 또는 이벤트에 대한 중단 상태 설정할 수 있습니다.

  • 이벤트가 발생하는 즉시 디버거가 중단될 수 있습니다("첫 번째 기회").

  • 다른 오류 처리기에 응답할 기회가 주어지면 이벤트가 중단됩니다("두 번째 기회").

  • 또한 이벤트는 디버거에 메시지를 보낼 수 있지만 계속 실행할 수 있습니다.

  • 디버거는 이벤트를 무시할 수 있습니다.

디버거는 각 예외 및 이벤트에 대한 처리 상태 설정할 수도 있습니다. 디버거는 이벤트를 처리된 예외 또는 처리되지 않은 예외처럼 처리할 수 있습니다. (물론 실제로 오류가 아닌 이벤트는 처리가 필요하지 않습니다.)

다음 중 하나를 수행하여 중단 상태 및 처리 상태 제어할 수 있습니다.

  • 디버거 명령 창에서 SXE, SXD, SXN 또는 SXI 명령을 사용합니다.

  • (CDB 및 NTSD) 명령줄에서 -x, -xe, -xd, -xn 또는 -xi 옵션을 사용합니다.

  • (CDB, NTSD 및 KD)Tools.ini파일에서 sxe 또는 sxd 키워드(keyword) 사용합니다.

  • (WinDbg에만 해당) 디버그 메뉴에서 이벤트 필터를 선택하여 이벤트 필터 대화 상자를 연 다음 원하는 옵션을 선택합니다.

SX\* 명령, -x\* 명령줄 옵션 및 sx\* Tools.ini 키워드(keyword) 일반적으로 지정된 이벤트의 중단 상태 설정합니다. -h 옵션을 추가하여 처리 상태 대신 설정할 수 있습니다.

중단 상태 대신 항상 처리 상태 지정하는 4개의 특수 이벤트 코드(cc, hc, bpecssec)가 있습니다.

.lastevent(마지막 이벤트 표시) 명령을 사용하여 가장 최근의 예외 또는 이벤트를 표시할 수 있습니다.

중단 상태 제어

예외 또는 이벤트의 중단 상태 설정하는 경우 다음 옵션을 사용할 수 있습니다.

명령 상태 이름 Description

SXE 또는 -xe

휴식 시간

(사용)

이 예외가 발생하면 대상이 디버거로 즉시 중단됩니다. 이 중단은 다른 오류 처리기가 활성화되기 전에 발생합니다. 이 메서드를 첫 번째 기회 처리라고 합니다.

SXD 또는 -xd

두 번째 기회 휴식

(사용 안 함)

디버거는 이러한 종류의 첫 번째 예외에 대해 중단되지 않습니다(메시지가 표시되지만). 다른 오류 처리기가 이 예외를 해결할 수 없는 경우 실행이 중지되고 대상이 디버거로 중단됩니다. 이 메서드를 두 번째 확률 처리라고 합니다.

SXN 또는 -xn

출력

(알림)

이 예외가 발생하면 대상 애플리케이션이 디버거에 전혀 침입하지 않습니다. 그러나 사용자에게 이 예외를 알리는 메시지가 표시됩니다.

SXI 또는 -xi

무시

이 예외가 발생하면 대상 애플리케이션이 디버거에 침입하지 않고 메시지가 표시되지 않습니다.

SX* 설정에서 예외가 예상되지 않으면 대상 애플리케이션이 두 번째 기회에 디버거로 중단됩니다. 이벤트에 대한 기본 상태 이 항목의 다음 "이벤트 정의 및 기본값" 섹션에 나열되어 있습니다.

WinDbg 그래픽 인터페이스를 사용하여 중단 상태 설정하려면 디버그 메뉴의 이벤트 필터에서 이벤트 필터 대화 상자의 목록에서 원하는 이벤트를 선택한 다음 사용, 사용 안 함, 출력 또는 무시를 선택합니다.

처리 상태 제어

gh(예외 처리로 이동) 명령을 사용하지 않는 한 모든 이벤트는 처리되지 않은 것으로 간주됩니다.

-h 옵션과 함께 sx\* 명령을 사용하지 않는 한 모든 예외는 처리되지 않은 것으로 간주됩니다.

또한 SX* 옵션은 잘못된 핸들, 중단 명령 STATUS_BREAKPOINT 및 단일 단계 예외에 대한 처리 상태 구성할 수 있습니다. (이 구성은 중단 구성과는 별개입니다.) 중단 상태 구성하는 경우 이러한 이벤트는 각각 ch, bpesse로 명명됩니다. 처리 상태 구성할 때 이러한 이벤트는 각각 hc, bpecssec로 명명됩니다. (이벤트의 전체 목록은 다음 "이벤트 정의 및 기본값" 섹션을 참조하세요.)

Ctrl+C 이벤트(참조)에 대한 처리 상태 구성할 수 있지만 중단 상태 구성할 수는 없습니다. 애플리케이션이 Ctrl+C 이벤트를 수신하는 경우 애플리케이션은 항상 디버거로 나뉩니다.

cc, hc, bpecssec 이벤트에서 SX* 명령을 사용하거나 예외 시 -h 옵션과 함께 SX* 명령을 사용하는 경우 다음 작업이 발생합니다.

명령 상태 이름 Description

SXE

처리

이벤트는 실행이 다시 시작될 때 처리되는 것으로 간주됩니다.

SXD, SXN, SXI

처리되지 않음

이벤트는 실행이 다시 시작될 때 처리되지 않는 것으로 간주됩니다.

WinDbg 그래픽 인터페이스를 사용하여 처리 상태 설정하려면 디버그 메뉴에서 이벤트 필터를 선택하고 이벤트 필터 대화 상자의 목록에서 원하는 이벤트를 선택한 다음 처리됨 또는 처리 안 함을 선택합니다.

자동 명령

또한 디버거를 사용하면 이벤트 또는 예외로 인해 디버거가 중단될 경우 자동으로 실행되는 명령을 설정할 수 있습니다. 첫 번째 기회 중단에 대한 명령 문자열과 두 번째 기회 중단에 대한 명령 문자열을 설정할 수 있습니다. SX\* 명령 또는 디버그 | 를 사용하여 이러한 문자열을 설정할 수 있습니다. 이벤트 필터 명령. 각 명령 문자열에는 세미콜론으로 구분된 여러 명령이 포함될 수 있습니다.

이러한 명령은 중단 상태 관계없이 실행됩니다. 즉, 중단 상태 "무시"인 경우 명령은 계속 실행됩니다. 중단 상태 "두 번째 기회 중단"인 경우 예외가 처음 발생할 때 다른 예외 처리기가 포함되기 전에 첫 번째 기회 명령이 실행됩니다. 명령 문자열은 g(Go), gh(예외 처리됨으로 이동) 또는 gn(처리되지 않은 예외로 이동)과 같은 실행 명령으로 끝날 수 있습니다.

이벤트 정의 및 기본값

중단 상태 변경하거나 다음 예외의 상태 처리할 수 있습니다. 기본 중단 상태 표시됩니다.

다음 예외의 기본 처리 상태 항상 "처리되지 않음"입니다. 이 상태 변경하는 데 주의하세요. 이 상태 "처리됨"으로 변경하면 이 형식의 모든 첫 번째 기회 및 두 번째 예외가 처리된 것으로 간주되며 이 구성은 모든 예외 처리 루틴을 무시합니다.

이벤트 코드 의미 기본 중단 상태

asrt

어설션 실패

중단

av

액세스 위반

중단

Dm

데이터가 잘못 정렬됨

중단

Dz

정수 나누기 0

중단

c000008e

부동 소수점 나누기 0

중단

C++ EH 예외

두 번째 기회 휴식

Gp

가드 페이지 위반

중단

Ii

잘못된 명령

두 번째 기회 휴식

Iov

정수 오버플로

중단

Ip

페이지 내 I/O 오류

중단

Isc

잘못된 시스템 호출

중단

lsq

잘못된 잠금 시퀀스

중단

sbo

스택 버퍼 오버플로

중단

Sov

Stack Overflow

중단

wkd

절전 모드 해제 디버거

중단

Aph

애플리케이션 중단

이 예외는 Windows 운영 체제에서 프로세스가 응답을 중지했다고 결론지으면 트리거됩니다(즉, 중단됨).

중단

3c

자식 애플리케이션 종료

두 번째 기회 휴식

chhc

잘못된 핸들

중단

Number

번호가 매겨진 예외

두 번째 기회 휴식

참고ah(어설션 처리) 명령을 사용하여 특정 주소에 대한 asrt 중단 상태 재정의할 수 있습니다. chhc 이벤트 코드는 동일한 예외를 참조합니다. 중단 상태 제어하는 경우 sx* ch를 사용합니다. 처리 상태 제어하는 경우 sx* hc를 사용합니다.

중단 상태 변경하거나 다음 예외의 상태 처리할 수 있습니다. 기본 중단 상태 표시됩니다.

다음 예외의 기본 처리 상태 항상 "처리됨"입니다. 이러한 예외는 디버거와 통신하는 데 사용되므로 일반적으로 해당 상태 "처리되지 않음"으로 변경해서는 안 됩니다. 이 상태 디버거가 예외를 무시하는 경우 다른 예외 처리기가 예외를 catch하도록 합니다.

애플리케이션은 DBG_COMMAND_EXCEPTION(dbce)을 사용하여 디버거와 통신할 수 있습니다. 이 예외는 중단점과 유사하지만 이 예외가 발생할 때 SX* 명령을 사용하여 특정 방식으로 반응할 수 있습니다.

이벤트 코드 의미 기본 중단 상태

dbce

특수 디버거 명령 예외

무시

vcpp

특수 Visual C++ 예외

무시

Wos

WOW64 단일 단계 예외

중단

wob

WOW64 중단점 예외-

중단

남남동
ssec

단일 단계 예외

중단

Bpe
bpec

중단점 예외

중단

cce
Cc

Ctrl+C 또는 Ctrl+BREAK

이 예외는 대상이 콘솔 애플리케이션이고 Ctrl+C 또는 Ctrl+BREAK가 전달되는 경우 트리거됩니다.

중단

참고 앞의 테이블의 마지막 세 가지 예외에는 두 개의 다른 이벤트 코드가 있습니다. 브레이크 상태 제어하는 경우 sse, bpecce를 사용합니다. 처리 상태 제어하는 경우 ssec, bpeccc를 사용합니다.

다음 예외는 관리 코드를 디버깅할 때 유용합니다.

이벤트 코드 의미 기본 상태

Clr

공용 언어 런타임 예외

두 번째 기회 휴식

처리되지 않음

clrn

공용 언어 런타임 알림 예외

두 번째 기회 휴식

처리됨

다음 이벤트의 중단 상태 변경할 수 있습니다. 이러한 이벤트는 예외가 아니므로 처리 상태 관련이 없습니다.

이벤트 코드 의미 기본 중단 상태

Ser

시스템 오류

무시

cpr[:Process]

프로세스 만들기

이 이벤트의 중단 상태 설정은 사용자 모드 디버깅에만 적용됩니다. 이 이벤트는 커널 모드에서 발생하지 않습니다.

-o명령줄 옵션 또는 .childdbg(자식 프로세스 디버그) 명령을 통해 CDB 또는 WinDbg에서 자식 프로세스의 디버 깅을 활성화한 경우에만 이 이벤트를 제어할 수 있습니다.

프로세스 이름에는 선택적 파일 이름 확장명과 별표() 또는 물음표(?)가 와일드카드 문자로 포함될 수 있습니다. 디버거는 가장 최근의 심폐소생술 설정만 기억합니다. 별도의 프로세스에 대한 별도의 설정은 지원되지 않습니다. 심폐소생술프로세스 사이에 콜론 또는 공백을 포함합니다.

프로세스를 생략하면 자식 프로세스 만들기에 설정이 적용됩니다.

무시

epr[:Process]

프로세스 종료

이 이벤트의 중단 상태 설정은 사용자 모드 디버깅에만 적용됩니다. 이 이벤트는 커널 모드에서 발생하지 않습니다.

-o명령줄 옵션 또는 .childdbg(자식 프로세스 디버그) 명령을 통해 CDB 또는 WinDbg에서 자식 프로세스의 디버 깅을 활성화한 경우에만 이 이벤트를 제어할 수 있습니다.

프로세스 이름에는 선택적 파일 이름 확장명과 별표() 또는 물음표(?)가 와일드카드 문자로 포함될 수 있습니다. 디버거는 가장 최근의 epr 설정만 기억합니다. 별도의 프로세스에 대한 별도의 설정은 지원되지 않습니다. eprProcess 사이에 콜론 또는 공백을 포함합니다.

프로세스를 생략하면 자식 프로세스 종료에 설정이 적용됩니다.

무시

ct

스레드 만들기

무시

et

스레드 종료

무시

ld[:Module]

모듈 로드

모듈을 지정하면 이 이름의 모듈이 로드될 때 중단이 발생합니다. 모듈은 모듈 의 이름 또는 주소를 지정할 수 있습니다. 이름을 사용하는 경우 모듈 에는 다양한 와일드카드 문자와 지정자가 포함될 수 있습니다. 구문에 대한 자세한 내용은 문자열 와일드카드 구문을 참조하세요.

디버거는 가장 최근의 ld 설정만 기억합니다. 별도의 모듈에 대한 별도의 설정은 지원되지 않습니다. 콜론 또는 ldModule 사이의 공백을 포함합니다.

모듈을 생략하면 모듈이 로드될 때 이벤트가 트리거됩니다.

출력

ud[:Module]

모듈 언로드

모듈을 지정하면 이 이름을 가진 모듈 또는 이 기본 주소의 모듈이 언로드될 때 중단이 발생합니다. 모듈은 모듈 의 이름 또는 주소를 지정할 수 있습니다. 이름을 사용하는 경우 모듈 은 정확한 이름이거나 와일드카드 문자를 포함할 수 있습니다. 모듈이 정확한 이름인 경우 현재 디버거 모듈 목록을 사용하여 기본 주소로 즉시 확인되고 주소로 저장됩니다. 모듈에 와일드카드 문자가 포함된 경우 언로드 이벤트가 발생할 때 나중에 일치하기 위해 패턴 문자열이 유지됩니다.

디버거에는 언로드 이벤트에 대한 이름 정보가 없으며 기본 주소만 일치합니다. 따라서 모듈 에 와일드카드 문자가 포함된 경우 디버거는 이 특정 언로드 사례에서 이름 일치를 수행할 수 없으며 모듈이 언로드될 때 중단됩니다.

디버거는 가장 최근의 ud 설정만 기억합니다. 별도의 모듈에 대한 별도의 설정은 지원되지 않습니다. 콜론 또는 ud모듈 사이에 공백을 포함합니다.

모듈을 생략하면 모듈이 로드될 때 이벤트가 트리거됩니다.

출력

out[:Output]

대상 애플리케이션 출력

출력을 지정하면 지정된 패턴과 일치하는 출력이 수신될 때만 중단이 발생합니다. 출력 에는 다양한 와일드카드 문자와 지정자가 포함될 수 있습니다. 구문에 대한 자세한 내용은 문자열 와일드카드 구문을 참조하세요. 그러나 출력 에는 콜론이나 공백이 포함될 수 없습니다. 일치 여부는 대/소문자를 구분하지 않습니다. out과 Output 사이에 콜론 또는 공백 포함합니다.

무시

Ibp

초기 중단점

(이 이벤트는 디버그 세션의 시작과 대상 컴퓨터를 다시 시작한 후에 발생합니다.)

사용자 모드에서: 휴식. -g명령줄 옵션을 사용하여 이 상태 "무시"로 변경할 수 있습니다.

커널 모드에서: 무시. 다양한 방법으로 이 상태 "사용"으로 변경할 수 있습니다. 이 상태 변경하는 방법에 대한 자세한 내용은 대상 컴퓨터 충돌 및 다시 부팅을 참조하세요.

Iml

초기 모듈 로드

(커널 모드에만 해당)

무시. 이 상태 다양한 방법으로 "중단"으로 변경할 수 있습니다. 이 상태 변경하는 방법에 대한 자세한 내용은 대상 컴퓨터 충돌 및 다시 부팅을 참조하세요.