2013-10-30 12 views
5

Abbiamo una situazione in cui la nostra applicazione a volte solleva uno ExecutionEngineException. Ho pensato che quando dovesse accadere, l'applicazione dovrebbe bloccarsi, ma non si blocca. E anche se il visualizzatore di eventi afferma che l'applicazione è stata chiusa, continua a essere in esecuzione! Sembra solo che il thread offensivo sia stato ucciso silenziosamente.Come causare .NET 4 per lanciare ExecutionEngineException?

Il problema è che non siamo in grado di ricreare le condizioni quando si verifica - il codice sospetto viene eseguito migliaia di volte prima che si verifichi l'eccezione. Non c'è nulla nei registri. In breve - siamo perplessi.

Mi piacerebbe essere in grado di generare questa eccezione a piacimento per imparare come si comporta la nostra applicazione quando accade. Naturalmente, deve essere lanciato dal framework stesso, l'emissione di throw new ExecutionEngineException non conta.

Quindi, la mia domanda è: come posso farlo in modo affidabile? Per favore, fornire un esempio di codice.

Siamo sul .NET 4, spostando presto per .NET 4.5

risposta

3

Dal MSDN documentation:

In alcuni casi, un'applicazione che gli obiettivi del .NET Framework può un'eccezione ExecutionEngineException durante garbage collection quando un'applicazione o il sistema su cui è in esecuzione si trova sotto un carico pesante . In questo caso, per ovviare a questo problema, è possibile disabilitare la raccolta dati obsoleti simultanea modificando il file di configurazione dell'applicazione. Per ulteriori informazioni, vedere How to: Disable Concurrent Garbage Collection.

Nel caso in cui la soluzione alternativa suggerita dalla documentazione MSDN non funzioni, è necessario eseguire il test in base a ciò che si conosce del software.

Ora, la creazione di un'applicazione di test che simula il carico, il comportamento multi-thread e il consumo di memoria della vostra applicazione reale è una cosa - probabilmente è meglio usare il software reale come software di test (magari arricchito con un ulteriore debug-logging + codice di prova). Questo significa, sfortunatamente, nessun esempio di codice qui :(

Per rendere significativi i test di carico, è necessario eseguire questi test su un sistema di test che ha una configurazione hardware/software molto simile, se non identica, al sistema di produzione. E solo allora sarai in grado di scoprire se ExecutionEngineException è causato dal GC o da un runtime altrimenti corrotto

+0

Sono abbastanza convinto che le AEE possano verificarsi in circostanze meno stressanti. Navigando sul Web si crea un'impressione che il codice IL emesso in modo dinamico può comportare un'eccezione del genere. – mark

+0

Se il codice IL è un codice "hand-crafted" buggy, come prima ipotesi sarebbe più probabile che il tuo problema sia riproducibile in modo coerente.Il problema si verifica solo "a volte" come un primo indizio su alcune questioni relative alle risorse esaurite o alle condizioni di gara. Comunque, sono tutte cause possibili e non avrai altro modo di controllare ognuna di queste possibilità finché non avrai trovato la causa del problema :( – elgonzo

1

Non puoi causare ExecutionEngineException facilmente a meno che non si riproduca il problema (anche se devi farlo in produzione Microsoft ha utilità come DebugDiag che possono aiutarti a catturare i dump della memoria quando si verificano tali eccezioni,

http://blogs.msdn.com/b/chaun/archive/2013/09/15/steps-to-trigger-a-user-dump-of-a-process-with-debugdiag-1-2-when-a-specific-net-exception-is-thrown.aspx

e tramite l'analisi delle discariche è facile individuare il colpevole. Non aspettarti che i tuoi registri possano dirlo, poiché quando si verifica questa eccezione il CLR si arresta in modo anomalo ei tuoi registri non arrivano mai così in profondità.

+0

Questo è il punto, il CLR non si blocca. Non avrei postato questa domanda se la questione è stata risolta semplicemente analizzando la discarica, il codice che si sospetta sia stato sollevato è http://fasterflect.codeplex.com/ - una libreria abbastanza testata, in più, come ho già detto, viene esercitato lo stesso percorso migliaia di volte prima che sorgano le condizioni per l'AEE Non sono ancora convinto che questa eccezione non possa essere generata a piacimento in laboratorio – mark

+1

"non si blocca" non è appropriato Quando questa eccezione si verifica, CLR non può ripristinarsi in modo affidabile. la bandiera che inseguiamo.Se consideri solo la terminazione come incidente, per favore, fammi sapere e cancellerò la mia risposta inutile sopra. La libreria open source che usi di fatto è molto pericolosa potrebbe colpire i problemi di regressione di .NET Framework in quanto può manipolare direttamente IL. Dato che vuoi riprodurlo in laboratorio, ti auguro buona fortuna. –

Problemi correlati