Pergunta

Eu tenho um cliente que me disse que meu programa (programa simples de usuário, não um driver) está travando seu sistema com um Tela azul da morte (BSOD).Ele diz que nunca encontrou isso com outro programa e que pode reproduzi-lo facilmente com o meu.

O BSOD é do tipo CRITICAL_OBJECT_TERMINATION (0x000000F4) com tipo de objeto 0x3 (processo):Um processo ou thread crucial para a operação do sistema foi encerrado ou encerrado inesperadamente.

Um programa simples pode ser responsável por um BSOD (mesmo no Vista...) ou deve verificar o hardware ou a instalação do sistema operacional?

Foi útil?

Solução

A maneira mais fácil de causar um BSOD com um programa de espaço de usuário é (Afaik) para Mate o processo do subsistema do Windows (csrss.exe). Isso não precisa de hardware com defeito nem um bug no kernel ou um motorista, ele só precisa de privilégios de administrador1.

O que o seu código está fazendo exatamente? A mensagem de erro ("Um processo ou encadeamento crucial para a operação do sistema saiu inesperadamente saindo ou terminando.") Parece um dos processos essenciais do sistema terminados. Talvez você esteja matando um processo e, sem querer, tenha o processo errado?

Se de alguma forma, você pode tentar obter um despejo de memória desse cliente. Usando o Ferramentas de depuração para Windows Você pode analisar mais o despejo conforme descrito aqui.

1O Windows não o impede de fazendo isso porque isso "Mantém os administradores no controle de seu computador". Portanto, isso é por design e não um bug. Leia os artigos de Raymond e você verá o porquê.

Outras dicas

Só porque seu programa não é um motorista não significa que não usar um motorista.

Em teoria, seu código não deve ser capaz de bsod o computador. Cabe ao sistema operacional garantir que isso não aconteça. Por definição, isso significa que há um problema em algum lugar em hardware ou em código diferente do seu programa. Isso não impede que haja um bug no seu código também.

A resposta curta é sim. A resposta longa depende do que você programa deve fazer e como é?

Normalmente, não deveria. Se isso acontecer, deve haver

  • Um bug no kernel do Windows (possível, mas muito improvável)
  • Um bug em um driver de dispositivo (não necessariamente em um dispositivo que seu programa usa, isso pode ficar bastante complicado)
  • Uma falha no hardware

Eu apostaria na opção número dois (driver de dispositivo), mas seria interessante se você pudesse obter um despejo mais detalhado.

Bem, sim, pode - mas por muitos motivos diferentes.

É por isso que testamos em diferentes máquinas, sistemas operacionais, hardware etc.

Você definiu alguns requisitos para o seu programa e seu usuário está seguindo -os?

Se você não consegue duplicá-lo sozinho e seu programa não precisa de administrador para ser executado, eu ficaria um pouco desconfiado

  • A estabilidade do hardware desse sistema
  • O status de vírus/malware desse sistema.

Se você conseguir acesso físico à caixa do cliente, pode valer a pena executar uma verificação completa de vírus com um verificador atualizado e executar uma verificação completa de vírus. memtest nele.

Eu já tive um sistema que parecia estável, exceto que alguns programas não funcionavam nele (e às vezes travavam a caixa).O Memtest mostrou que minha RAM tinha alguns bits ruins, mas eles estavam em sims maiores, então eles só eram acessados ​​se um programa tentasse usar muita RAM.

Não, e isso é praticamente por definição. A pior coisa que você pode dizer é que um aplicativo de terra de usuário pode ter "acionado" um bug do Windows ou um bug do driver. Mas um sistema operacional moderno de desktop é totalmente responsável por sua própria integridade; Um BSOD é uma falha dessa integridade. Portanto, o sistema operacional é responsável e apenas o sistema operacional.

(Exemplo de um bug bsod que seu aplicativo sozinho poderia expor: um scanner de vírus implementado como motorista, que trava ao executar um arquivo do setor 0xffffffffff, um setor que nessa máquina só contém uma dll do seu aplicativo)

Eu tive problemas ao sair do meu aplicativo sem interromper todos os processos e conexões BD quando o programa terminar (eu travessei o IDE inteiro). Coloquei o código "Parando e desconectando" no evento "encerrado" do "form_closed" do meu formulário principal e o problema foi resolvido, não sei se esta é a sua situação.

Outro problema pode ser se o usuário estiver tentando acessar os mesmos recursos que seu aplicativo está usando (bancos de dados, hardware, soquetes etc.). Pergunte a ele sobre quais aplicativos ele/ela está usando quando o BSOD acontece.

Um vírus não pode ser descartado.

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