Come faccio a prendere un buon crash dump per .NET?

Ho catturato un crash dump della mia applicazione .NET a 32 bit in esecuzione su un sistema operativo Windows a 64 bit. Durante l’analisi qualcuno ha scoperto che ho una discarica a 64 bit e mi ha detto che non è ansible analizzare questa discarica a causa di una ctriggers testimonianza.

Quando si utilizza Task Manager di Windows per creare il dump, non ero consapevole del fatto che stavo facendo qualcosa di sbagliato. Questo ha sempre funzionato per i sistemi operativi a 32 bit.

Come posso fare un buon dump per .NET, specialmente con il corretto bitness?

Perché il testimone è rilevante qui?

Il testimone è importante per le applicazioni .NET per i seguenti motivi:

  • è necessaria una libreria DAC (data access control) (mscordakwks.dll) del corretto bitness. Non è disponibile un DAC cross-bitness.
  • il debugger deve essere in grado di caricare l’estensione di debug di SOS del corretto bitness

Non è ansible convertire un dump da 64 bit a 32 bit, anche se in teoria dovrebbe contenere tutte le informazioni necessarie.

Se ti senti fortunato, puoi comunque provare alcune delle istruzioni

  • Come utilizzare Windbg per eseguire il debug di un dump di un’app .NET a 32 bit in esecuzione su una macchina x64

Come rilevare il testimone di un’applicazione?

Se non conosci il testimone, puoi scoprirlo in questo modo:

Task Manager di Windows 7 mostra *32 sui processi: Task Manager di Windows 7

Nel task manager di Windows 8, vai alla scheda Details e aggiungi una colonna denominata Platform : Task Manager di Windows 8

Visual Studio mostra il testimone durante il collegamento al processo: Bitness in Visual Studio

Process Explorer può essere configurato per mostrare la colonna del Image Type : Bitness in Process Explorer

Utensili

Programmi che rilevano automaticamente i bitness:

  • Process Explorer
  • ProcDump
  • Microsoft Visual Studio
  • Segnalazione errori di Windows LocalDumps

Strumenti che catturano una discarica con un testimone specifico:

  • 64 bit: Task Manager predefinito su un SO a 64 bit
  • 32 Bit: Task Manager eseguito da% windir% \ SysWOW64 \ taskmgr.exe su un sistema operativo a 64 bit
  • 64 bit: ProcDump viene eseguito con l’ opzione della riga di comando -64
  • 32 bit: versione x86 di WinDbg
  • 64 bit: versione x64 di WinDbg
  • 32 bit: versione x86 di DebugDiag
  • 64 bit: versione di debugDiag x64
  • 32 bit: versione ADPlus x86
  • 64 bit: versione ADPlus x64

Basta scegliere il testimone in base alla propria applicazione, non secondo il sistema operativo.

Perché la memoria è rilevante qui?

Per .NET è necessario un dump di memoria completo, altrimenti non è ansible capire il contenuto degli oggetti. Per includere la memoria completa, effettuare le seguenti operazioni:

  • in WinDbg, specifica /ma quando fai .dump
  • in Process Explorer , scegli “Crea pieno dump” (anche se tecnicamente, il risultato è ancora un minidump)
  • in ProcDump , applicare l’ opzione della riga di comando -ma
  • in Visual Studio, scegli “Minidump con heap”
  • Task Manager creerà sempre un dump con memoria piena
  • Per Segnalazione errori di Windows, LocalDumps imposta DumpType su 2

Istruzioni di Visual Studio

Ho scoperto che molti sviluppatori non sono nemmeno a conoscenza del fatto che Visual Studio può creare dump. La ragione probabilmente è che il menu è invisibile per molto tempo. Questi sono i passaggi:

  • Avvia Visual Studio: il menu è invisibile
  • Albind a un processo: il menu è ancora invisibile
  • Break: il menu diventa visibile (trovalo in Debug / Salva dump as)

Perché dump a 64 bit di applicazioni a 32 bit?

Probabilmente solo per il debug del layer WoW64 stesso.