Partilhar via


Verificação de erro 0x50: FALHA_DE_PÁGINA_EM_ÁREA_NÃO_PAGINADA

A verificação de bug PAGE_FAULT_IN_NONPAGED_AREA tem um valor de 0x00000050. Isso indica que a memória de sistema inválida foi referenciada. Normalmente, o endereço de memória está errado ou o endereço de memória está apontando para a memória liberada.

Importante

Este artigo é para programadores. Se for um cliente que recebeu um código de erro de ecrã azul enquanto utiliza o computador, consulte Resolução de problemas de erros de ecrã 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º: Executar operação

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

0: Operação de leitura

2º: Operação de gravação

10º: Executar operação

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

0: Operação de leitura

1º: Operação de gravação

8º: Executar 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 que fez referência à memória (se conhecida)

4

Tipo de falha de página

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

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

0x03 - NONPAGED_BUGCHECK_WRONG_SESSION - Foi feita uma tentativa de referência a um endereço de espaço de sessão 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 anexá-lo primeiro. Este subtipo de verificação de bugs & foi usado pela última vez no Windows 10 RS3. No Windows 10 RS4 e superior, este erro é apresentado como 0x02 (NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE).

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

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

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

Motivo

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 desencadear esse erro, assim como um volume NTFS corrompido.

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

Observações

Registo de Eventos: 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. Procure erros críticos no log do sistema que ocorreram na mesma janela de tempo da tela azul.

Resolvendo um driver defeituoso: Examine o nome do driver se ele foi listado na tela azul ou está presente no log de eventos. Entre em contato com o fornecedor do driver para ver se um driver atualizado está disponível.

Resolvendo um problema de serviço do sistema defeituoso: Desative 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.

Resolver um problema de software antivírus: Desative o programa e confirme que isso resolve o erro. Se isso acontecer, entre em contato com o fabricante do programa sobre uma possível atualização.

Resolvendo um problema de volume NTFS corrompido: Execute Chkdsk /f /r para detetar e reparar erros de disco. Você deve reiniciar o sistema antes que a verificação de disco comece em uma partição do sistema. Entre em contato com o fabricante do sistema de driver de disco rígido para localizar quaisquer ferramentas de diagnóstico que eles fornecem 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 Controlo. Na caixa de pesquisa, escreva Memória e, em seguida, selecione Diagnosticar problemas de memória do computador. Depois que o teste for executado, use o Visualizador de eventos para exibir os resultados no log do sistema. Procure a entrada MemoryDiagnostics-Results para exibir os resultados.

Resolver um problema de hardware defeituoso: Se o hardware tiver sido 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 estes 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 bug 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ária experiência de 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 uma tentativa - exceto manipulador - ele só pode ser protegido por uma sonda ou técnicas de programação semelhantes. Para obter informações sobre manipulação de buffer e testes em drivers de sistema de arquivos, consulte Manipulação de buffer. Para obter informações sobre as práticas recomendadas para o desenvolvimento de drivers e erros comuns cometidos por desenvolvedores de drivers, consulte Práticas recomendadas de desenvolvimento de drivers da equipe do Surface.

Use a extensão !analyze debug 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 bug ocorreu quando uma área da memória estava sendo lida.

Olhe para toda a saída !analyze para obter informações sobre o que estava acontecendo quando a verificação de bug ocorreu. Examine MODULE_NAME: e o 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 a falha ocorreu. Se vários arquivos de despejo estiverem disponíveis, compare as informações para procurar um código comum que esteja na pilha.

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

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

Use comandos do depurador, como use kb (Display Stack Backtrace) para investigar o código com falha.

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

Use o comando d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory) 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  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

Neste caso, não parece que há dados nesta área de memória no parâmetro 1, que é a área de 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 incorreta.

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 fez referência à memória ruim. Para obter mais informações sobre o processador X64 e a linguagem de montagem, 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 para trás a partir de um determinado endereço.

Use o comando r (Registers) para examinar o que estava sendo executado conforme o bug do sistema 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 de ponteiro de instrução, rip.

O !pte comando e !pool também pode ser usado 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 da memória do Windows, consulte Windows Internals 7th Edition Part 1 por Pavel Yosifovich, Mark E. Russinovich, David A. Solomon e Alex Ionescu.

Verificador de Driver

Driver Verifier é 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 proativamente cria uma exceção para permitir que essa parte do código do driver seja examinada mais detalhadamente. O gerenciador de verificador de driver está integrado ao 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 de verificador de driver, digite Verificador em um prompt de comando. Você pode configurar quais drivers você gostaria de verificar. O código que verifica os drivers adiciona sobrecarga à medida que é executado, portanto, tente verificar o menor número possível de drivers. Se um driver com falha foi identificado, selecione-o. Para obter mais informações, consulte Verificador de Controlador.

Ver também

Referência de Código da Verificação de Erros