2009-04-28 10 views
7

Per favore fatemi sapere quali passi devo seguire quando la mia applicazione si blocca e si chiude mostrando la finestra di dialogo contenente i pulsanti "Non inviare" e "Invia segnalazione errori".Come identificare il problema quando il programma si arresta in modo anomalo senza mostrare errori?

Cosa posso fare se non guardare il Visualizzatore eventi per risolvere questo?

Grazie

+0

Questo è fondamentalmente solo chiedendo, "Cosa posso fare per fermare il mio programma da arresto anomalo?". E la risposta è "aggiustalo!". Per quanto riguarda come, guarda i crash log e usa il tuo debugger. –

risposta

11
  1. si potrebbe aggiungere un costrutto try/catch/finally intorno al vostro Main() corpo del metodo di ingresso.

  2. Per WinForms, è possibile aggiungere un gestore ThreadException, poco prima Application.Run(), per catturare le eccezioni sollevate nei gestori di eventi WinForms UI:

    Application.ThreadException += 
        new ThreadExceptionEventHandler(Application_ThreadException); 
    
  3. Tutte le altre eccezioni non gestite possono essere catturati utilizzando:

    AppDomain.CurrentDomain.UnhandledException += 
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
    

    Ma vale la pena ricordare che questo consente solo di registrare/segnalare l'eccezione - non si può impedire l'applicazione di chiudere una volta che si esce da questo gestore finale.

  4. Visual Studio può anche essere configurato su break on first chance exceptions e debugger esterni (come WinDbg con estensioni SoS gestite) possono anche rilevare eccezioni di prima scelta (http://www.codeproject.com/KB/debug/windbg_part1.aspx).

Inoltre, utilizzare un quadro di registrazione come log4net per aggiungere la registrazione utile per la vostra applicazione e scaricare le informazioni eccezione prima della chiusura dell'applicazione.

2

chiedere agli utenti se sono in grado di riprodurre l'errore e come. Se riesci a riprodurre l'errore, esegui in debug in Visual Studio e segui i passaggi per causare l'arresto anomalo. Visual Studio entrerà in modalità di debug in cui rileva l'errore. Form lì sarete in grado di seguire la traccia dello stack e vedere quale codice sta causando l'errore. Visual Studio rende il debug abbastanza facile la maggior parte del tempo.

2

Idealmente si dovrebbe usare una libreria di logging come nLog o log4net per registrare eventuali eccezioni non gestite ed eccezioni in generale, registrandole nel proprio codice quando si verificano.

Può anche aiutare ad avere diversi livelli di registrazione nell'applicazione per aiutarti a rintracciare un problema quando non è in esecuzione sul tuo computer di sviluppo. Con nLog puoi lasciare il log nel tuo codice di produzione e abilitare/disabilitare l'output del log attraverso l'uso di un file di configurazione di logging.

Non ho usato log4net quindi non so se ha una funzionalità simile.

+0

Log4Net offre lo stesso, in genere la granularità della registrazione è almeno di livello di classe e quindi è possibile decidere di utilizzare il registro di debug solo per questa classe. Il livello del registro può anche essere modificato mentre l'app è in esecuzione. – weismat

1

Gli errori "invia/non inviare" tendono ad accadere quando si ha un'eccezione non gestita in un thread in background (il thread principale mostrerà che continuare/uscire dalla finestra di dialogo .NET con una traccia dello stack).

Aggiungi un gestore di eccezioni per la funzione del tuo thread e accedere da qui:

void RunMyThread() 
{ 
    try 
    { 
     // background thread code 
    } 
    catch (Exception ex) 
    { 
     // Log the exception 
    } 
} 

Questo è altamente semplificata, e non può essere come si desidera gestire un'eccezione. Ma spero che questo ti sposterà nella giusta direzione.

0

Utilizzare WinDBG per eseguire il debug del problema. Si può rendere pausa (come in sosta su un punto di interruzione) quando viene generata un'eccezione, e quindi esaminare la stacktrace ... oggetti in ambito etc ...

0

Se accade in un sito cliente e non è facilmente riproducibile all'interno di un debugger di sviluppatori, è possibile eseguire il debug post mortem. Mi piace usare Userdump per raccogliere un file di immagine della memoria (.DMP). Quindi uso windbg per l'analisi.

Problemi correlati