버그 검사 0x3B: SYSTEM_SERVICE_EXCEPTION
SYSTEM_SERVICE_EXCEPTION 버그 검사의 값은 0x0000003B. 이는 권한이 없는 코드에서 권한 있는 코드로 전환하는 루틴을 실행하는 동안 예외가 발생했음을 나타냅니다.
Important
이 문서는 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 파란색 화면 오류 코드를 받은 고객인 경우 파란색 화면 오류 문제 해결을 참조하세요.
SYSTEM_SERVICE_EXCEPTION 매개 변수
매개 변수 | 설명 |
---|---|
1 | 버그 검사를 발생시킨 예외입니다. |
2 | 버그 검사를 발생시킨 명령의 주소입니다. |
3 | 버그 검사를 발생시킨 예외에 대한 컨텍스트 레코드의 주소입니다. |
4 | 0(사용되지 않음) |
원인
이 중지 코드는 실행 코드에 예외가 있고 그 아래에 있던 스레드가 시스템 스레드임을 나타냅니다.
NULL 포인터 역참조 또는 임의 잘못된 주소에 액세스했기 때문에 발생할 수 있습니다. 이는 메모리가 조기에 해제되거나 데이터 구조가 손상되어 발생할 수 있습니다.
매개 변수 1에서 반환되는 예외 정보는 NTSTATUS 값에 설명되어 있습니다. 예외 코드는 Windows 드라이버 키트에서 제공하는 헤더 파일인 ntstatus.h에 정의됩니다. (자세한 내용은 를 참조하세요 .Windows 드라이버 키트의 헤더 파일).
일반적인 예외 코드는 다음과 같습니다.
0x80000003: STATUS_BREAKPOINT
시스템에 커널 디버거가 연결되지 않은 경우 중단점 또는 ASSERT가 발견되었습니다.
0xC0000005: STATUS_ACCESS_VIOLATION
메모리 액세스 위반이 발생했습니다.
해결
특정 원인을 확인하고 코드 수정을 만들려면 오류 모듈의 소스 코드에 대한 프로그래밍 환경 및 액세스가 필요합니다.
이 문제를 디버그하려면 매개 변수 3과 함께 .cxr(표시 컨텍스트 레코드) 명령을 사용한 다음 kb(스택 백트레이스 표시)를 사용합니다. 이 중지 코드 앞에 오는 코드에서 중단점을 설정하고 오류 코드로 한 단계 앞으로 나아갈 수도 있습니다. u, ub, uu(unassemble) 명령을 사용하여 어셈블리 프로그램 코드를 확인합니다.
!analyze 디버거 확장은 버그 검사에 대한 정보를 표시하며 근본 원인을 확인하는 데 도움이 될 수 있습니다. 다음 예제는 !analyze의 출력입니다.
SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: fffff802328375b0, Address of the instruction which caused the bugcheck
Arg3: ffff9c0a746c2330, Address of the context record for the exception that caused the bugcheck
Arg4: 0000000000000000, zero.
...
WinDbg 및 !analyze에 대한 자세한 내용은 다음 항목을 참조하세요.
Windows 메모리 사용에 대한 자세한 내용은 Pavel Yosifovich, Mark E. Russinovich, David A. Solomon 및 Alex Ionescu의 Windows Internals 7 Edition Part 1을 참조하세요.
드라이버 식별
오류를 담당하는 드라이버를 식별할 수 있는 경우 해당 이름은 파란색 화면에 인쇄되고 위치(PUNICODE_STRING) KiBugCheckDriver의 메모리에 저장됩니다. 디버거 명령인 dx(디버거 개체 모델 식 표시)를 사용하여 다음dx KiBugCheckDriver
을 표시할 수 있습니다.
kd> dx KiBugCheckDriver
KiBugCheckDriver : 0xffffe10b9991e3e8 : "nvlddmkm.sys" [Type: _UNICODE_STRING *]
!error 확장을 사용하여 매개 변수 1에서 예외 코드에 대한 정보를 표시합니다. 다음은 !error의 출력 예제입니다.
2: kd> !error 00000000c0000005
Error code: (NTSTATUS) 0xc0000005 (3221225477) - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.
WinDbg의 STACK TEXT 출력에서 오류가 발생했을 때 실행 중인 작업에 대한 단서를 확인합니다. 여러 덤프 파일을 사용할 수 있는 경우 해당 정보를 비교하여 스택에 있는 공통 코드를 찾습니다. kb(디스플레이 스택 백트레이스)와 같은 디버거 명령을 사용하여 오류 코드를 조사합니다.
다음 명령을 사용하여 메모리 에 로드된 모듈을 나열합니다. lm t n
!memusage를 사용하여 시스템 메모리의 일반 상태를 검사합니다. !pte 및 !pool 명령을 사용하여 특정 메모리 영역을 검사할 수도 있습니다.
과거에 이 오류는 사용자 모드 그래픽 드라이버가 커널 코드로 잘못된 데이터를 전달하여 발생할 수 있는 페이징된 풀의 과도한 사용과 관련이 있습니다. 이 경우 드라이버 검증 도구의 풀 옵션을 사용하여 추가 정보를 수집합니다.
드라이버 검증 도구
드라이버 검증 도구는 드라이버의 동작을 검사하기 위해 실시간으로 실행되는 도구입니다. 예를 들어 드라이버 검증 도구는 메모리 풀과 같은 메모리 리소스의 사용을 확인합니다. 드라이버 코드 실행에서 오류를 식별하는 경우 드라이버 코드의 해당 부분을 더 자세히 조사할 수 있도록 예외를 사전에 만듭니다. 드라이버 검증 도구 관리자는 Windows에 기본 제공되며 모든 Windows PC에서 사용할 수 있습니다.
드라이버 검증 도구 관리자를 시작하려면 명령 프롬프트에 검증 도구를 입력합니다. 확인할 드라이버를 구성할 수 있습니다. 드라이버를 확인하는 코드는 실행할 때 오버헤드를 추가하므로 가능한 가장 적은 수의 드라이버를 확인합니다. 자세한 내용은 드라이버 검증 도구를 참조하세요.
설명
Windows 버그 검사 코드의 일반적인 문제 해결은 다음 제안을 따르세요.
최근에 새 디바이스 드라이버 또는 시스템 서비스가 추가된 경우 제거하거나 업데이트해 보세요. 시스템에서 새 버그 확인 코드가 표시되도록 변경된 내용을 확인합니다.
장치 관리자 확인하여 문제를 나타내는 느낌표(!)로 표시된 디바이스가 있는지 확인합니다. 오류 디바이스 드라이버에 대한 속성에 표시되는 이벤트 로그를 검토합니다. 관련 드라이버를 업데이트해 보세요.
시스템 로그인 이벤트 뷰어 오류를 유발하는 디바이스 또는 드라이버를 정확히 파악하는 데 도움이 될 수 있는 추가 오류 메시지를 확인합니다. 블루 스크린과 같은 시간 범위에서 발생한 시스템 로그에서 치명적인 오류를 찾습니다.
최근에 시스템에 하드웨어를 추가했다면 제거하거나 교체해 보세요. 또는 사용 가능한 패치가 있는지 제조업체에 문의합니다.
일반적인 추가 문제 해결 정보는 버그 검사 블루 스크린 데이터 분석을 참조 하세요.