Partilhar via


Verificação de bugs 0x3B: SYSTEM_SERVICE_EXCEPTION

A verificação de bugs SYSTEM_SERVICE_EXCEPTION tem um valor de 0x0000003B. Isso indica que uma exceção ocorreu durante a execução de uma rotina que faz a transição de código sem privilégios para código com privilégios.

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.

SYSTEM_SERVICE_EXCEPTION parâmetros

Parâmetro Descrição
1 A exceção que causou a verificação de bugs.
2 O endereço da instrução que causou a verificação de bugs
3 O endereço do registro de contexto para a exceção que causou a verificação de bugs
4 0 (Não usado)

Causa

Esse código de parada indica que o código de execução teve uma exceção, e o thread que estava abaixo dele é um thread do sistema.

Isso pode acontecer porque um ponteiro NULL desreferenciado ou um endereço incorreto aleatório foi acessado. Isso, por sua vez, pode ser causado pela liberação prematura da memória ou pela corrupção da estrutura de dados.

As informações de exceção retornadas no parâmetro 1 são descritas em valores NTSTATUS. Os códigos de exceção são definidos em ntstatus.h, um arquivo de cabeçalho fornecido pelo Kit de Driver do Windows. (Para obter mais informações, consulte Arquivos de cabeçalho no Kit de Driver do Windows).

Os códigos de exceção comuns incluem:

  • 0x80000003: STATUS_BREAKPOINT

    Um ponto de interrupção ou ASSERT foi encontrado quando nenhum depurador de kernel foi anexado ao sistema.

  • 0xC0000005: STATUS_ACCESS_VIOLATION

    Ocorreu uma violação de acesso à memória.

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.

Para depurar esse problema, use os comandos .cxr (exibir registro de contexto) com o Parâmetro 3 e, em seguida, use kb (exibir backtrace da pilha). Você pode também definir um ponto de interrupção no código que precede esse código de parada e tentar avançar em uma única etapa para o código de falha. Use os comandos u, ub, uu (desmontar) para ver o código do programa de montagem.

A extensão do depurador !analyze exibe informações sobre a verificação de bugs e pode ser útil para determinar a causa raiz. O exemplo a seguir é a saída de !analyze.

SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: fffff802328375b0, Address of the instruction which caused the bugcheck
Arg3: ffff9c0a746c2330, Address of the context record for the exception that caused the bugcheck
Arg4: 0000000000000000, zero.
...

Para obter mais informações sobre WinDbg e !analyze, consulte os seguintes tópicos:

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.

Identificar o driver

Se um driver responsável pelo erro puder ser identificado, seu nome será mostrado na tela azul e armazenado na memória no local (PUNICODE_STRING) KiBugCheckDriver. Você pode usar dx (exibe a expressão do modelo de objeto do depurador), um comando do depurador, para exibir: dx KiBugCheckDriver.

kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffe10b9991e3e8 : "nvlddmkm.sys" [Type: _UNICODE_STRING *]

Use a extensão !error para exibir informações sobre o código de exceção no parâmetro 1. A seguir, um exemplo de saída de !error.

2: kd> !error 00000000c0000005
Error code: (NTSTATUS) 0xc0000005 (3221225477) - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.

Examine a saída STACK TEXT do WinDbg para obter pistas sobre o que estava em execução quando a falha ocorreu. Se houver vários arquivos de despejo disponíveis, compare suas informações para procurar um código comum que esteja na pilha. Use comandos do depurador como kb (exibir backtrace da pilha) para investigar o código com falha.

Use o seguinte comando para listar os módulos que são carregados na memória: lm t n

Use !memusage para examinar o estado geral da memória do sistema. Você também pode usar os comandos !pte e !pool para examinar áreas específicas da memória.

No passado, esse erro foi associado ao uso excessivo do pool paginado, o que pode ocorrer devido ao cruzamento de drivers gráficos no modo de usuário e à passagem de dados inválidos para o código do kernel. Se você suspeitar que esse é o caso, use as opções de pool no Verificador de Driver para coletar informações adicionais.

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 identificar 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 de Verificação de Driver é integrado ao Windows e está disponível em todos os PCs com Windows.

Para iniciar o Gerenciador de Verificação de Driver, insira verifier em um prompt de comando. Você pode configurar quais drivers verificar. O código que verifica os drivers adiciona sobrecarga à medida que é executado, portanto, tente verificar o menor número possível de drivers. Para obter mais informações, consulte Driver Verifier.

Comentários

Para a solução de problemas gerais dos códigos de verificação de bugs do Windows, siga estas sugestões:

  • Se você instalou novos drivers de dispositivo ou serviços do sistema recentemente, tente removê-los ou atualizá-los. Tente determinar o que mudou no sistema que causou o aparecimento do novo código de verificação de bugs.

  • Verifique no Gerenciador de dispositivos se algum dispositivo está marcado com um ponto de exclamação (!), o que indica um problema. Examine o registro de eventos exibido nas propriedades de qualquer driver de dispositivo com falha. Tente atualizar o driver relacionado.

  • 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 que a tela azul.

  • Se você adicionou hardware ao sistema recentemente, tente removê-lo ou substituí-lo. Ou verifique com o fabricante se há patches disponíveis.

Para obter mais informações gerais sobre solução de problemas, consulte Analisar dados de tela azul de verificação de bugs.

Confira também

Análise de despejo de memória usando os depuradores do Windows (WinDbg)

Analisando um arquivo de despejo no modo kernel com o WinDbg

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