Falha recorrente: “Ocorreu uma exceção win32 não tratada no mscorsvw.exe”. Como diagnosticar / corrigir?

3

Recentemente eu adquiri um novo PC no trabalho e tive que reinstalar ferramentas de desenvolvimento, etc. O PC executa o Windows XP (blech), e eu tenho o Visual Studio 2010 e .NET Frameworks 2.0, 3.5 e 4.0 instalados, cada com todos os service packs e patches atuais. O próprio Windows XP também está atualizado (se é que se pode dizer que: -)

Um problema recorrente que notei é o seguinte diálogo, que tende a aparecer depois que a máquina ficou ociosa por um tempo:

Eususpeitoqueafalhaocorreudevidoao.NETFrameworkexecutaracompilaçãodoNgendemontagensdosistemaemsegundoplanoetravarquandoatingeumassemblyemparticular.

Encontrei outra menção Esse problema nos fóruns do MSDN e uma das soluções alternativas sugeridas é configurar o recurso Prevenção de Execução de Dados do Windows XP para "Ativar a DEP apenas para programas e serviços essenciais do Windows" . No entanto, isso já é a configuração em vigor no meu PC.

Como posso diagnosticar mais? Quando tento me ligar ao processo, ele já se foi.

Existem outras correções sugeridas ou prováveis?

ATUALIZAÇÃO:

Encontrei mais algumas informações sobre ngen aqui e aqui .

Eu executei o seguinte em um Prompt de Comando: ngen executequeueditems .. isso agora me permite reproduzir o problema de forma confiável, em vez de esperar que o ngen de fundo ocioso seja executado.

Então, quando ngen.exe chegou à seguinte entrada:

Compiling assembly Microsoft.SqlServer.Management.MultiServerConnection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 (CLR v2.0.50727) ...
WARNING: Cannot hardbind to mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 because dependency does not have a native image (check FusLogVw for reason)
Failed to generate native code for dependent image Microsoft.SqlServer.Management.MultiServerConnection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 because of the following error: The remote procedure call failed. (Exception from HRESULT: 0x800706BE)

... o resultado foi o seguinte diálogo de erro:

Considerandoque,outrosassembliesquefalharamnageraçãodeimagensnativas,naverdade,nãocausaramumcrash,apenasumamensagemdeerro.

Portanto,amontagemespecíficaemqueissoestáfalhandoé:Microsoft.SqlServer.Management.MultiServerConnection.

Oquemaispossofazer?Euparticularmentenãomeimportosepodeserngen'dounãonestemomento;Eusimplesmentequeropararestediálogodeerrorecorrenteirritantedecima.Eujátentei:

ngenuninstallMicrosoft.SqlServer.Management.MultiServerConnection,

...masdiz"ERRO: O conjunto especificado não está instalado."

Existe uma maneira de remover um assembly da ngen queue , então o ngen não vai nem tentar gerar uma imagem nativa para ele?

    
por Chris W. Rea 26.04.2011 / 16:51

4 respostas

3

O nGen do conjunto do Sql Server está com falha porque uma tentativa anterior de nGening o assembly mscorlib do .Net Framework 2.0 falhou . Isso não tem nada a ver com .Net 4, então eu sugiro que você pare de olhar para o serviço ngen (2 e 4 usam seus próprios serviços).

Quanto a por que isso falhou - bem, não há uma quantidade enorme na net sobre isso. Eu encontrei isso nos fóruns do MSDN - Há algo sobre como confirmar se o mscorlib foi corretamente nGen'd - eu verifico isso.

Curiosamente, o Sql Server também é mencionado nesse segmento; Embora seja 2005 e eu acho que os assemblies da versão 10 que você está falando aqui são Sql 2008. Ainda assim, pode fornecer algo.

Mas, no fim das contas, se essa fosse minha máquina, eu faria:

  • Desinstale o .Net 2.0 e 3.0 e 3.5 (se estiver se sentindo bem também com a desinstalação 4.0)

  • Desinstale o componente do Sql Server que contém a montagem que está falhando na nGen.

  • Instale o .Net 3,5 sp1 redist; Certifique-se de que você também tenha o hotfix que é referenciado para mais adiante na página.

  • Aguarde que todo o nGening seja concluído antes de continuar.

  • Se você desinstalou o .Net 4, reinstale também agora.

  • Reinstale o componente do Sql Server removido na etapa 2.

Sim, eu sei, meio que 'desligue e ligue novamente' - mas acho que é melhor do que tentar evitar o problema. Se o mscorlib 2.0 não foi nGen'd corretamente, então o tbh .Net 2.0 não é realmente utilizável em seu estado atual. E como esse é um componente do SQL Server que está tentando nGen - apenas um mscorlib v2 do nGen'd funcionará com ele (nGen'd mscorlib v4 não funcionará).

    
por 03.06.2011 / 14:19
3

mscorsvw.exe pode ser visto como um programa da Microsoft e ainda lucrar com a DEP, você pode verificar se está realmente desativado com Process Explorer . Quer adicionando uma coluna DEP ou verificando as propriedades do processo.

O Visual Studio (pelo menos para mim) não é muito útil para depurar falhas, é melhor você obter um dump para que possamos tentar verificar as possíveis causas. Você pode instalar o depurador padrão usando drwtsn32.exe -i . Ou, se você quiser saber, pode usar o WinDBG , que permite analisar programas com falhas em mais detalhe. No entanto, isso é algo que você não está interessado ...

I suspect the crash is due to the .NET Framework performing Ngen compilation of system assemblies in the background, and crashing when it reaches one assembly in particular.

Em vez disso, ngen.exe falha? Você pode confirmar que ngen.exe estava sendo executado?

Você pode configurar o Process Monitor para que ele mostre apenas o início / parada do processo / thread para que você pode ver o que correu, deixe-o em funcionamento durante algum tempo e consulte-o novamente assim que tiver essa janela de depuração.

    
por 01.06.2011 / 20:45
2

"Turn on DEP for essential Windows programs and services only".

Como o mscorsvw.exe é um serviço, isso não afeta realmente.

How can I diagnose further?

Veja os arquivos de log do ngen. Eles provavelmente estão localizados em várias pastas, como C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 ou qualquer outra versão do framework que você tenha instalado.

    
por 01.06.2011 / 19:21
1

De O que é mscorsvw.exe? como desativá-lo da execução :

Mscorsvw .exe is process related to Microsoft .NET framework. Mscorsvw process is used to precompile .Net framework assemblies in the background.

Mscorsvw.exe process runs only in the background if it needs to compile highest priority assemblies after installing .NET framework redistributable and an application using .NET framework is installed to have its assemblies compiled.

Normally precompiling high priority assemblies will be done by mscorsvw.exe process with in 5 to 10 minutes and then it will try to process low priority assemblies when your Computer is idle.

Disabling or stopping mscorsvw.exe

  1. Navigate to C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 in Windows Explorer.
  2. Open the command prompt by typing cmd in run box and press enter.
  3. Now we need to specify the above path in command and now type
    ngen.exe executequeueditems
    and press enter.
  4. Now wait for the process to precompile all assemblies, after couple of minutes it will be completed.

Now you observe there will be no mscorsvw.exe process running in task manager.

Você também pode usar este comando a qualquer momento para ver se há algo enfileirado esperando para ser executado:

ngen queue status

e também:

ngen display

Para limpar todos os itens na fila, faça o seguinte:

ngen /delete *

Para descobrir quais assemblies estão causando o problema, os arquivos de log que podem ajudar a responder isso:

C:\Windows\Microsoft.NET\Framework\<version>\ngen.log
C:\Windows\Microsoft.NET\Framework\<version>\ngen_service.log

Em outra nota, você não precisa do .NET Framework 2.0 e 3.5, já que o 4.0 deve substituir todos eles.

    
por 02.06.2011 / 09:48