2012-08-25 12 views
7

Qual è la differenza tra la modalità di rilascio e la modalità di debug?Perché la mia applicazione si arresta in modo anomalo in modalità di rilascio ma non in modalità di debug?

E come posso eseguire il debug in modalità di rilascio per vedere cosa non funziona?

class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     try 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainWindow()); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Main : "+ex.Message, typeof(Program)); 
      MessageBox.Show(ex.Message + ex.StackTrace); 
      Environment.Exit(1); 
     } 
    } 
} 

risposta

7

La clausola di cattura nello snippet non catturerà mai nulla nella versione di spedizione della tua app. È fa funziona quando lo si esegue con un debugger allegato.

Quello che ti manca è il modo in cui si applica Application.ThreadException. L'evento si attiva ogni volta che viene rilevata un'eccezione non gestita. Questa funzionalità tuttavia è non attivata quando si esegue il debug del codice. Nessun gestore di eccezioni è installato per aumentare l'evento. Questo è stato fatto in modo da avere un modo decente di eseguire il debug delle eccezioni non gestite. Il tuo codice cambia questo comportamento, adesso è un blocco try attivo, il tuo gestore catch ottiene l'eccezione.

Per fare in modo che il codice si comporti nello stesso modo, è necessario modificare la strategia di gestione delle eccezioni non gestita. In questo modo:

[STAThread] 
    static void Main() { 
     try { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
      Application.Run(new Form1()); 
     } 
     catch (Exception ex) { 
      // etc.. 
     } 
    } 

Ora la tua clausola di cattura attirerà sempre l'eccezione. Finché viene generato nel thread principale, non rileverà eccezioni generate nei thread worker. Considerate questo codice invece per la gestione unificata:

[STAThread] 
    static void Main() { 
     AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions; 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
     Application.Run(new Form1()); 
    } 

    private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) { 
     var ex = (Exception)e.ExceptionObject; 
     // Display or log ex.ToString() 
     //... 
     Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex)); 
    } 
+0

grazie per l'ottimo consiglio – armin

+0

Funziona in WPF o solo in Windows Form? –

2

Ci sono molte ragioni per cui potrebbe succedere, e molti professionisti in grado di confermare che questo è un classico bug di qualsiasi applicazione, che appare quando si è sicuri che tutto wrks bene, ma sulla macchina client non funziona niente

È molto difficile dire perché ciò avvenga senza alcun dettaglio di eccezione fornito nella domanda.

È possibile eseguire il debug dell'applicazione collegandosi ad esso da Visual Studio.

How to: Attach to a Running Process

+0

Grazie per la risposta, ma si può spiegare il motivo per cui il mio codice di cui sopra non anche prendere questa eccezione si blocca solo, senza eccezioni, non messageboxes o niente – armin

+0

@armin che cosa fa? EventViewer dire? –

+1

Bene, ci sono tipi di eccezioni che non possono essere caugth da 'try/catch', come ad esempio' StackOverflow'. Guarda su 'EventViewer', come suggerisce LB, o [Abilita First Chance Exceptions] (http://florianreischl.blogspot.it/2010/01/how-to-enable-first-chance-exceptions.html) per vedere dove e che succede. – Tigran

0

debug e rilasciare le modalità sono due modi diversi per costruire il vostro codice. Poiché le modalità specifiche sono diverse per quasi tutti gli ambienti di sviluppo che utilizzi, è impossibile dirlo subito. Le modalità potrebbero anche essere chiamate Mode1 & Mode2.

Tuttavia, la modalità di debug probabilmente compila le informazioni di debug (tabelle dei simboli, numerazione delle righe, ecc.) Nel file binario in cui non viene rilasciata. Ma ci possono essere migliaia di differenze.

Prova a trovare le modalità di debug/rilascio specificate e troverai le differenze!

0

Il modo migliore per trovare qualsiasi opzione ambientale è registrare ciò che accade nella produzione. Inizia osservando e registrando le eccezioni, quindi usa ciò che impari per una registrazione più specifica.

Vedere this Microsoft kb article per istruzioni.

Per quanto riguarda le idee dietro di uscita e di debug modalità:

modalità di rilascio e la modalità di debug esistono per consentire diverse configurazioni, un disegno per aiutare lo sviluppatore trovare bug, l'altro per ottimizzare le prestazioni, e per configurare per la produzione ambiente.

Il modo migliore per imparare la differenza è semplicemente portare il vostro progetto di costruzioni Proprietà (tasto destro del mouse sul progetto, selezionare Proprietà, quindi fare clic sulla scheda Costruisci sulla sinistra). Guarda tutte le diverse opzioni che possono cambiare in base alla configurazione.

Un altro problema comune con il debug rispetto al rilascio non è l'impostazione corretta Creazione azione su uno degli elementi del progetto, ad esempio un file di configurazione o una risorsa incorporata.

2

La mia esperienza mi dice che si dovrebbe essere alla ricerca di codice in cui si gestisce le impostazioni di qualsiasi tipo.

Si potrebbe iniziare eseguendo il debug dell'applicazione senza impostazioni nel registro e senza impostazioni in application.config.

Se l'applicazione utilizza un database, è consigliabile provare con un database vuoto.

secondo passo sarebbe quello di eseguire il debug dell'applicazione su un computer di voi collega.

Spero che questo possa aiutare la tua ricerca.

Problemi correlati