Windows Server e Client - Come creare un dump manuale

Durante alcune specifiche problematiche, come ad esempio una condizione di freeze della macchina, potrebbe essere necessario forzare un dump manuale del server.

In generale, potrebbe essere necessario ricorrere all’utilizzo di questa procedura in tutti quei casi in cui è richiesta un’analisi avanzata dei contenuti della memoria, allo scopo di capire lo stato interno del sistema operativo.

Per maggiori dettagli sui BSOD (Blue Screen Of Death), o sulle differenti tipologie di dump configurabili, vi rimando al mio articolo BSOD - Blue Screen of Death, di cosa si tratta?

In generale, potrebbe essere necessario ricorrere all’utilizzo di questa procedura in tutti qui casi in cui è richiesta un’analisi avanzata della memoria.

Esistono differenti metodi per generare un memory dump di una macchina:

  • Tastiera (PS2/USB)
  • Non Maskerable Interrupt (NMI)
  • NotMyFault.exe

Tutte queste metodologie portano ad un reboot della macchina. Vedremo in un prossimo articolo, come sia possibile prelevare un dump manuale della macchina durante una sessione di live di debugging, ma tuttavia questa tipologia di raccolta dump, dal punto di vista dell’analisi, ha delle limitazioni a causa di alcune strutture di memoria che vengono interrotte.

Sostanzialmente le configurazioni su sistemi operativi Microsoft Windows 2000/2003/2003 R2/XP e 2008/Vista/2008 R2/7, non sono differenti.

Tuttavia, a partire da Windows Server 2008/Vista, sono state introdotte alcune feature che possono agevolare la creazione del dump dal punto di vista dei prerequisiti (Verificare la sezione prerequisiti dell’articolo BSOD - Blue Screen of Death, di cosa si tratta?)

Vediamo, dunque, di entrare nel dettaglio per ciascuna delle metodologie elencate in precedenza.

Tastiera (PS2/USB)

Attraverso questa impostazione, saremo in grado di forzare il blue screen della macchina attraverso un combinazione di tasti digitata da tastiera.
Occorrerà impostare una chiave di registri, che varia a seconda che la tastiera sia PS2 o USB:

  • Tastiera PS2 =
    Individuare la chiave di registro: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters
    Creare un nuovo valore REG_DWORD con il nome CrashOnCtrlScroll ed impostarlo a 1.
    Sarà necessario un riavvio del server, per rendere valida la modifica effettuata.
    In seguito al reboot, sarà possibile forzare il blue screen della macchina attraverso la combinazione di tasti: tenere premuto CTRL (quello di destra) + premere 2 volte SCROLL LOCK.

  • Tastiera USB =
    Per Windows Server 2008 Service Pack 1 o Windows Vista Service Pack 1, affinchè sia possibile forzare un dump manuale attraverso un tastiera USB, è necessario che venga installato il seguente aggiornamento:

    A hotfix is available to enable CrashOnCtrlScroll support for a USB keyboard on a computer that is running Windows Vista SP1 or Windows Server 2008
    http://support.microsoft.com/kb/971284/en-us

    Individuare la chiave di registro: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters
    Creare un nuovo valore REG_DWORD con il nome CrashOnCtrlScroll ed impostarlo a 1.
    In questo caso non è necessario il riavvio del server, basterà scollegare e riattaccare nuovamente la tastiera USB.
    Anche in questo caso, sarà possibile forzare il blue screen della macchina attraverso la combinazione di tasti: tenere premuto CTRL (quello di destra) + premere 2 volte SCROLL LOCK.

In entrambi i casi il sistema chiamerà la funzione KeBugCheck, specificando il bugcheck 0x000000E2 (MANUALLY_INITIATED_CRASH).
Eventualmente è possibile cambiare la combinazione di tasti che si vuole utilizzare per la creazione del dump. La procedura è identica in entrambi i casi USB e PS2, a patto di usare le rispettive chiavi di registro indicate in precedenza al di sotto delle quali andrà creata la key crashdump, all’interno della quale andranno creati i valori REG_DWORD Dump1Keys e Dump2Key. In questo caso occorrerà rimuovere o impostare a zero CrashOnCtrlScroll.
Queste le due chiavi che andranno create:

  • PS/2 =
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump
  • USB:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\crashdump

Dump1Keys rappresenta il primo valore utilizzato nella sequenza di tasti,  e può essere valorizzato attraverso la seguente tabella:

Value

First key used in the keyboard shortcut sequence

0x01

Rightmost SHIFT key

0x02

Rightmost CTRL key

0x04

Rightmost ALT key

0x10

Leftmost SHIFT key

0x20

Leftmost CTRL key

0x40

Leftmost ALT key

E’ anche possibile combinare questi valori. Ad esempio, il valore 0x11 corrisponderà alla pressione simultanea di dello SHIFT di destra e di quello di sinistra.
Dump2Key rappresenta il secondo tasto della combinazione. Può essere specificato attraverso l’indice nella tabella scancode che specifica il layout della tastiera:

const UCHAR keyToScanTbl[134] = {
0x00,0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0C,0x0D,0x7D,0x0E,0x0F,0x10,0x11,0x12,
0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x00,
0x3A,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x2B,0x1C,0x2A,0x00,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x73,0x36,0x1D,0x00,
0x38,0x39,0xB8,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xD2,0xD3,0x00,0x00,0xCB,
0xC7,0xCF,0x00,0xC8,0xD0,0xC9,0xD1,0x00,0x00,0xCD,
0x45,0x47,0x4B,0x4F,0x00,0xB5,0x48,0x4C,0x50,0x52,
0x37,0x49,0x4D,0x51,0x53,0x4A,0x4E,0x00,0x9C,0x00,
0x01,0x00,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,
0x43,0x44,0x57,0x58,0x00,0x46,0x00,0x00,0x00,0x00,
0x00,0x7B,0x79,0x70 };

La tabella per la corrispondenza tra l’index della tabella e il tasto, può essere trovato al seguente link:
http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc

Ad esempio, impostando le seguenti chiavi per una tastiera PS/2:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump\Dump1Keys = 0x10
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump\Dump2Key = 0x02

Otterremo il dump attraverso la combinazione di tasti: Tenere premuto SHIFT di sinistra + due volte 1

Per ulteriori dettagli su questo metodo di creazione del dump, è possibile far riferimento al seguente articolo:

Forcing a System Crash from the Keyboard
http://msdn.microsoft.com/en-us/library/ff545499.aspx

Non Maskerable Interrupt (NMI)

In alcuni casi, la forzatura di un system crash da tastiera potrebbe non funzionare se la macchina ha smesso di respondere ad un elevato IRQL (Interrupt request level).
L'IRQL definisce la priorità a cui il processore sta operando, maggiori informazioni sono disponibili nel seguente articolo: Scheduling, Thread Context, and IRQL
Un "Non Maskerable Interrupt", abbreviato con NMI, è un particolare tipo di segnale di interrupt che non può essere ignorato ("mascherato") dalla CPU e che dunque potrebbe fare al caso nostro in tutte quelle circostanze in cui non sia possibile prendere un dump manuale attraverso la tastiera.

  • Individuare la chiave di registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl
  • Creare un nuovo valore REG_DWORD con il nome NMICrashDump ed impostarlo a 1
  • Riavviare il computer
  • Attivare l'opzione NMI nel BIOS o tramite l'interfaccia Web integrata luci out (iLO). Per la procedura esatta, vedere il manuale di riferimento BIOS o contattare il fornitore dell'hardware.

In questo caso, il bugcheck che otterremo sarà 0x00000080 (HARDWARE_MALFUNCTION).
Per ulteriori dettagli su questo metodo di creazione del dump, è possibile far riferimento al seguente articolo:

How to generate a complete crash dump file or a kernel crash dump file by using an NMI on a Windows-based system
http://support.microsoft.com/kb/927069/en-us

NotMyFault.exe

NotMyFault.exe è una delle applicazioni SysInternals, disponibile al seguente link:

http://download.sysinternals.com/Files/Notmyfault.zip

Per ottenere il blue screen:

  • Aprire un command prompt con diritti amministrativi e posizionarsi nella cartella in cui è contenuto il tool.
  • Digitare il comando NotMyfault.exe /crash e premere INVIO.

Trattandosi di un applicativo, naturalmente, questa metodologia di raccolta manuale va bene solo in quei casi in cui la macchina non sia completamente bloccata.
Tuttavia, non richiedendo configurazioni particolare a livello di registry o eventuali reboot della macchina, risulta il metodo più veloce per prendere un dump in tutti quei in cui non siamo in presenza di un freeze completo della macchina.
Attraverso questo metodo verrà generato un dump con bugcheck 0x000000D1 (IRQL_NOT_LESS_OR_EQUAL).

Conclusioni

Come abbiamo visto nei precedenti paragrafi, ci sono differenti metodologie per raccogliere un dump manuale di una macchina. Non esiste a priori un metodo migliore di un altro ma, essendo la scelta dettata da una serie di fattori come la natura della problematica e la configurazione del server, occorrerà effettuare le opportune valutazioni sulla base dello scenario che stiamo affrontando.

Mattia Tocco
Support Escalation Engineer
Microsoft Enterprise Platform Support