J'ai récemment eu un nouveau PC au travail et j'ai dû réinstaller les outils de développement, etc. Le PC fonctionne sous Windows XP (blech). service packs et correctifs. Windows XP lui-même est également à jour (si l’on pouvait dire cela :-)
Un problème récurrent que j'ai remarqué est le dialogue suivant, qui a tendance à apparaître après que la machine a été tourner au ralenti pour un moment:
Je soupçonne que cet incident est dû au fait que .NET Framework a effectué la compilation Ngen des assemblys système en arrière-plan et qu’il se bloque lorsqu’il atteint un assemblage en particulier.
J'ai trouvé une autre mention Pour résoudre ce problème sur les forums MSDN, l’une des solutions de contournement suggérées consiste à configurer la fonctionnalité de prévention de l’exécution des données de Windows XP. "Activer la PED pour les programmes et services Windows essentiels uniquement" . Cependant, c'est déjà le réglage en vigueur sur mon PC.
Comment puis-je diagnostiquer plus loin? Lorsque j'essaie de m'attacher au processus, il est déjà parti.
Existe-t-il d'autres solutions suggérées ou probables?
METTRE À JOUR:
J'ai trouvé plus d'informations sur ngen ici et ici .
J'ai exécuté ce qui suit à une invite de commande: ngen executequeueditems
Cela me permet maintenant de reproduire le problème de manière fiable au lieu d’attendre l’exécution du ngen inactif.
Donc quand ngen.exe
obtenu à l'entrée suivante:
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)
... le résultat était la boîte de dialogue d'erreur suivante:
Considérant que, d'autres assemblys qui ont échoué la génération d'image native n'a pas réellement causé crash , juste un message d'erreur.
Donc, l'assemblage spécifique sur lequel il échoue est: Microsoft.SqlServer.Management.MultiServerConnection .
Que puis-je faire d'autre? Je ne me soucie pas particulièrement de savoir si ça peut être générique ou non à ce stade; Je veux simplement arrêter cette boîte de dialogue d'erreur récurrente ennuyante d'en haut. J'ai déjà essayé:
ngen uninstall Microsoft.SqlServer.Management.MultiServerConnection
,
... mais il est écrit "ERROR: l'assembly spécifié n'est pas installé".
Est-il possible de supprimer un assemblage du ngen queue , alors ngen ne va même pas essayer de générer une image native pour cela?
la source
Réponses:
Le nGen de l'assembly Sql Server échoue car une tentative précédente de nGening de l'assembly .Net Framework 2.0 mscorlib a échoué . Cela n’a rien à voir avec .Net 4, je vous suggère donc de cesser de regarder son service ngen (les 2 et 4 utilisent leurs propres services).
En ce qui concerne les raisons de cet échec - eh bien, il n’ya pas beaucoup d’information sur le net à ce sujet. J'ai trouvé ceci sur les forums MSDN cependant - il y a quelque chose à l'intérieur pour confirmer si mscorlib a été correctement configuré - j'aimerais vérifier cela.
Fait intéressant, SQL Server est également mentionné sur ce fil. bien que nous soyons en 2005 et je pense que les assemblys de la version 10 dont vous parlez ici sont des SQL 2008, mais peut-être quelque chose.
Mais finalement, si c’était ma machine, je le ferais:
Désinstallez .Net 2.0, 3.0 et 3.5 (si vous vous sentez courageux, désinstallez également la version 4.0)
Désinstallez le composant Sql Server contenant l'assembly qui fait échouer le nGen.
Installez le .Net 3.5 sp1 redistribuer; en vous assurant que vous avez aussi le correctif qui est référencé plus loin dans la page.
Attendez que tout le nGening soit terminé avant de continuer.
Si vous avez désinstallé .Net 4, réinstallez-le aussi maintenant.
Réinstallez le composant Sql Server supprimé à l'étape 2.
Oui, je sais, un peu une réponse «éteignez-la et rallumez-la», mais je pense que c'est mieux que d'essayer de contourner le problème. Si mscorlib 2.0 n'a pas correctement généré nGen, alors .Net 2.0 n'est pas vraiment utilisable dans son état actuel. Et puisqu'il s'agit d'un composant SQL Server qui tente de nGen - seul un mscorlib v2 nGen fonctionnerait avec ce dernier (ce ne sera pas le cas pour nscen mscorlib v4).
la source
mscorsvw.exe
pourrait être considéré comme un programme Microsoft tout en bénéficiant du DEP, vous pouvez vérifier s’il est vraiment hors tension avec Explorateur de processus . Soit en ajoutant une colonne DEP ou en vérifiant les propriétés du processus.Visual Studio (du moins pour moi) n'est pas vraiment pratique pour déboguer des collisions, vous ferez mieux de faire un dump afin que nous puissions essayer de rechercher les causes possibles. Vous pouvez installer le débogueur par défaut en utilisant
drwtsn32.exe -i
. Ou si vous voulez apprendre, vous pouvez utiliser WinDBG , ce qui vous permet d’analyser plus en détail les programmes bloqués. Bien que ce soit bien si ça ne vous intéresse pas ...Ne serait pas
ngen.exe
crash à la place alors? Pouvez-vous confirmer quengen.exe
courait?Vous pourriez mettre en place Moniteur de processus de sorte qu'il ne montre que les processus / threads au début / arrêt pour que vous puissiez voir ce qui a été exécuté, laissez-le fonctionner pendant un moment et consultez-le dès que vous aurez cette fenêtre de débogage.
la source
ngen executequeueditems
; s'il vous plaît voir ma mise à jour ci-dessus dans la question.Comme mscorsvw.exe est un service, cela ne l’affecte pas vraiment.
Regardez les fichiers journaux ngen. Ils se trouvent probablement dans divers dossiers tels que C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 ou n’importe quelle version d’infrastructure que vous avez installée.
la source
De Qu'est-ce que mscorsvw.exe? comment le désactiver de l'exécution :
Vous pouvez également utiliser cette commande à tout moment pour voir s'il y a quelque chose en attente d'être exécuté:
et aussi :
Pour effacer tous les éléments en file d'attente, procédez comme suit:
Pour savoir quels assemblys sont à l'origine du problème, consultez les fichiers journaux susceptibles de vous aider:
Sur une autre note, vous n'avez pas besoin de .NET Frameworks 2.0 et 3.5, car 4.0 est supposé les remplacer.
la source
ngen.exe executequeueditems
.. m'a permis de reproduire le problème en dehors du contexte de fond inactif. Ensuite,ngen queue status
simplement des rapports "Le nom du service est: clr_optimization_v4.0.30319_32 .. Le service d'optimisation de l'exécution .NET est en cours d'exécution." Cela ne montre pas s'il y a quelque chose dans la file d'attente, maisngen.exe executequeueditems
semble toujours avoir du travail à faire.ngen /delete *
?