Risolvere un arresto anomalo del processo in un pool di applicazioni IIS

Questo articolo consente di identificare una terminazione del processo (nota più comunemente come arresto anomalo del processo) e fornisce metodi per raccogliere e analizzare i dati per l'arresto anomalo.

Identificare un arresto anomalo del processo

Per identificare che si verifica un arresto anomalo del processo, seguire questa procedura:

  1. Nel server interessato selezionare Win+R sulla tastiera per aprire la finestra di dialogo Esegui.
  2. Digitare eventvwr e selezionare Invio per aprire l'applicazione Visualizzatore eventi.
  3. In Visualizzatore eventi, sul lato sinistro espandere la cartella Log di Windows e quindi selezionare il registro eventi di sistema.
  4. Nel registro eventi di sistema è possibile scegliere di filtrare il log in modo che mostri solo i log di origine del servizio di attivazione dei processi di Windows (WAS). Il tipo di evento è Warning e l'IDevento è 5011.

Se si verifica un evento con le caratteristiche precedenti, indica un arresto anomalo del processo. La formulazione per l'evento potrebbe essere simile alla seguente:

A process serving application pool <name of the application pool> suffered a fatal communication error with the Windows Process Activation Service. The process id was '<id of process>'. The data field contains the error number..

Raccogliere i punti chiave seguenti:

  • Nome del pool di applicazioni
  • Timestamp dell'evento (annotare il fuso orario in cui si trova il computer)

Nota

  • Questi passaggi non consentono di identificare il tipo di arresto anomalo, ma quando si è verificato un arresto anomalo.
  • Se il pool di applicazioni contiene più applicazioni, una di queste applicazioni potrebbe essere la causa dell'arresto anomalo. È consigliabile separare ogni applicazione nel proprio pool di applicazioni in modo da poter limitare l'impatto a una sola applicazione.

Identificare la causa dell'arresto anomalo

Dopo aver verificato che si è verificato un arresto anomalo, seguire questa procedura per determinare cosa ha causato l'arresto anomalo dell'applicazione:

  1. Nel server interessato selezionare Win+R sulla tastiera per aprire la finestra di dialogo Esegui.
  2. Digitare eventvwr e selezionare Invio per aprire l'applicazione Visualizzatore eventi.
  3. Nel registro eventi dell'applicazione è possibile individuare gli eventi con l'etichetta Source etichettata come Errore dell'applicazione. Il tipo di evento è Error e l'ID evento è 1000.

Dalle informazioni raccolte, si dovrebbe avere un'idea di ciò che potrebbe aver causato l'arresto anomalo.

Prendere nota dei campi seguenti:

  • Applicazione con errori: nel contesto di IIS, l'applicazione che si desidera cercare è il processo di lavoro IIS w3wp.exe.

  • Nome del modulo con errori: quando si verifica un arresto anomalo, il nome del modulo di errore potrebbe essere Librerie a collegamento dinamico Microsoft (DLL). Tuttavia, in genere non sono la causa radice dell'arresto anomalo.

  • Codice eccezione: il codice di eccezione fornisce informazioni dettagliate su ciò che l'errore potrebbe essere. I codici comuni includono:

    Codice eccezione Descrizione
    0xC0000005 Questo codice, noto anche come Violazione di accesso (è possibile che vengano visualizzate DLL native, ad esempio ntdll.dll o msvcrt.dll nel messaggio di errore), indica che l'applicazione ha tentato di accedere a una posizione di memoria non consentita.
    0xe0434352 Questo codice indica un'eccezione CLR (Common Language Runtime) non gestita. Significa che si è verificata un'eccezione .NET in un punto qualsiasi del codice dell'applicazione.

    Se si verifica l'eccezione, cercare gli eventi del runtime .NET di origine e con ID 1026.

    Se si trovano eventi dall'origine runtime .NET, prendere nota dei dettagli nella scheda Generale dell'evento, nella Descrizione e nei campi Informazioni eccezione (quest'ultimo contiene sia l'eccezione che uno stack di chiamate).
    0xC00000fd Questo codice indica che il codice ha subito un overflow dello stack. Se si tratta dell'errore visualizzato, un elemento nel codice dell'applicazione si trova in una situazione di ricorsione infinita (noto anche come ciclo infinito).

Raccolta dei dati

Per determinare se è necessario un dump della memoria, iniziare con la funzionalità Segnalazione errori Windows(WER) che raccoglie automaticamente le informazioni. Controllare i registri eventi correlati a WER per verificare se le informazioni fornite sono sufficienti per risolvere il problema. Se le informazioni sono sufficienti, non sono necessari dump di memoria aggiuntivi. In caso contrario, usare lo strumento di diagnostica di debug o ProcDump per raccogliere i dump di arresto anomalo del sistema, come descritto nella sezione successiva.

Strumento di diagnostica di debug

Per eseguire dump di arresto anomalo del sistema tramite lo strumento di diagnostica di debug, seguire questa procedura:

  1. Scaricare e installare Lo strumento di diagnostica di debug.

  2. Aprire l'applicazione DebugDiag 2 Collection e selezionare Aggiungi arresto anomalo regola>>Avanti.

  3. Selezionare Un pool>di applicazioni Web IIS specifico Avanti.

    Nota

    È consigliabile evitare di usare qualsiasi altra delle opzioni disponibili (considerarle solo come ultima risorsa).

  4. Selezionare il pool di applicazioni che si arresta in modo anomalo (è possibile ottenere il nome del pool di applicazioni nella sezione Identificare un arresto anomalo del processo) e selezionare Avanti.

  5. Selezionare Punti di interruzione in Impostazioni avanzate. Non modificare altre opzioni in questa finestra e mantenerle con i valori predefiniti.

  6. Nella finestra Configura punti di interruzione selezionare Aggiungi punto di interruzione.

  7. Selezionare la prima riga che legge Ntdll!ZwTerminateProcess. Selezionare quindi Userdump completo nell'elenco a discesa Tipo di azione e impostare un valore compreso tra 3 e 5 nel campo Limite azioni. Al termine, selezionare OK.

    Screenshot della finestra Configura punto di interruzione.

  8. In questa fase è stato creato correttamente un trigger per quando vengono generati i dump. Selezionare Salva e chiudi.

    Screenshot di Save&Close nella finestra Configura punto di interruzione.

  9. Nella finestra Configurazione avanzata (facoltativo) selezionare Avanti per passare al passaggio successivo della procedura guidata.

  10. Nella finestra Seleziona percorso dump e nome regola (facoltativo) specificare il percorso in cui salvare i dump. Al termine, selezionare Avanti.

    Screenshot della finestra Seleziona percorso dump e nome regola (facoltativo).

    Nota

    • È consigliabile usare un percorso in un'unità per salvare i dump diversi dall'unità di sistema.
    • Assicurarsi che l'unità disponga di spazio sufficiente per contenere il dump della memoria per il processo.
  11. Mantenere l'impostazione predefinita Attiva la regola ora e selezionare Fine quando si è pronti.

  12. Riprodurre il problema e monitorare la colonna Userdump Count . Dopo aver generato i dump della memoria, è possibile disattivare la regola.

    Screenshot della colonna Userdump Count.

ProcDump

ProcDump è un modo più semplice per eseguire un dump della memoria di un processo. Per eseguire dump di arresto anomalo con ProcDump, seguire questa procedura:

  1. Scaricare ProcDump.

  2. Estrarre Procdump in una cartella all'interno del server interessato. Assicurarsi che la cartella si trova in un'unità diversa dall'unità di sistema per evitare alcun impatto sull'unità di sistema.

  3. Aprire la finestra del prompt dei comandi come amministratore e impostare la directory di lavoro del prompt sulla directory nel passaggio 2.

  4. Per ottenere PID, seguire questa procedura:

    1. Apri Gestione IIS.
    2. Selezionare il nome del server (a sinistra).
    3. Fare doppio clic su Processi di lavoro. Prendere nota del valore PID per il processo di lavoro che si vuole risolvere.
  5. Con il valore PID in mano e l'eccezione trovata nella sezione Identificare un arresto anomalo del processo, digitare il comando seguente nella finestra del prompt dei comandi amministrativo:

    procdump -ma -e 1 -f "<typeOfException>" PID
    
    • -ma: questo flag specifica che deve essere acquisito un dump completo della memoria.
    • -e 1: questo flag indica che il dump deve essere acquisito alla prima occorrenza di un'eccezione.
    • -f "<typeOfException>": questo flag specifica che lo strumento deve filtrare per il <typeOfException> tipo di eccezione.
    • PID: ID processo dell'applicazione da monitorare.

Se il codice di errore è C00000FDe non è possibile eseguire un dump della memoria, seguire questa procedura:

  1. Scaricare ProcDump.

  2. Estrarre Procdump in una cartella all'interno del server interessato. Assicurarsi che la cartella si trova in un'unità diversa dall'unità di sistema per evitare alcun impatto sull'unità di sistema.

  3. Aprire la finestra del prompt dei comandi come amministratore e impostare la directory di lavoro del prompt sulla directory nel passaggio 2.

  4. Eseguire il comando seguente per configurare ProcDump per salvare automaticamente i dump di memoria in una directory specificata:

    L'unità nel comando seguente è solo un esempio ed è necessario cercare di assicurarsi che i dump non vengano scritti in un'unità di sistema.

    Procdump -ma -i Z:\Dumps 
    
  5. Riprodurre il problema durante il monitoraggio della cartella per i dump.

  6. Non appena hai un dump per il processo w3wp di destinazione, esegui il comando seguente per disinstallare procdump come debugger postmortem.

    Procdump -u 
    

Segnalazione errori Windows

Segnalazione errori Windows è una funzionalità predefinita di Windows progettata per raccogliere informazioni sui problemi che Windows può rilevare, ad esempio errori dell'applicazione, errori del kernel e applicazioni che non rispondono e segnalare queste informazioni a Microsoft.

Per eseguire dump di arresto anomalo tramite Segnalazione errori Windows, seguire questa procedura:

  1. Aprire Visualizzatore eventi e cercare Segnalazione errori Windows eventi.

  2. Controllare le directory indicate negli eventi Segnalazione errori Windows.

  3. Individuare i file con estensione .mdmp (mini dump) o .hdmp (dump heap) nelle directory indicate.

    • Se si dispone di questi file di dump, specificarli al supporto Tecnico Microsoft se si crea un ticket di supporto.

    • Se non sono disponibili, seguire questa procedura per configurare la risoluzione dei problemi:

      1. Aprire l'Editor del Registro di sistema di Windows (regedit.exe) e individuare la chiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Segnalazione errori Windows\LocalDumps. Se questa chiave non è disponibile, crearla.

      2. Nella chiave del passaggio a creare i valori seguenti:

        Nome Tipo Valore da immettere
        DumpFolder Valore stringa espandibile (REG_EXPAND_SZ) Percorso di un percorso in cui si desidera che i file (ad esempio: D:\Dumps)
        Nota: assicurarsi che l'unità usata non sia un'unità di sistema e che disponga di spazio sufficiente per contenere un dump di memoria dell'applicazione.
        DumpCount DWORD (REG_DWORD) 3
        DumpType DWORD (REG_DWORD) 2 (l'uso di questo valore può generare un dump completo).

        Per altre informazioni sui valori possibili, vedere Raccolta di dump in modalità utente.

Come eseguire l'analisi dei dati

Per eseguire l'analisi per l'arresto anomalo, seguire questa procedura:

  1. Scaricare e installare DebugDiag (in breve per Strumento di diagnostica di debug).
  2. Aprire DebugDiag2 Analysis e selezionare Aggiungi file di dati.
  3. Nella finestra di dialogo selezione file elenca solo i file dump con estensione *.dmp . Selezionare il file di dump da analizzare.
  4. Dopo aver caricato il file desiderato, selezionare Avvia analisi.

Una volta completata l'analisi, viene visualizzato un file con estensione mht caricato nel browser. L'esempio seguente proviene da un dump nel Blocco note per visualizzare l'aspetto finale del report di analisi.

Screenshot di DebugDiag Analysis Report.

Riepilogo dell'analisi e dettagli del report

0xC00000fd

Questo errore indica in genere che il codice esegue un ciclo di ordinamento e chiama la stessa funzione (o gruppo di funzioni) fino a quando non esaurisce lo stack.

Di seguito è riportato un esempio di errore di overflow dello stack:

Screenshot di un riepilogo degli errori di overflow dello stack.

Screenshot di un dettaglio del report degli errori di overflow dello stack.

Nel report cercare gruppi di funzioni o metodi che sembrano ripetersi. Da qui, provare a correlare tali funzioni con il codice.

0xC0000005

Questo errore indica in genere un componente dell'applicazione che ha tentato di eseguire un accesso non valido alla memoria, causando una violazione di accesso.

Viene visualizzato il riepilogo seguente e i dettagli del report:

Screenshot di un riepilogo delle violazioni di accesso.

Screenshot di un report di violazione di accesso.

Nel report individuare lo stack di chiamate con errori e identificare il codice all'interno dello stack di chiamate presentato.

0xe0434352

Questa eccezione viene generata dall'applicazione, quindi il modo migliore consiste nell'eseguire il dump della memoria tramite il report e identificare lo stack di chiamate che restituisce l'errore.

Screenshot del riepilogo delle eccezioni di seconda mano di .NET.

Screenshot dei dettagli del report delle eccezioni di seconda mano di .NET.