2009-11-05 16 views
5

Il mio servizio C# ha ottenuto un errore di esecuzione .net interno che punta al problema della ricorsività (ad esempio, overflow dello stack). Il problema è che il servizio è abbastanza grande, quindi ho difficoltà a trovare dove si verifica effettivamente la ricorsione.Come trovare la ricorsione nella tua app?

Qualcuno con una regex enorme mi può collegare con una stringa di ricerca che potrebbe trovare quello che mi serve?

+0

Nessuna traccia di stack? –

+0

No, l'unica ragione per cui so che l'app si è bloccata è che c'è una voce nel registro eventi che annuncia che si è verificato un errore interno .net e fornisce il codice, che ho tracciato per impilare i problemi di overflow. – AngryHacker

+1

Hai mai trovato questo problema? Se é cosi, come?Penso che la maggior parte delle persone qui non abbia capito che il programma si blocca senza alcuna registrazione tranne un errore generale di overflow dello stack nel registro eventi del servizio. –

risposta

5

Un ricorsione non è facile da trovare in alcune situazioni come:

method1() { 
    method2() 
} 

method2() { 
    method1() 
} 

Quindi una regex probabilmente non vi aiuti a trovare a meno che non si tratta di un caso banale.

+1

Sì. Costruisci un grafico di chiamata e cerca i cicli. – ephemient

+0

E sperare che non ci siano richiami del sistema operativo coinvolti nella ricorsione;) – Cogwheel

4

Come utilizzare uno strumento di profilatura come RedGate's Ants profiler o dotTrace?

Entrambi offrono prove gratuite. Esegui semplicemente il codice con il profiler in esecuzione e ti mostrerà rapidamente dove viene speso il tuo tempo/memoria.

Scommetto che la funzione ricorsiva del problema si attiverà un po '.

Inoltre, quale framework di registrazione degli errori si sta utilizzando? Nel caso in cui la risposta è nessuno, prendere in considerazione l'adozione di uno. This Question deals with the options. Con un buon sistema, dovresti essere in grado di ottenere la traccia dello stack che, se sei fortunato, potrebbe darti degli indizi su dove si sta verificando l'eccezione.

+0

Ho centinaia di installazioni in giro per gli Stati Uniti, questa è l'unica istanza che mi sta dando problemi. Non riesco a replicare il problema, ma mi piacerebbe almeno avvicinarci ad esso, individuando la ricorsione – AngryHacker

6

Questa è una domanda senza risposta nel caso generale. Tranne per gli esempi più banali (ad esempio una funzione che si chiama direttamente), non c'è modo di analizzare un programma e determinare se si verifica la ricorsione. Dovrai solo iniziare a colpire il debugger o altri strumenti di runtime.

Questo è un esempio di halting problem.

+1

Sì - Molto vero. I servizi di debug sono più complicati delle normali applicazioni, il che potrebbe essere il motivo per cui stanno chiedendo. –

+0

Penso che tu stia esagerando un po '. Nella maggior parte dei casi, penso che alcune analisi statiche trovino alcuni cicli: non sarebbe così difficile. Sarebbe esauriente? No, ma penso di fare un controllo pratico per questo non sarebbe così difficile. Tuttavia, l'uso di una regex non si verificherà. – Tim

+1

Penso che "alcuni cicli" si adattino agli "esempi più banali" che stavo cercando di trasmettere. Ma sì, anche allora probabilmente avresti bisogno di un parser completo solo per iniziare. – Cogwheel

2

Collegare a the service in the debugger e eseguire il debug in modo corretto. Lo troverai molto più facile che cercare di cercare il codice di qualsiasi progetto di dimensioni ragionevoli.

4

Sono d'accordo che una regexp non la taglierà qui.

Un modo più diretto sarebbe ottenere un file di dump e guardarlo per vedere dove è stata generata l'eccezione.

Oppure è possibile esaminare uno strumento di analisi statico come NDepend per esaminare il flusso dei programmi.

1

Il modo più semplice per eseguire questa operazione è ottenere una traccia stack della cosa che si sta bloccando. L'analisi dello stack sarà simile a questa:

Blah 
Foo 
Baz 
Hello 
... 
Frob 
Frob 
Frob 
Frob 
[several hundred more Frobs] 
Frob 
Frob 
... 
Frob 
Something -- crash! 

Il "Frob" è la funzione ricorsiva. :-)

Problemi correlati