Compartilhar via


Verificação de bugs 0x50: PAGE_FAULT_IN_NONPAGED_AREA

A verificação de bugs PAGE_FAULT_IN_NONPAGED_AREA tem um valor de 0x00000050. Isso indica que foi feita referência a uma memória de sistema inválida. Normalmente, o endereço da memória está errado ou está apontando para uma memória liberada.

Importante

Este artigo é para programadores. Se você for um cliente que recebeu um código de erro de tela azul enquanto estava usando o computador, confira Solucionar problemas de erros de tela azul.

PAGE_FAULT_IN_NONPAGED_AREA Parâmetros

Parâmetro Descrição

1

Endereço de memória referenciado

2

Após a versão do Windows 1507 (TH1) - x64

0: operação de leitura

2: operação de gravação

10: execução da operação

Após a versão do Windows 1507 (TH1) - x86

0: operação de leitura

2: operação de gravação

10: execução da operação

Após a versão do Windows 1507 (TH1) - Arm

0: operação de leitura

1: operação de gravação

8: execução da operação

Antes do Windows 1507 (TH1) Versão x64 / x86

0: operação de leitura

1: operação de gravação

3

Endereço da memória referenciada (se conhecido)

4

Tipo de falha de página

0x0 - NONPAGED_BUGCHECK_FREED_PTE - O endereço referenciado está em uma entrada de tabela de páginas marcada como livre.

0x2 - NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE O endereço referenciado não tem uma entrada válida na tabela de páginas ativas.

0x03 - NONPAGED_BUGCHECK_WRONG_SESSION - Uma tentativa de referência a um endereço de espaço de sessão foi feita no contexto de um processo que não tem sessão. Normalmente, isso significa que o chamador está tentando acessar indevidamente um endereço de sessão sem obter corretamente uma referência de objeto para o processo correto e sem se associar a ele primeiro. Esse subtipo de verificação de bug & foi usada pela última vez no Windows 10 RS3. No Windows 10 RS4 e superior, esse erro é exibido como 0x02 (NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE).

0x04 - NONPAGED_BUGCHECK_VA_NOT_CANONICAL - Foi feita uma tentativa de referência a um endereço virtual não canônico (ilegal) (parâmetro 1). O chamador nunca deve tentar acessar esse endereço.

0xF - NONPAGED_BUGCHECK_USER_VA_ACCESS_INCONSISTENT - O código do modo kernel tentou acessar um endereço virtual do modo usuário quando esse acesso não era permitido.

Se o driver responsável pelo erro puder ser identificado, seu nome será impresso na tela azul e armazenado na memória no local (PUNICODE_STRING) KiBugCheckDriver. Você pode usar o comando depurador dx para exibir este comando: dx KiBugCheckDriver.

Causa

A verificação de bugs 0x50 pode ser causada pela instalação de um serviço de sistema defeituoso ou código de driver defeituoso. O software antivírus também pode acionar esse erro, assim como um volume NTFS corrompido.

Também pode ocorrer após a instalação de hardware defeituoso ou em caso de falha do hardware instalado (geralmente relacionada à RAM defeituosa, seja a memória principal, o cache de RAM L2 ou a RAM de vídeo).

Comentários

Log de evento: Verifique o log do sistema no visualizador de eventos para obter mensagens de erro adicionais que possam ajudar a identificar o dispositivo ou driver que está causando o erro. Para mais informações, consulte Abrir o Visualizador de Eventos.. Procure erros críticos no log do sistema que ocorreram na mesma janela de tempo que a tela azul.

Resolução de um driver defeituoso: examine o nome do driver se ele foi listado na tela azul ou se está presente no registro de eventos. Entre em contato com o fornecedor do driver para ver se há um driver atualizado disponível.

Resolução de um problema de serviço do sistema defeituoso: desabilite o serviço e confirme se isso resolve o erro. Em caso afirmativo, entre em contato com o fabricante do serviço do sistema sobre uma possível atualização. Se o erro ocorrer durante a inicialização do sistema, investigue as opções de reparo do Windows. Para obter mais informações, consulte Opções de recuperação no Windows 10.

Resolução de um problema de software antivírus: desabilite o programa e confirme se isso resolve o erro. Se isso acontecer, entre em contato com o fabricante do programa para obter uma possível atualização.

Resolução de um problema de volume NTFS corrompido: Execute Chkdsk /f /r para detectar e reparar erros de disco. É necessário reiniciar o sistema antes de iniciar a verificação de disco em uma partição do sistema. Entre em contato com o fabricante do sistema de driver de disco rígido para localizar as ferramentas de diagnóstico que ele fornece para o subsistema de disco rígido.

Diagnóstico de Memória do Windows: execute a ferramenta Diagnóstico de Memória do Windows para testar a memória física. Selecione o botão Iniciar e, em seguida, selecione o Painel de Controle. Na caixa de pesquisa do painel de controle, digite Memory e selecione Diagnosticar problemas de memória do seu computador. Depois que o teste for executado, use o visualizador de eventos para visualizar os resultados no log do sistema. Procure a entrada MemoryDiagnostics-Results para exibir os resultados.

Resolução de um problema de hardware defeituoso: se o hardware foi adicionado ao sistema recentemente, remova-o para ver se o erro se repete. Se o hardware existente tiver falhado, remova ou substitua o componente defeituoso. Você deve executar o diagnóstico de hardware fornecido pelo fabricante do sistema. Para obter detalhes sobre esses procedimentos, consulte o manual do proprietário do seu computador.

Para obter informações gerais sobre solução de problemas de tela azul, consulte Analisar dados de tela azul de verificação de bugs e Solução de problemas avançada para erro de parada ou problema de erro de tela azul..

Resolução

Para determinar a causa específica e criar uma correção de código, é necessário ter experiência em programação e acesso ao código-fonte do módulo com falha.

Normalmente, o endereço referenciado está na memória liberada ou é simplesmente inválido. Isso não pode ser protegido por um manipulador try - except -- só pode ser protegido por uma investigação ou por técnicas de programação semelhantes. Para obter informações sobre manipulação de buffer e investigações em drivers do sistema de arquivos, consulte Manipulação de buffer. Para obter informações sobre as melhores práticas para o desenvolvimento de drivers e erros comuns cometidos por desenvolvedores de drivers, consulte Práticas recomendadas de desenvolvimento de drivers do Surface Team.

Use a extensão de depuração !analyze com a opção -v verbose para exibir informações sobre a verificação de bugs para trabalhar para determinar a causa raiz.

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)

Neste exemplo, o parâmetro 2 indica que a verificação de bugs ocorreu quando uma área da memória estava sendo lida.

Observe toda a saída do !analyze para obter informações sobre o que estava acontecendo quando ocorreu a verificação de bugs. Examine MODULE_NAME: e FAULTING_MODULE: para ver qual código está envolvido na referência à memória inválida do sistema.

Observe o STACK TEXT para obter pistas sobre o que estava sendo executado quando ocorreu a falha. Se houver vários arquivos de despejo disponíveis, compare as informações para procurar códigos comuns que estejam na pilha.

Use o comando .trap fornecido na saída do !analyze para definir o contexto.

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

Use os comandos do depurador, como use kb (exibir backtrace da pilha) para investigar o código com falha.

Use o lm t n para listar os módulos que estão carregados na memória.

Use o comando d, da, db, dc, dd, dD, df, dp, dq, du, dw (Memória de exibição) para investigar as áreas de memória referenciadas pelo parâmetro 1 e pelo parâmetro 3.

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

Nesse caso, parece que não há dados nessa área da memória no parâmetro 1, que é a área da memória que estava tentando ser lida.

Use o comando !address para examinar o parâmetro 3, que é o endereço da instrução que fez referência à memória ruim.

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]

Use u, ub, uu (Unassemble)Dissasemble com o parâmetro 3, para examinar o que referenciou a memória ruim. Para obter mais informações sobre o processador X64 e a linguagem de assembly, consulte O processador 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

Use ub para desmontar de trás para frente a partir de um determinado endereço.

Use o comando r (Registros) para examinar o que estava sendo executado enquanto o bug do sistema era verificado.

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=????????????????

Neste caso fffff80240d322f9 está no registro do ponteiro de instrução, rip.

O comando !pte e o comando !pool também podem ser usados para examinar a memória.

Use !memusage e para examinar o estado geral da memória do sistema.

Para obter mais informações sobre o uso de memória do Windows, consulte Windows Internals 7ª edição - Parte 1 de Pavel Yosifovich, Mark E. Russinovich, David A. Solomon e Alex Ionescu.

Driver Verifier

O verificador de driver é uma ferramenta que é executada em tempo real para examinar o comportamento dos drivers. Por exemplo, o Verificador de Driver verifica o uso de recursos de memória, como pools de memória. Se ele vir erros na execução do código do driver, ele cria de forma proativa uma exceção para permitir que essa parte do código do driver seja examinada mais detalhadamente. O gerenciador do verificador de driver é incorporado no Windows e está disponível em todos os PCs com Windows. Use o Verificador de Driver para rastrear a causa específica de uma falha.

Para iniciar o gerenciador do verificador de driver, digite verifier em um prompt de comando. Você pode configurar quais drivers gostaria de verificar. O código que verifica os drivers adiciona sobrecarga à medida que é executado, então tente e verifique o menor número possível de drivers. Se um driver com falha foi identificado, selecione-o. Para obter mais informações, consulte Driver Verifier.

Confira também

Referência de código de verificação de bugs