web-dev-qa-db-fra.com

Comment déboguer l'erreur w3wp clr.dll

Mon client a une application ASP.NET installée sur deux serveurs de production (équilibrée avec NLB, mais ce n'est pas pertinent). Les deux serveurs se bloquent toutes les 3-4 heures avec l'erreur enregistrée par l'observateur d'événements suivante:

Nom de l'application défaillante: w3wp.exe, version: 7.5.7601.17514, horodatage: 0x4ce7afa2
Nom du module défaillant: clr.dll, version: 4.0.30319.18034, horodatage: 0x50b5a783
Code d'exception: 0xc00000fd Décalage d'erreur: 0x000000000001a840
ID de processus défaillant: 0xd50
Heure de démarrage de l'application défaillante: 0x01ce97fe076d27b4
Chemin d'accès à l'application défaillant: c:\windows\system32\inetsrv\w3wp.exe
Chemin d'accès au module défaillant: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll ID de rapport: e0c90a5f-0455-11e3-8f0e-005056891553

Je ne sais pas comment déboguer ni par où commencer. Lorsque le crash est sur le point de se produire, l'utilisation du processeur de serveur passe à 100% et y reste. Le processus en cause est w3wp.exe. Je ne sais même pas si mon code génère l'erreur ou non. C'est IIS 7.5. Tout pointeur serait grandement apprécié.

40
cristi71000

Il semble que vous ayez une exception StackOverflow, qui est causée par une récursion illimitée (une fonction s'appelant à plusieurs reprises, etc.). Cela ne peut pas être détecté par un bloc try/catch régulier. Vous pouvez suivre le problème en utilisant DebugDiag et WinDbg .

DebugDiag peut être configuré pour générer un vidage sur incident lorsque la StackOverflowException se produit. Téléchargez sur https://www.Microsoft.com/en-us/download/details.aspx?id=49924 .

  1. Ouvrez DebugDiag et cliquez sur Ajouter une règle.
  2. "Crash" doit déjà être sélectionné. Cliquez sur Suivant.
  3. Choisissez "Un pool d'applications Web spécifique IIS" et cliquez sur Suivant.
  4. Sélectionnez le pool d'applications et cliquez sur Suivant.
  5. Vous devriez être dans la fenêtre de configuration avancée. Cliquez sur Exceptions sous Paramètres avancés.
  6. Cliquez sur Ajouter une exception et choisissez Débordement de pile, avec un type d'action de vidage utilisateur complet
  7. Cliquez sur OK et enregistrez et fermez.

La prochaine fois qu'une StackOverflowException se produira, vous aurez un vidage sur incident. Maintenant, nous devons interpréter le fichier de vidage.

Les outils de débogage pour Windows font partie du SDK Windows et peuvent être téléchargés sur http://msdn.Microsoft.com/en-US/windows/hardware/gg463009/ .

  1. Pour utiliser WinDbg, vous devrez obtenir les fichiers de symboles. Téléchargez les fichiers de symboles et placez-les dans un dossier local.
  2. Ouvrez WinDbg. Dans le menu Fichier, cliquez sur Chemin du fichier de symboles.
  3. Dans la zone Chemin du symbole, la documentation indique de taper la commande suivante: SRV*your local folder for symbols*http://msdl.Microsoft.com/download/symbols, mais je viens de mettre dans le dossier local pour les symboles et cela a bien fonctionné.
  4. Quittez et ouvrez à nouveau WinDbg, puis ouvrez Crash Dump et recherchez le fichier de vidage créé par DebugDiag.
  5. Dans la ligne de commande, tapez .loadby sos clr
  6. Tapez maintenant !CLRStack

Dans les résultats, il devrait être clair quel est le problème (vous verrez probablement un tas de lignes montrant la ou les fonctions qui ont été appelées à plusieurs reprises).

67
MikeSmithDev

Quelques ajouts à la réponse ci-dessus. Développer l'extension Explorer qui a obtenu une erreur lors de la connexion de l'utilisateur. Ainsi, pour l'utilisateur, il ressemble à un "écran clignotant" (tandis qu'Explorer essaie de démarrer et de planter, puis de redémarrer, etc.). Connecté sous un autre compte utilisateur installé DebugDiag et WinDbg. J'utilise Windows 8.1 avec .Net 4.0 avec toutes les dernières mises à jour d'aujourd'hui (13 janvier 2014) J'ai essayé de télécharger quelques symboles localement, mais WinDbg ne peut pas charger clr.pdb en raison d'une signature incorrecte.

Résolu en utilisant des symboles en ligne - utilisez "SRV * http://msdl.Microsoft.com/download/symbols " comme chemin des symboles.

2
Arkady Marchenko

Une autre cause pourrait "fonctionner récursivement à l'infini". Lorsque se produit une boucle infitine, Windows essaie d'éviter un blocage et de désactiver le pool d'applications relâché.

J'ai rencontré le même problème aujourd'hui. J'ai une fonction récursive qui liste le projet parentproject-sub. Un projet est défini comme projet parent et lorsque la fonction récursive essaie de répertorier tous les projets parent-sous, une boucle infinie se produit.

0
Dreamcatcher

J'ai pu vérifier l'Observateur d'événements -> Journaux Windows -> Système et trouver

Le pool d'applications "DankAppPool" est automatiquement désactivé en raison d'une série d'échecs dans le (s) processus desservant ce pool d'applications.

En dessous de cela:

Un processus desservant le pool d'applications "DankAppPool" a subi une erreur de communication fatale avec le service d'activation de processus Windows. L'ID de processus était "5704". Le champ de données contient le numéro d'erreur.

Et:

Le service QueueMonitor s'est arrêté de manière inattendue. Il l'a fait 32 fois. L'action corrective suivante sera prise dans 60000 millisecondes: Redémarrez le service.

Au moins, le service QueueMonitor est un point de départ.

0
sirdank