J'exécute une application ASP.NET 4.0 sous IIS 7.5. Plusieurs fois par jour, notre pool d'applications se recycle de manière inattendue. Notre journal système affiche l'événement suivant lorsque cela se produit:
Un processus desservant le pool d'applications 'X' a subi une erreur de communication fatale avec le service d'activation de processus Windows. L'ID de processus était '5768'. Le champ de données contient le numéro d'erreur.
OR
Un processus desservant le pool d'applications 'X' n'a pas répondu à un ping. L'ID du processus était '1032'.
Presque toujours, il y a un événement correspondant exactement au même moment dans le journal des applications comme ceci:
Faulting application name: w3wp.exe, version: 7.5.7600.16385, time stamp: 0x4a5bcd2b
Faulting module name: clr.dll, version: 4.0.30319.269, time stamp: 0x4ee9ae83
Exception code: 0xc00000fd
Fault offset: 0x00001916
Faulting process id: 0x508
Faulting application start time: 0x01cd4d8958ecf9ad
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: 8dcc413b-b98a-11e1-8075-001c23d6d910
J'ai donc installé IIS Debugging Tools et mis en place une règle de plantage, spécifié "Un spécifique IIS pool d'applications Web", pas de journalisation pour les exceptions de première chance, et rien sous " Paramètres avancés "(exceptions, points d'arrêt, événements).
J'exécute également (simultanément) ADPlus à partir des outils de débogage Windows avec la ligne de commande suivante:
adplus -crash -pn w3wp.exe -NoDumpOnFirst -o c:\logs
Cependant, depuis que j'ai attaché les débogueurs, j'ai reçu plusieurs messages de niveau "avertissement" dans le journal système (ceux concernant le "Process servant le pool d'applications" X "ont subi une erreur de communication fatale ..."), mais je Je n'obtiens plus l'événement correspondant au niveau d'erreur dans le journal des applications.
La seule chose que j'ai pu obtenir est la suivante (il y en avait environ 50):
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 3300. Exit code - 0x800703e9
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 4992. Exit code - 0x800703e9
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 5456. Exit code - 0x800703e9
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 4924. Exit code - 0x800703e9
Le code de sortie 0x800703e9 indique un débordement de pile quelque part, ce qui est heureux car cela devrait être facile à corriger une fois que je pourrai le trouver.
Cependant, pour ce faire, j'ai besoin de plus d'informations de mes vidages sur incident afin de pouvoir les ouvrir avec WinDbg et utiliser la commande "! Clrstack" pour localiser mon problème.
Ma question est: Les outils de débogage sont-ils configurés de manière incorrecte ou ai-je mal compris les journaux des événements? Il semble que notre pool d'applications soit recyclé chaque fois que je vois l'événement dans le journal système concernant "l'erreur de communication fatale avec le service d'activation des processus Windows", mais je ne reçois aucune information de vidage sur incident de IIS Outils de débogage ou ADPlus lorsque ces événements se produisent. Et pour une raison quelconque, depuis que j'ai attaché les débogueurs, je ne reçois plus d'événements "Erreur" dans le journal des applications qui correspondent à mes événements d'avertissement du journal système. Je ne sais pas pourquoi. J'ai en quelque sorte besoin d'obtenir le vidage sur incident complet avec des informations CLR afin que je puisse comprendre où est mon problème.
La seule autre chose que je peux penser à mentionner est que le service de rapport d'erreurs Windows n'est pas en cours d'exécution. Je ne sais pas si cela doit être ou non.
Merci pour toute aide.
Le code d'exception que vous obteniez dans le journal des applications et le code de sortie du thread indiquent que vous avez un dépassement de pile. Cependant, il est curieux de savoir pourquoi le processus ne se bloque pas lorsque le thread se termine avec une erreur de dépassement de pile. Quoi qu'il en soit, pour activer l'exception de dépassement de pile en cas de débordement, la commande est la suivante:
sxe sov
Veuillez noter que vous devrez utiliser la version x86 du débogueur dans votre cas, car votre pool d'applications est configuré en tant que processus 32 bits.