Поделиться через


Проверка ошибок 0x50: PAGE_FAULT_IN_NONPAGED_AREA

Проверка ошибки PAGE_FAULT_IN_NONPAGED_AREA имеет значение 0x00000050. Это означает, что указана недопустимая системная память. Как правило, адрес памяти неправильный или адрес памяти указывает на освобожденную память.

Внимание

Эта статья предназначена для программистов. Если вы являетесь клиентом, который получил код ошибки синего экрана при использовании компьютера, см. статью "Устранение неполадок синим экраном".

Параметры 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 KiBugCheckDriverможно использовать команду отладчика dx.

Причина

Проверка ошибок 0x50 может быть вызвана установкой неисправной системной службы или кода драйвера. Антивирусное программное обеспечение также может активировать эту ошибку, так как может поврежденный том NTFS.

Это также может произойти после установки неисправного оборудования или в случае сбоя установленного оборудования (обычно связанного с дефектной ОЗУ, будь то основная память, кэш ОЗУ L2 или видео ОЗУ).

Замечания

Журнал событий. Проверьте системный журнал в Просмотр событий для получения дополнительных сообщений об ошибках, которые могут помочь определить устройство или драйвер, вызывающий ошибку. Дополнительные сведения см. в разделе "Открыть Просмотр событий". Ищите критические ошибки в системном журнале, которые появились примерно в то же время, что и "синий экран".

Разрешение неисправного драйвера: проверьте имя драйвера, если он был указан на синем экране или присутствует в журнале событий. Обратитесь к поставщику драйверов, чтобы узнать, доступен ли обновленный драйвер.

Устранение проблемы с неисправной системой: отключите службу и убедитесь, что эта ошибка устранена. В этом случае обратитесь к изготовителю системной службы о возможном обновлении. Если ошибка возникает во время запуска системы, изучите параметры восстановления Windows. Дополнительные сведения см. в разделе "Параметры восстановления" в Windows 10.

Устранение проблемы антивирусного программного обеспечения: отключите программу и убедитесь, что это устраняет ошибку. Если это так, обратитесь к производителю программы о возможном обновлении.

Устранение проблемы с поврежденным томом NTFS: запустите Chkdsk /f /r для обнаружения и восстановления ошибок диска. Перед началом сканирования диска необходимо перезапустить систему в системном разделе. Обратитесь к производству системы жесткого драйвера, чтобы найти все средства диагностики, которые они предоставляют для подсистемы жесткого диска.

Диагностика памяти Windows: запустите средство диагностики памяти Windows, чтобы проверить физическую память. Нажмите кнопку "Пуск" и выберите панель управления. В поле поиска введите память и выберите " Диагностика проблем с памятью компьютера". После выполнения теста используйте средство просмотра событий для просмотра результатов в системном журнале. Найдите запись MemoryDiagnostics-Results, чтобы просмотреть результаты.

Устранение проблемы с неисправным оборудованием: если оборудование было добавлено в систему недавно, удалите его, чтобы узнать, возникает ли ошибка. Если существующее оборудование завершилось сбоем, удалите или замените неисправный компонент. Необходимо запустить аппаратные диагностика, предоставляемые производителем системы. Дополнительные сведения об этих процедурах см. в руководстве владельца компьютера.

Общие сведения об устранении неполадок с синим экраном см. в разделе "Анализ данных синим экраном" и "Дополнительные сведения об устранении неполадок" для ошибки остановки или ошибки синим экраном.

Разрешение

Чтобы определить конкретную причину и создать исправление кода, интерфейс программирования и доступ к исходному коду модуля сбоя, требуется.

Как правило, указанный адрес находится в свободной памяти или просто недопустим. Это не может быть защищено попыткой , кроме обработчика- она может быть защищена только пробой или аналогичными методами программирования. Сведения об обработке буферов и пробах в драйверах файловой системы см. в разделе "Обработка буферов". Сведения о рекомендациях по разработке драйверов и распространенных ошибках, сделанных разработчиками драйверов, см. в рекомендациях по разработке драйверов Surface Team Driver.

Используйте расширение отладки !analyze с параметром детализации -v, чтобы отобразить сведения о проверке ошибок, чтобы определить первопричину.

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 указывает, что при чтении области памяти произошла ошибка.

Просмотрите все выходные данные !анализа, чтобы получить сведения о том, что происходит при проверке ошибок. Изучите MODULE_NAME: и FAULTING_MODULE: чтобы узнать, какой код участвует в ссылке на недопустимую системную память.

Ознакомьтесь с текстом STACK, чтобы узнать, что выполнялось при сбое. Если доступны несколько файлов дампа, сравните сведения, чтобы найти общий код, который находится в стеке.

Используйте команду .trap, указанную в выходных данных !analyze, чтобы задать контекст.

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

Используйте команды отладчика, такие как использование базы знаний (Display Stack Backtrace) для исследования кода сбоя.

lm t n Используйте список модулей, загруженных в память.

Используйте команду d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory) для изучения областей памяти, на которые ссылается параметр 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]

Используйте u, ub, uu (Unassemble)Dissasemble с параметром 3, чтобы проверить, на который ссылается плохая память. Дополнительные сведения о процессоре 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.

!pool Для !pte проверки памяти также можно использовать команду.

Используйте !memusage и проверьте общее состояние системной памяти.

Дополнительные сведения об использовании памяти Windows см. в статье Windows Internals 7th Edition Part 1 by Павел Yosifovich, Марк Э. Руссинович, Дэвид А. Соломон и Алекс Ионеску.

Средство проверки драйверов

Средство проверки драйверов — это средство, которое выполняется в режиме реального времени для проверки поведения драйверов. Например, средство проверки драйверов проверяет использование ресурсов памяти, таких как пулы памяти. Если он видит ошибки в выполнении кода драйвера, он заранее создает исключение, чтобы позволить, чтобы часть кода драйвера была более тщательно изучена. Диспетчер проверки драйверов встроен в Windows и доступен на всех компьютерах с Windows. Используйте средство проверки драйверов для отслеживания конкретной причины сбоя.

Чтобы запустить диспетчер проверки драйверов, введите средство проверки в командной строке. Вы можете настроить драйверы, которые вы хотите проверить. Код, проверяющий драйверы, добавляет затраты по мере выполнения, поэтому попробуйте проверить наименьшее количество драйверов. Если был определен драйвер сбоя, выберите его. Дополнительные сведения см. в разделе "Проверка драйверов".

См. также

Bug Check Code Reference (Справочник с кодами критических ошибок)