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


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.

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

Комментарии

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

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

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

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

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

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

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

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

Решение

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

Как правило, указанный адрес находится в свободной памяти или просто недопустим. Это не может быть защищено с помощью try, кроме обработчика. Это может быть защищено только пробой или аналогичными методами программирования. Сведения об обработке буфера и пробах в драйверах файловой системы см. в разделе Обработка буфера. Сведения о рекомендациях по разработке драйверов и распространенных ошибках, допущенных разработчиками драйверов, см. в статье Рекомендации по разработке драйверов для группы разработчиков surface.

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

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

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

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

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

Используйте команды отладчика, такие как kb (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.

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

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

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

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

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

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

См. также раздел

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