Temos um aplicativo escrito em .NET 4.0 que travou no fim de semana, colocando a seguinte mensagem no log de eventos:
Aplicativo: PnrRetrieverService.exe Versão da estrutura: v4.0.30319
Descrição: O processo foi encerrado devido a um erro interno no .NET Runtime em IP 791F9AAA (79140000) com código de saída 80131506.
Isso está em uma caixa do Windows Server 2003 R2 Standard Edition. Pesquisando este erro, não encontrou nada pertinente. Por exemplo, isso não está ocorrendo no VS Studio, mas em uma caixa de produção; quando o serviço foi reiniciado, não houve mais problemas.
Como diagnosticar um bug no .NET Runtime?
.net
runtime-error
executionengineexception
ALEXintlsos
fonte
fonte
Respostas:
Essa é desagradável, ExecutionEngineException. A partir do .NET 4.0, essa exceção encerra imediatamente o programa. A causa genérica é a corrupção do estado do heap da coleta de lixo. O que, por sua vez, é invariavelmente causado por código não gerenciado. A localização exata no código em que essa exceção é gerada não é útil, a corrupção geralmente ocorreu bem antes de o dano ser detectado.
Encontrar a causa exata para isso vai ser difícil. Revise qualquer código não gerenciado que seu serviço possa estar usando. Suspeite de problemas ambientais se não houver um candidato óbvio, os scanners de malware com comportamento inadequado são notórios. Se ele se repetir muito mal, suspeite de problemas de hardware, como erros de RAM de software.
fonte
Um bug na implementação simultânea da Coleta de Lixo em x64 .Net 4 pode causar isso, conforme indicado na seguinte entrada da KB da Microsoft:
ExecutionEngineException ocorre durante a coleta de lixo
Você deve primeiro fazer uma exploração profunda de minidespejo para ter certeza de que o problema ocorreu durante uma coleta de lixo.
O local do minidespejo geralmente pode ser encontrado em uma entrada do Relatório de Erros do Windows no log de eventos após a entrada da falha. Então, divirta-se com o WinDbg!
A documentação mais recente sobre o uso do
<gcConcurrent/>
elemento de configuração, para desativar a coleta de lixo simultânea ou (no .NET 4 e posterior) em segundo plano, pode ser encontrada aqui .fonte
Eu experimentei "erros internos" no tempo de execução do .NET que acabaram sendo causados por bugs em meu código; não pense que só porque foi um "erro interno" no tempo de execução do .NET, não há um bug em seu código como causa raiz. Sempre sempre culpe o seu próprio código antes de culpar o de outra pessoa.
Esperançosamente, você tem informações de registro e exceção / rastreamento de pilha para apontar onde começar a procurar, ou que você pode repetir o estado do sistema antes do travamento.
fonte
Para aqueles que chegam aqui do Google, acabei encontrando essa pergunta do SO , e essa resposta específica resolveu meu problema. Entrei em contato com a Microsoft para obter o hotfix por meio do chat ao vivo em support.microsoft.com e eles me enviaram um link para o hotfix por e-mail.
fonte
Depois de anos lutando com esse problema em vários aplicativos, parece que a Microsoft finalmente o aceitou como um bug no .NET 4 CLR que faz com que isso ocorra. http://support.microsoft.com/kb/2640103 .
Eu já havia "consertado" isso forçando o coletor de lixo a ser executado no modo de servidor (gcServer enabled = "true" em app.config), conforme descrito no artigo da Microsoft vinculado a Think Before Coding. Em essência, isso força todos os threads no aplicativo a pausar durante a coleta, removendo a possibilidade de outros threads acessarem a memória que está sendo manipulada pelo GC. Fico feliz em descobrir que meus anos de busca em vão por um "bug" no meu código ou em outras bibliotecas não gerenciadas de terceiros foram infrutíferos porque o bug estava no código da Microsoft, não no meu.
fonte
Pode ser um bug com GC simultâneo http://support.microsoft.com/kb/2679415
fonte
Tive exatamente o mesmo erro na caixa WinXP com a última compilação do meu código .NET 4. Verificou as compilações anteriores - agora também travam! Ok então não sou eu :). Nenhuma sugestão aqui / acima ajudou.
Relatório muito mais recente (09/05/2018) do mesmo problema: Falha de aplicativo com código de saída 80131506 .
A causa raiz ainda é desconhecida (a máquina não está sendo atualizada e tem pouco uso), mas isso funcionou para mim !
fonte
No meu caso, essa exceção ocorreu quando o espaço em disco acabou e o .NET não pode alocar memória na memória virtual do Windows.
No log de eventos, vi este erro:
Pop-up do aplicativo: Windows - Mínimo de memória virtual muito baixo: O sistema está com pouca memória virtual. O Windows está aumentando o tamanho do arquivo de paginação da memória virtual. Durante esse processo, as solicitações de memória para alguns aplicativos podem ser negadas.
E o erro anterior:
O disco C: está no limite ou próximo à capacidade. Pode ser necessário excluir alguns arquivos.
fonte
No meu caso, o problema era uma biblioteca C ++ / CLI na qual havia uma chamada para o NtQuerySystemInformation ; por algum tipo de razão às vezes (e em circunstâncias misteriosas ), quando era chamado, o heap CLR foi corrompido e o aplicativo travou.
Resolvi o problema usando um "heap personalizado" criado com HeapCreate e alocando lá os buffers usados por essa função.
fonte
Não tenho certeza se isso pode ajudar a todos, mas eu poderia contornar isso executando
... no caminho
{Visual_Studio_root}\Common7\Ide
Eu tive os seguintes erros no log de eventos e o VS estava travando e reiniciando o tempo todo:
fonte
No meu caso, o problema era devido a redirecionamentos de ligação duplicados em meu web.config. Mais informações aqui .
Presumo que tenha sido por causa do NuGet modificando os redirecionamentos de vinculação, mas, por exemplo, era assim:
Remover todas as duplicatas resolveu o problema.
fonte
No meu caso, esse erro ocorreu ao fazer login no aplicativo SAP Business One 9.1. Nos eventos do Windows pude encontrar também outro evento de erro além do relatado pelo OP:
A máquina roda Windows 8.1, com .NET Framework 4.0 instalado e sem a versão 4.5. Como parecia da internet que também poderia ser um bug no .NET 4, tentei instalar o .NET Framework 4.5.2 e resolvi o problema.
fonte
Versão da estrutura: v4.0.30319 Descrição: o processo foi encerrado devido a uma exceção não tratada. Informações de exceção: System.Reflection.TargetInvocationException
Eu enfrentei este erro, o aplicativo estava funcionando bem em alguns PCs e em alguns PCs apresentando o erro acima. Desinstalar o Framework 4.5 e reinstalar isso resolveu meu problema.
Viva
fonte
Isso pode ser uma exceção que ocorre no finalizador. Se você está fazendo o padrão de ~ Class () {Dispose (false); } verifique o que você está descartando como um recurso não gerenciado. Basta colocar um try..catch lá e você deve ficar bem.
Encontramos o problema porque tínhamos uma falha misteriosa sem registros. Fizemos o padrão recomendado de usar um "void Dispose (bool disposing)".
Olhando para as respostas a esta pergunta sobre o finalizador, encontramos um possível lugar onde o Descarte de recursos não gerenciados poderia lançar uma exceção.
Acontece que em algum lugar não descartamos o objeto corretamente, portanto, o finalizador assumiu a disposição dos recursos não gerenciados, portanto, eis que ocorreu uma exceção.
Neste caso, estava usando a API Kafka Rest para limpar o cliente do Kafka. Parece que houve uma exceção em algum momento, em seguida, esse problema ocorreu.
fonte
No meu caso, o problema estava relacionado a " Referenciando a biblioteca padrão .NET em projetos clássicos do asp.net " e esses dois problemas
https://github.com/dotnet/standard/issues/873
https://github.com/App-vNext/Polly/issues/628
e fazer o downgrade para Polly v6 foi o suficiente para contornar isso
fonte
Eu nunca descobri por que isso estava acontecendo comigo. Era reproduzível de forma consistente para um de meus aplicativos, mas desapareceu após a simples reinicialização.
Estou executando o Windows 2004 Build 19582.1001 (Insider Preview) com .net-4.8 e também não ficaria surpreso se isso fosse devido a algo como um erro de memória de hardware. Além disso, meu aplicativo carrega algum código não gerenciado e o inicializa, então não posso provar que a falha não veio disso.
fonte
A cada 5-10 minutos, meu pool de aplicativos travava com esse código de saída. Não quero arruinar sua confiança no Coletor de Lixo, mas a solução a seguir funcionou para mim.
Eu adicionei um trabalho que chama
GC.GetTotalMemory(true)
cada minuto.Suponho que, por algum motivo, o GC não esteja inspecionando automaticamente a memória com a frequência suficiente para o grande número de objetos descartáveis que uso.
fonte