Pergunta

Eu adicionei algum código que compila de forma limpa e acaba de receber esse erro do Windows:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

Estou prestes a ir em uma caça bug, e eu estou esperando que ele seja algo bobo que eu fiz o que só acontece para produzir esta mensagem. O código compila de forma limpa, sem erros ou avisos. O tamanho do arquivo EXE cresceu para 1,454,132 bytes e inclui links para ODCS.lib, mas é de outra forma pura C com a API Win32, com depuração no (rodando em um P4 no Windows 2000).

Foi útil?

Solução

Para responder à pergunta, uma instrução privilegiada é um op-código do processador (assembler instrução) que só pode ser executado no modo (ou Ring-0) "supervisor". Estes tipos de instruções tendem a ser usado para os dispositivos de I / O de acesso e protegido estruturas de dados do kernel do Windows.

programas regulares executar em "modo de usuário" (-3 anel), que não permite o acesso directo aos dispositivos I / O, etc ...

Como os outros mencionados, a causa é provavelmente uma pilha corrompida ou uma chamada de ponteiro de função desarrumada.

Outras dicas

Este tipo de coisa geralmente acontece quando se utiliza ponteiros de função que apontam para dados inválidos. Também pode acontecer se você tiver código que trashes seu stack retorno. Por vezes, pode ser bastante complicado para rastrear este tipo de erros para baixo, porque eles geralmente são difíceis de reproduzir.

Uma instrução é uma instrução privilegiada IA-32 que só é permitida a ser executado no anel-0 (ou seja, modo de núcleo). Se você está batendo isso no espaço de usuário, você quer tem um EXE muito velho, ou um binário corrompido.

Primeiro probabilidade de que eu posso pensar é, você pode estar usando um array local e é perto do topo da declaração da função. Seus verificação de limites insano ido e substituir o endereço de retorno e ele aponta para alguma instrução que só kernel está autorizado a executar.

Como eu suspeitava que era algo bobo que eu fiz. Acho que resolveu este duas vezes mais rápido por causa de algumas das pistas em comentários nas mensagens acima. Obrigado a todos aqueles especialmente aqueles que apontou para algo no início do aplicativo substituir a pilha. Na verdade, encontrei vários resposta aqui mais útil que o post eu ter marcado como responder a pergunta como eles clued e me na fila para onde olhar, embora eu acho que melhor resume a resposta.

Como se viu que eu tinha acabou de adicionar um botão que foi até o tamanho máximo de uma matriz segurando algumas informações botão da barra de ferramentas (que era na pilha). Eu tinha esquecido que

#define MAX_NUM_TOOBAR_BUTTONS  (24)

sequer existia!

A localização de erro 0x00486752 parece muito pequeno para mim, antes de onde o código executável vive habitualmente. Concordo com Daniel, ele se parece com um ponteiro selvagem para mim.

Eu vi isso com o Visual C ++ 6.0 no ano de 2000.

A biblioteca de depuração C ++ teve chamadas para instruções físicos de I / O em que, em um manipulador de exceção. Se bem me lembro, foi despejar o estado de uma porta de I / O que costumava ser para os registos da base de DMA, que eu suponho que alguém na Microsoft estava usando para um cartão depurador.

procurar alguma condição de erro que pode ser latente causando código de diagnóstico para ser executado.

Eu estava depuração, voltou atrás e ler a desmontagem. Foi uma exceção ao processar std::string, talvez indexação de fora da final.

O CPU da maioria dos processadores fabricados nos últimos 15 anos tem algumas instruções especiais que são muito poderosos. Estas instruções privilegiadas são mantidos para aplicações kernel do sistema operacional e não é capaz de ser usado por programas do usuário escrita.

Isto restringe o dano que um programa escrito pelo usuário pode infligir o sistema e reduz o número de vezes que o sistema realmente falha.

Ao executar no modo kernel, o sistema operacional tem acesso irrestrito a ambos o kernel e memória do programa do usuário.

As instruções de carga para os registradores de base e limite são instruções privilegiadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top