다음을 통해 공유


예외 및 이벤트 제어

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

이러한 다양한 예외 처리기의 우선 순위에 대한 자세한 내용은 종료 후 디버깅 활성화를 참조하세요.

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

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

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

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

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

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

Kernel-Mode 예외

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

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

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

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

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

  • 이 이벤트는 발생하는 즉시 디버거에 침입할 수 있습니다("첫 번째 기회").

  • 다른 오류 처리기에 응답할 수 있는 기회가 제공된 후 이벤트가 중단됩니다("두 번째 기회").

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

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

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

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

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

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

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

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

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

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

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

중단 상태 제어

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

Command 상태 이름 Description

SXE 또는 -xe

휴식 시간

(활성화됨)

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

SXD 또는 -xd

두 번째 기회 재시도

(사용 안 함)

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

SXN 또는 -xn

출력

(알림)

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

SXI 또는 -xi

무시하다

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

SX* 설정에서 예외가 예상되지 않는 경우 대상 애플리케이션은 두 번째 기회에 디버거에 침입합니다. 이벤트의 기본 상태는 이 항목의 다음 "이벤트 정의 및 기본값" 섹션에 나열됩니다.

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

처리 상태 제어

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

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

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

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

cc, hc, bpecssec 이벤트에서 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

자식 애플리케이션 종료하기

두 번째 기회 제공

채널
hc

잘못된 핸들

휴식

숫자

번호가 매겨진 예외

두 번째 기회의 재도전

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

다음 예외의 중단 상태 또는 처리 상태를 변경할 수 있습니다. 기본 중단 상태가 표시됩니다.

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

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

이벤트 코드 Meaning 기본 중단 상태

dbce

특수 디버거 명령 예외

무시

vcpp

특수 Visual C++ 예외

무시

wos

WOW64 단일 단계 예외

휴식

wob

WOW64 중단점 예외-

휴식

SSE
ssec

단일 단계 예외

휴식

bpe
bpec

중단점 예외

휴식

cce
cc

Ctrl+C 또는 Ctrl+BREAK

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

휴식

메모 앞의 테이블의 마지막 세 가지 예외에는 두 가지 이벤트 코드가 있습니다. 중단 상태를 제어하는 경우 sse, bpecce를 사용합니다. 처리 상태를 제어하는 경우 ssec, bpeccc를 사용합니다.

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

이벤트 코드 Meaning 기본 상태

clr

공용 언어 런타임 예외

두 번째 기회의 재도전

처리되지 않음

clrn

공용 언어 런타임 알림 예외

두 번째 기회의 재도전

Handled

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

이벤트 코드 Meaning 기본 중단 상태

ser

시스템 오류

무시

cpr[:프로세스]

프로세스 만들기

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

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

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

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

무시

epr[:프로세스]

프로세스 종료

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

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

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

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

무시

코네티컷

스레드 만들기

무시

동부 표준시

스레드 종료

무시

ld[:모듈]

모듈 로드

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

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

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

출력

ud[:모듈]

모듈 언로드

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

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

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

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

출력

out[:Output]

대상 애플리케이션 출력

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

무시

ibp

초기 중단점

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

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

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

iml

초기 모듈 로드

(커널 모드에만 해당)

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