Un crash di Windows (ovvero l'arresto dell'esecuzione del sistema e la visualizzazione della schermata blu) può verificarsi per diverse ragioni: un riferimento ad in indirizzo di memoria che causa una violazione di accesso, un'eccezione inattesa, un driver difettoso in modalità kernel e così via. E' importante capire che Windows potrebbe potrebbe continuare a funzionare anche in presenza di problemi seri, isolare l'errore e cercare di ripristinarsi in qualche modo: ma il problema individuato potrebbe essere causto da un errore ben più serio ed in profondità che potrebbe provocare ulteriori eccezioni durante lo svolgimento dell'elaborazione e che potrebbero, infine, portare alla corruzione dei dati nella memoria RAM o sul disco. Ovviamente, questo è inaccettabile, quindi Windows adotta una sorta di "politica di fallimento, sicuro e veloce" che consiste nell'arrestare l'esecuzione, impostare una modalità VGA a bassa risoluzione per il video, dipingere uno sfondo blu, scrivere in un file (il file di dump) lo stato della memoria e le informazioni sul crash e visualizzare un codice di stop contenente un messaggio ed alcune indicazioni per l'utente. "Blue Screen Of Death", "Bugcheck" e "Stop errors" sono parole differenti utilizzate per rappresentare lo stesso tipo di eccezione non gestita durante l'esecuzione in modalità kernel e che causa l'arresto del sistema (ed il possibile riavvio). La causa del problema può essere qualsiasi cosa da una fluttuazione nell'alimentazione del sistema ad un componente danneggiato o ad un bug software/hardware. In Windows 7 e nelle versioni precedenti, la BSOD ha il seguente aspetto
mentre nella Developer Preview di Windows 8 ha il seguente aspetto (un po' meno "spaventoso" del precedente)
E' interessante osservare la distribuzione dei bugcheck rispetto alle loro cause: il libro "Windows Internals, 5th Edition" riporta il seguente grafico che visualizza la distribuzione delle categorie degli errori in Windows Vista SP1 rilevate a Settembre 2008.
Blue screen: quando nel sistema si verifica un problema hardware, un'inconsistenza nei dati o qualcos'altro di simile, può essere visualizzata una schermata blu contenente informazioni che possono essere utilizzata per determinare la causa dell'errore. Queste informazioni comprendono il codice di STOP e l'indicazione della creazione del file di dump. Può anche comprendere una lista dei drivers caricati ed un trace dello stack. Crash dump file: è possibile configurare il sistema affinchè registri le informazioni in un file di dump del crash sul proprio hard disk ogni volta in cui viene generato un codice di STOP. Il file (denominato memory.dmp) contiene informazioni che il debugger può utilizzare per analizzare l'errore. Questo file può avere dimensioni pari al quantitativo di memoria fisica installata nel computer. Per impostazionie predefinita, il file viene registrato nella cartella Windows\Minidump. Debugger: un programma creato per individuare, trovare e correggere errori in un altro programma. Permette all'utente di avanzare all'interno del processo in esecuzione e dei suoi threads, monitorando la memoria, le variabili ed altri elementi del contesto del processo e del thread . Kernel mode: la modalità del processore in cui sono eseguiti i servizi di sistema ed i device drivers. In questa modalità sono disponibili tutte le interfacce e le istruzioni della CPU e l'intera memoria è accessibile. Minidump file: un minidump è una versione più piccola di un file di dump completo o della memoria del kernel. Solitamente Microsoft richiede che venga fornito il dump della memoria del kernel. Di contro, il debugger analizza un mini-dump e, molto probabilmente, fornisce le informazioni necessarie alla risoluzione del problema. Se il mini-dump è tutto quello che si ha a disposizione, meglio eseguirne il debug piuttosto che attendere un successivo crash del sistema: aprire il file nel debugger (vedere oltre) così come si aprirebbe memory.dmp a scopo di esempio. STOP code: il codice di errore che identifica l'errore che ha arrestato l'esecuzione del kernel del sistema. E' indicato dal primo insieme di valori esadecimali visualizzati nella schermata blu. Come minimo, gli amministratori dovrebbero annotare questo codice, gli altri quattro codici indicati in parentesi e qualsiasi altro driver identificato sullo schermo: spesso questo è tutto ciò di cui si ha bisogno. Symbol files: tutte le applicazioni di sistema, i drivers e le DLLs sono realizzate in maniera tale che le loro informazioni di debugging risiedano in file separati conosciuti come symbol files. Pertanto, il sistema è più piccolo è più veloce, ma ne può essere comunque eseguito il debug se si hanno a disposizione i symbol files. Non è necessario disporre in anticipo dei symbol files per eseguire il debug: il debugger scaricherà automaticamente quelli necessari dal sito pubblico di Microsoft.
Indipendentemente dal motivo alla base di un crash del sistema, la funzione che effettivamente esegue l'arresto è KeBugCheckEx, documentata nel Windows Driver Kit (WDK). Questa funzione riceve un codice di stop (chiamato anche bugcheck code) e quattro parametri che devono essere interpretati in base al codice di stop. Dopo aver mascherato tutti gli interrupt su tutti i processori del sistema, KeBugCheckEx commuta il display in una modalità grafica VGA a bassa risoluzione (implementata da tutte le schede video supportate da Windows), imposta uno sfondo blu e visualizza il codice di stop, seguito da testo descrittivo che fornisce indicazioni sul da farsi all'utente. Alla fine, KeBugCheckEx chiama tutte le funzioni di bugcheck callback registrate dai device drivers (registrate chiamando la funzione KeRegisterBugCheckCallback), consentendo ai drivers di arrestare i dispositivi da esssi controllati. Quindi inovca tutte le funzioni di reason callback (registrate chiamando la funzione KeRegisterBugCheckReasonCallback), che consento ai drivers di aggiungere dati al crash dump o di scrivere informazioni di crash dump ai devices sostitutivi. KeBugCheckEx visualizza la rappresentazione testuale del codice di stop vicino all'a parte superiore della schermata blu insieme con il codice di stop numerico e con i quattro parametri nella parte bassa dello schermo: la prima linea nella sezione Technical Information indica il codice di stop ed i quattro parametri addizionali passati alla funzione KeBugCheckEx; una linea di testo vicino alla parte alta dello schermo contiene l'equivalente testuale dell'identificatore numerico del codice di stop (a volte è perfino possibile che le strutture dati del sistema siano state corrotte in maniera tale da non consentire la visualizzazione delle schermata blu).
Esistono molti tipi diversi di errori di Stop: ognuno ha le sue possibili cause e richiede un preciso processo di risoluzione; quindi, il primo passo da compiere per risolvere un errore di Stop è identificarlo. Per iniziare è necessario disporre di alcune informazioni:
↑ Torna all'inizio
Il messaggio di Stop riporta informazioni relative all'errore di Stop ed assiste l'amministratore di sistema (che sa come interpretare l'informazione) nell'isolare ed eventualmente risolvere il problema che ha causato l'errore di Stop. Il messaggio di Stop fornisce un gran numero di informazioni utili, compreso il numero dell'errore di Stop, o codice di bugcheck. Il messaggio di Stop utilizza un modalità di visualizzazione a carattere a tutto schermo ed è composato da alcune sezioni principali, come mostrato in Figura 1, che visualizzano le seguenti informazioni:
La maggior parte delle moderene installazioni desktop di Windows è configurata per recuperare automaticamente i dump piccoli della memoria. Le impostazioni di generazione del file di dump possono essere configurate nella scheda "Avanzate" della finestra delle proprietà di sistema, come è possibile vedere in Figura 4.
La Tabella 1 riassume le differenti posizioni che Windows utilizza per memorizzare i file di dump della memoria (leggere anche l'articolo della Microsoft Knowledge Base KB254649 "Cenni preliminari sulle opzioni del file di immagine della memoria per Windows Vista, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows XP e Windows 2000").
Tipo di dump
Posizione predefinita (variabile)
Posizione predefinita (tipica)
Requisiti per il file di paging
Tabella 1: posizione e dimensione del file di dump della memoria.
Il primo passo è procurarsi i Debugging Tools necessari per eseguire l'ananisi dei file di dump prodotti dopo un crash di sistema. Le vecchie versioni dei Debugging Tools erano fornite come pacchetti di installazione standalone, scaricabili dal Microsoft Windows Hardware Dev Center, facendo attenzione a scaricare e ad installare la versione appropriata in base all'architettura del proprio sistema (32 bit o 64 bit); le versioni più recenti sono incluse nel Microsoft Windows SDK e nel Windows Driver Kit. Se si decide di installare il Windows SDK, assicurarsi di contrassegnare la casella che includerà i Debugging Tools nel processo di installazione, come è possibile vedere in Figura 5.
Dopo aver eseguito l'installazione, è necessario impostare il percorso dei simboli per assicurarsi che ve ne siano abbastanza a disposizione del debugger per capire cosa si è verificato e cosa era caricato in memoria. L'insieme completo dei simboli pubblicamente disponibili può essere scaricato su un disco locale, oppure si può specificare una posizione su Internet per scaricare i simboli quando richiesto. Il suggerimento è quello di scaricare i simboli da Internet: la versione corretta dei simboli sarà scaricata quando richiesto e non sarà resa obsoleta dall'installazione di hotfixes e service packs. L'articolo "Utilizzare Microsoft Symbol Server per ottenere i file di simboli di debug" (KB311503) della Microsoft Knowledge Base fornisce le istruzioni da seguire per utilizzare il Microsoft Symbol Server per ottenere i files contenenti i simboli di debug: semplicemente, si deve creare una cartella (per esempio, C:\Symbols) ed impostare la variabile di ambiente _NT_SYMBOL_PATH = srv*c:\Symbols*http://msdl.microsoft.com/download/symbols come è possibile vedere in Figura 6.
_NT_SYMBOL_PATH = srv*c:\Symbols*http://msdl.microsoft.com/download/symbols
Avviare WinDbg dal menu Start (la posizione esatta di WinDbg può variare in base alla propria versione di Windows) e selezionare File -> Open Crash Dump... (o premere CTRL+D): selezionare il file .DMP ed attendere che il debugger esegua le sue operazioni iniziali: vengono caricati i simboli del kernel ed il debugger visualizza alcune informazioni di base relative al sistema analizzato ed al bugcheck riportato, insieme all'indicazione del modulo probabile responsabile del crash di sistema.
Fatto ciò, è necessario ottenere informazioni dettagliate in merito all'ecezione o al bugcheck: nel pannello posto nella parte inferiore della finestra Command, digitare il comando "!analyze -v" e premere INVIO (l'opzione "-v" visualizza un output più dettagliato).
Come è possibile vedere, il sistema ha avuto un crash a causa di un bugcheck DRIVER_IRQL_NOT_LESS_OR_EQUAL, il cui codice di Stop è 0x000000D1. Il modulo malfunzionante sembra essere "e1k6232" (il nome del file di immagine è e1k6232.sys): digitiamo il comando "lm" con alcune opzioni aggiuntive ("v" attiva la visualizzazione di informazioni dettagliate, compreso il nome del file di simboli, il nome del file di immagine, informazioni sul checksum e sulla versione, data ed ora del file e l'indicazione relativa al fatto che il modulo contenga codice managed; "m" specifica un pattern che il nome del modulo deve soddisfare) come di seguito
e si possono ottenere maggiori informazioni sul modulo in questione. A questo punto, si procede ad eseguire una ricerca sul web (ad esempio, si può andare all'indirizzo http://systemexplorer.net/db/e1k6232.sys.html) e si scopre che "e1k6232.sys" è un driver che appartiene all'Intel Gigabit Adapter prodotto da Intel Corporation: in questo caso, potremmo risolvere il problema scaricando ed installando una versione aggiornata di questo driver (il file DMP usato nell'esempio proviene da un PC realmente affetto da questo problema e l'aggiornamento del driver lo ha effettivamente risolto). In base allo specifico errore può essere necessario eseguire ulteriori azioni. Per alcuni errori può essere richiesta l'abilitazione del Driver Verifier per determinare la causa alla radice del problema: questo steumento verifica che i driver non eseguano chiamate di funzioni non consentite o non causino la corruzione del sistema ed è in grado di identificare delle condizioni come la corruzione della memoria, l'errata gestione dei pacchetti di richiesta di I/O (IRPs), utilizzo non valido del buffer di accesso diretto alla memoria (DMA) e possibili deadlocks. L'estensione !verifier nel debugger del kernel può essere utilizzata per il monitoraggio e la produzione di report sulle statistiche relative al Driver Verifier nel contesto di una sessione di debugging.
Nelle sezioni seguenti, si illustreranno alcuni comuni casi di errrori di Stop e saranno fornite descrizioni ed informazioni utili per l'individuazione delle cause e la risoluzione di questi problemi.
Il messaggio di Stop 0xD1 indica che il sistema ha eseguito un tentativo di accesso alla memoria paginabile usando un valore troppo elevato di IRQL per un processo in modalità kernel. Questo errore è solitamente causato da drivers che hanno utilizzato indirizzi di memoria non validi. Questo messaggio di Stop ha quattro parametri:
I messaggi di Stop 0xD1 possono verificarsi in seguito all'installazione di drivers o servizi di sistema difettosi. Se viene indicato il nome di un driver, provare a disabilitarlo, rimuoverlo o ripristinarne una versione precedente per risolvere l'errore. Se la disabilitazione o la rimozionie dei driver risolve l'errore, informarsi presso il produttore del driver in merito alla disponibilità di un aggiornamento. L'utilizzo di software aggiornato è importante specialmente per i programmi di backup, applicazioni multimediali, scanners antivirus, riproduttori di DVD e strumenti di masterizzazzione di CD.
Questo articolo è disponibile anche nelle seguenti lingue:
Luigi Bruno edited Revision 16. Comment: Added a link in the "Libri" section of the "Vedere anche" section.
Luigi Bruno edited Revision 15. Comment: Added the "Messaggi di Stop più comuni" section.
Luigi Bruno edited Revision 14. Comment: Added two links in the "Pagine web su MSDN" list if the "Risorse della Community" section.
Luigi Bruno edited Revision 12. Comment: Added a link in the "Blogs" list of the "Vedere anche" section.
Luigi Bruno edited Revision 11. Comment: Added the "Italian Wiki Articles" tag to the tags list.
Luigi Bruno edited Revision 10. Comment: Added two links in the "Blogs" list of the "Risorse della Community" section.
Luigi Bruno edited Revision 9. Comment: Edited a link in the "Pagine web su MSDN" list of the "Risorse della Community" section.
Luigi Bruno edited Revision 8. Comment: Added content to the "Analizzare il file di dump del crash" section. Removed the "Work in progress" message template.
Luigi Bruno edited Revision 7. Comment: Edited the "Preparare l'ambiente" section.
Luigi Bruno edited Revision 6. Comment: Edited the "Recuperare il dump per un crash in modalità kernel" section.
Luigi Bruno edited Original. Comment: Edited the "Risorse della Community" section.
Luigi Bruno edited Revision 1. Comment: Edited the "Perchè si verifica un crash di Windows?" section.
Luigi Bruno edited Revision 2. Comment: Edited the "Terminologia di base" section.
Luigi Bruno edited Revision 3. Comment: Edited the "La schermata blu" section.
Luigi Bruno edited Revision 4. Comment: Edited the "Identificare lo Stop Error" section.
Luigi Bruno edited Revision 5. Comment: Edited the "Comprendere il messaggio di Stop" section.