다음을 통해 공유


버그 검사 0x50: PAGE_FAULT_IN_NONPAGED_AREA

PAGE_FAULT_IN_NONPAGED_AREA 버그 검사의 값은 0x00000050. 이는 잘못된 시스템 메모리가 참조되었음을 나타냅니다. 일반적으로 메모리 주소가 잘못되거나 메모리 주소가 해제된 메모리를 가리키고 있습니다.

Important

이 문서는 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 파란색 화면 오류 코드를 받은 고객인 경우 파란색 화면 오류 문제 해결을 참조하세요.

PAGE_FAULT_IN_NONPAGED_AREA 매개 변수

매개 변수 설명

1

참조된 메모리 주소

2

Windows 1507(TH1) 버전 이후 - x64

0: 읽기 작업

2: 쓰기 작업

10: 작업 실행

Windows 1507(TH1) 버전 이후 - x86

0: 읽기 작업

2: 쓰기 작업

10: 작업 실행

Windows 1507(TH1) 버전 이후 - Arm

0: 읽기 작업

1: 쓰기 작업

8: 실행 작업

Windows 1507(TH1) 버전 x64/x86 이전

0: 읽기 작업

1: 쓰기 작업

3

메모리를 참조하는 주소(알려진 경우)

4

페이지 오류 유형

0x0 - NONPAGED_BUGCHECK_FREED_PTE - 참조되는 주소가 무료로 표시된 페이지 테이블 항목에 있습니다.

0x2 - NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE 참조된 주소에 유효한 활성 페이지 테이블 항목이 없습니다.

0x03 - NONPAGED_BUGCHECK_WRONG_SESSION - 세션이 없는 프로세스의 컨텍스트에서 세션 공간 주소에 대한 참조를 시도했습니다. 일반적으로 이는 호출자가 올바른 프로세스에 대한 개체 참조를 올바르게 가져오고 먼저 연결하지 않고 세션 주소에 액세스하려고 잘못 시도한다는 것을 의미합니다. 이 버그 검사 및 하위 유형은 Windows 10 RS3에서 마지막으로 사용되었습니다. Windows 10 RS4 이상에서는 이 오류가 대신 0x02(NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE)로 표시됩니다.

0x04 - NONPAGED_BUGCHECK_VA_NOT_CANONICAL - 정식이 아닌(잘못된) 가상 주소(매개 변수 1)에 대한 참조를 시도했습니다. 호출자가 이 주소에 액세스하려고 하면 안 됩니다.

0xF - NONPAGED_BUGCHECK_USER_VA_ACCESS_INCONSISTENT - 커널 모드 코드는 이러한 액세스가 허용되지 않을 때 사용자 모드 가상 주소에 액세스하려고 했습니다.

오류를 담당하는 드라이버를 식별할 수 있는 경우 해당 이름은 파란색 화면에 인쇄되고 위치(PUNICODE_STRING) KiBugCheckDriver의 메모리에 저장됩니다. 디버거 dx 명령을 사용하여 다음 dx KiBugCheckDriver을 표시할 수 있습니다.

원인

버그 검사 0x50 오류 시스템 서비스 또는 잘못된 드라이버 코드 설치로 인해 발생할 수 있습니다. 바이러스 백신 소프트웨어는 손상된 NTFS 볼륨과 마찬가지로 이 오류를 트리거할 수도 있습니다.

또한 결함이 있는 하드웨어를 설치한 후 또는 설치된 하드웨어가 실패하는 경우에도 발생할 수 있습니다(일반적으로 주요 메모리, L2 RAM 캐시 또는 비디오 RAM과 같은 결함이 있는 RAM과 관련됨).

설명

이벤트 로그: 오류의 원인이 되는 디바이스 또는 드라이버를 정확히 파악하는 데 도움이 될 수 있는 추가 오류 메시지가 있는지 이벤트 뷰어 시스템 로그를 확인합니다. 자세한 내용은 이벤트 뷰어 열기를 참조하세요. 블루 스크린과 같은 시간 범위에서 발생한 시스템 로그에서 치명적인 오류를 찾습니다.

잘못된 드라이버 해결: 파란색 화면에 나열되었거나 이벤트 로그에 있는 경우 드라이버의 이름을 검사합니다. 업데이트된 드라이버를 사용할 수 있는지 확인하려면 드라이버 공급업체에 문의하세요.

잘못된 시스템 서비스 문제 해결: 서비스를 사용하지 않도록 설정하고 오류가 해결되었는지 확인합니다. 그렇다면 가능한 업데이트에 대해 시스템 서비스 제조업체에 문의하세요. 시스템 시작 중에 오류가 발생하면 Windows 복구 옵션을 조사합니다. 자세한 내용은 Windows 10의 복구 옵션을 참조 하세요.

바이러스 백신 소프트웨어 문제 해결: 프로그램을 사용하지 않도록 설정하고 오류가 해결되었는지 확인합니다. 이 경우 가능한 업데이트에 대해 프로그램 제조업체에 문의하세요.

손상된 NTFS 볼륨 문제 해결: Chkdsk /f /r을 실행하여 디스크 오류를 검색하고 복구합니다. 시스템 파티션에서 디스크 검사를 시작하기 전에 시스템을 다시 시작해야 합니다. 하드 드라이브 하위 시스템에 대해 제공하는 진단 도구를 찾으려면 하드 드라이버 시스템의 제조업체에 문의하세요.

Windows 메모리 진단: Windows 메모리 진단 도구를 실행하여 실제 메모리를 테스트합니다. 시작 단추를 선택한 다음 제어판 선택합니다. 검색 상자에 메모리를 입력한 다음 컴퓨터의 메모리 문제 진단을 선택합니다. 테스트를 실행한 후 이벤트 뷰어를 사용하여 시스템 로그 아래의 결과를 봅니다. 결과를 보려면 MemoryDiagnostics-Results 항목을 찾습니다.

오류 하드웨어 문제 해결: 하드웨어가 최근에 시스템에 추가된 경우 제거하여 오류가 다시 발생하는지 확인합니다. 기존 하드웨어가 실패한 경우 결함이 있는 구성 요소를 제거하거나 교체합니다. 시스템 제조업체에서 제공하는 하드웨어 진단을 실행해야 합니다. 이러한 절차에 대한 자세한 내용은 컴퓨터에 대한 소유자 설명서를 참조하세요.

일반적인 파란색 화면 문제 해결 정보는 버그 검사 블루 스크린 데이터 분석 및 중지 오류 또는 파란색 화면 오류 문제에 대한 고급 문제 해결을 참조하세요.

해결

특정 원인을 확인하고 코드 수정을 만들려면 오류 모듈의 소스 코드에 대한 프로그래밍 환경 및 액세스가 필요합니다.

일반적으로 참조된 주소는 해제된 메모리에 있거나 단순히 유효하지 않습니다. 처리기를 제외하고 try로 보호할 수 없으며 프로브 또는 유사한 프로그래밍 기술로만 보호할 수 있습니다. 파일 시스템 드라이버의 버퍼 처리 및 프로브에 대한 자세한 내용은 버퍼 처리를 참조 하세요. 드라이버 개발 모범 사례 및 드라이버 개발자의 일반적인 실수에 대한 자세한 내용은 Surface Team Driver Development 모범 사례를 참조 하세요.

-v 자세한 정보 표시 옵션과 함께 !analyze 디버그 확장을 사용하여 버그 검사에 대한 정보를 표시하여 근본 원인을 파악합니다.

2: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced.  This cannot be protected by try-except.
Typically the address is just plain bad or it is pointing at freed memory.
Arguments:
Arg1: ffffffff00000090, memory referenced.
Arg2: 0000000000000000, value 0 = read operation, 1 = write operation.
Arg3: fffff80240d322f9, If non-zero, the instruction address which referenced the bad memory
	address.
Arg4: 000000000000000c, (reserved)

이 예제에서 매개 변수 2는 메모리 영역을 읽을 때 버그 검사가 발생했음을 나타냅니다.

!analyze 출력을 모두 확인하여 버그 확인이 발생했을 때 발생한 일에 대한 정보를 얻습니다. MODULE_NAME 검사: 및 FAULTING_MODULE: 잘못된 시스템 메모리를 참조하는 데 어떤 코드가 관련되어 있는지 확인합니다.

오류가 발생했을 때 실행된 내용에 대한 단서는 STACK TEXT를 참조하세요. 여러 덤프 파일을 사용할 수 있는 경우 정보를 비교하여 스택에 있는 공통 코드를 찾습니다.

!analyze 출력에 제공된 .trap 명령을 사용하여 컨텍스트를 설정합니다.

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

kb(디스플레이 스택 백트레이스)와 같은 디버거 명령을 사용하여 오류 코드를 조사합니다.

메모리에 lm t n 로드된 모듈을 나열하는 데 사용합니다.

d, da, db, dc, dd, dD, df, dp, dq, du, dw(메모리 표시) 명령을 사용하여 매개 변수 1 및 매개 변수 3에서 참조하는 메모리 영역을 조사합니다.

2: kd> db ffffffff00000090
ffffffff`00000090  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000a0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000b0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000c0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000d0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000e0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000f0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`00000100  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

이 경우 읽기를 시도한 메모리 영역인 매개 변수 1의 이 메모리 영역에 데이터가 있는 것처럼 보이지 않습니다.

!address 명령을 사용하여 잘못된 메모리를 참조한 명령의 주소인 매개 변수 3을 확인합니다.

2: kd> !address fffff80240d322f9
Usage:                  Module
Base Address:           fffff802`40ca8000
End Address:            fffff802`415fb000
Region Size:            00000000`00953000
VA Type:                BootLoaded
Module name:            ntoskrnl.exe
Module path:            [\SystemRoot\system32\ntoskrnl.exe]

매개 변수 3과 함께 u, ub, uu(Unassemble)Dissasemble을 사용하여 잘못된 메모리를 참조한 것을 검사합니다. X64 프로세서 및 어셈블리 언어에 대한 자세한 내용은 x64 프로세서를 참조 하세요.

2: kd> u fffff80240d322f9 
nt!RtlSubtreePredecessor+0x9:
fffff802`40d322f9 488b4810        mov     rcx,qword ptr [rax+10h]
fffff802`40d322fd eb07            jmp     nt!RtlSubtreePredecessor+0x16 (fffff802`40d32306)
fffff802`40d322ff 488bc1          mov     rax,rcx
fffff802`40d32302 488b4910        mov     rcx,qword ptr [rcx+10h]
fffff802`40d32306 4885c9          test    rcx,rcx
fffff802`40d32309 75f4            jne     nt!RtlSubtreePredecessor+0xf (fffff802`40d322ff)
fffff802`40d3230b c3              ret
fffff802`40d3230c c3              ret

지정된 주소에서 뒤로 디스어셈블하는 데 사용합니다 ub .

r(Registers) 명령을 사용하여 시스템 버그를 검사할 때 실행 중인 내용을 검사합니다.

2: kd> r
Last set context:
rax=ffffffff00000080 rbx=0000000000000000 rcx=ffffa68337cb7028
rdx=7a107838c48dfc00 rsi=0000000000000000 rdi=0000000000000000
rip=fffff80240d322f9 rsp=ffff840c96510958 rbp=ffffffffffffffff
 r8=ffffffffffffffff  r9=0000000000000000 r10=7ffffffffffffffc
r11=ffff840c96510a10 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei ng nz na pe nc
cs=0010  ss=0018  ds=0000  es=0000  fs=0000  gs=0000             efl=00010282
nt!RtlSubtreePredecessor+0x9:
fffff802`40d322f9 488b4810        mov     rcx,qword ptr [rax+10h] ds:ffffffff`00000090=????????????????

이 경우 fffff80240d322f9 명령 포인터 레지스터에 있는 rip입니다.

!pte!pool 명령을 사용하여 메모리를 검사할 수도 있습니다.

시스템 메모리의 일반 상태를 사용하고 !memusage 검사합니다.

Windows 메모리 사용에 대한 자세한 내용은 Pavel Yosifovich, Mark E. Russinovich, David A. Solomon 및 Alex Ionescu의 Windows Internals 7 Edition Part 1을 참조하세요.

드라이버 검증 도구

드라이버 검증 도구는 드라이버의 동작을 검사하기 위해 실시간으로 실행되는 도구입니다. 예를 들어 드라이버 검증 도구는 메모리 풀과 같은 메모리 리소스의 사용을 확인합니다. 드라이버 코드 실행에 오류가 표시되면 드라이버 코드의 해당 부분을 추가로 조사할 수 있도록 예외를 사전에 만듭니다. 드라이버 검증 도구 관리자는 Windows에 기본 제공되며 모든 Windows PC에서 사용할 수 있습니다. 드라이버 검증 도구를 사용하여 오류의 특정 원인을 추적합니다.

드라이버 검증 도구 관리자를 시작하려면 명령 프롬프트에 검증 도구를 입력합니다. 확인하려는 드라이버를 구성할 수 있습니다. 드라이버를 확인하는 코드는 실행할 때 오버헤드를 추가하므로 가능한 한 적은 수의 드라이버를 시도하고 확인합니다. 결함이 있는 드라이버를 식별한 경우 선택합니다. 자세한 내용은 드라이버 검증 도구를 참조하세요.

참고 항목

오류 검사 코드 참조