Se scrivo questo:Perché .NET non registra la traccia dello stack per le eccezioni StackOverflow?
class Program
{
static void Main(string[] args)
{
throw new Exception("lol");
}
}
e eseguire il file EXE dalla riga di comando, ottengo due voci nel mio registro eventi. Uno è un errore dell'applicazione che dice che c'era un'eccezione non gestita, e l'altro contiene la traccia dello stack con il sorgente come. NET Runtime.
Se scrivo questo:
class Program
{
static void Main(string[] args)
{
Recurse4Evr();
}
static void Recurse4Evr()
{
Recurse4Evr();
}
}
Ho solo una voce nel mio registro eventi, che dice errore di applicazione e che non c'era un'eccezione di overflow dello stack. Non c'è quella seconda voce con la traccia dello stack, quindi è fondamentalmente inutile.
Perché non viene registrata anche la traccia dello stack? Se imposto DebugDiag e lo allego al mio processo e poi c'è un overflow dello stack, DebugDiag è in grado di registrare la traccia dello stack. Ovviamente la traccia dello stack è in qualche modo disponibile per il mondo esterno. Se il runtime sta terminando il processo perché ha rilevato uno stackoverflow, allora sa anche qual è lo stack.
Nelle applicazioni di grandi dimensioni che presentano molte interazioni complesse, spesso non è possibile ricreare le condizioni che hanno causato un overflow dello stack. In questa situazione, una traccia di stack è l'unico modo per capire cosa è successo. Perché Microsoft decise che non era importante registrare queste informazioni? C'è stata una decisione di design legittima che non è ovvia?
La mia ipotesi sarebbe che la generazione dello stack in-process richiede chiamate di funzione, che non possono funzionare perché lo stack è in overflow. Il debugger aggira il problema essendo in grado di camminare nello stack usando le proprie strutture dati e (si spera) una pila sana. – siride
Questa è una bella domanda! Mi chiedo se abbia a che fare con il modo in cui vengono rilevati gli overflow dello stack ... Dopo .Net 2.0, sembra che anche tu non riesca a prenderlo, quindi sembra che funzioni da una serie speciale di regole. –
possibile duplicato di [C# cattura un'eccezione di overflow dello stack] (http://stackoverflow.com/questions/1599219/c-catch-a-stack-overflow-exception) – balexandre