2014-06-19 6 views
5

Ich habe zwei Beispiele. Im ersten Fall, fängt Debugger die nicht behandelte Ausnahme:Ausnahmen verlieren einen Teil von Stacktrace in Try/Catch-Kontext

static void Main(string[] args) { 
    Exec(); 
} 
static void Exec() { 
    throw new Exception(); 
} 

Und die Ausnahme hat die volle Stacktrace:

at ConsoleApplication28.Program.Exec() 
    at ConsoleApplication28.Program.Main(String[] args) 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

Der zweite Fall:

static void Main(string[] args) { 
    Exec(); 
} 
static void Exec() { 
    try { 
     throw new Exception(); 
    } 
    catch (Exception ex) { 
    } // Breakpoint 
} 

an der Unterbrechungs der Ausnahme kurze hat stacktrace:

at ConsoleApplication28.Program.Exec() 

Warum werden Stacktraces im zweiten Fall in die containing-Methode geschnitten und wie kann man sie verhindern? Ich brauche full stacktrace für Bugreports, sonst ist es manchmal nicht möglich das Problem dort zu finden, ohne vollen Stacktrace.

+0

"Ich brauche volle StackTrace für Bugreports, sonst ist es manchmal nicht möglich, dort das Problem zu finden, ohne vollen Stacktrace." Um diesen Teil Ihrer Frage zu beantworten, müssen Sie eine "try-catch" -Struktur irgendwo "oben" einfügen, wo Ausnahmen möglich sind, vielleicht ganz oben in Ihrer Main() -Methode. In der catch-Klausel sollten Sie die exceptionObject.ToString() in eine Datei oder etwas für eine spätere Analyse schreiben. – RenniePet

Antwort

3

Was Sie im Visual Studio-Debugger sehen, ist die unbehandelte Ausnahme, die der Visual Studio-Hosting-Prozess abfängt (dh alles nach den ersten beiden Stack-Frames ist Teil dieser VS "Host-Installation"). Wenn Sie den Hosting-Prozess (Projekteigenschaften-> Visual Studio-Hosting-Prozess aktivieren) deaktivieren, wird in beiden Szenarien ein "kurzer" Stack-Trace angezeigt (obwohl Sie den Stack-Frame für Main in Ihrem zweiten Fall nicht sehen, da der Ausnahme wird "behandelt", darf nicht bis Main propagieren. Dieser kürzere Stack-Trace ist der Stack-Trace, den Sie sehen würden, wenn Sie die Anwendung außerhalb des Debuggers ausführen würden.

Der Stapel funktioniert so, wie Sie es sich vorstellen - jeder Methodenaufruf schiebt einen anderen Stapelrahmen darauf, und am Ende der Methode wird der Stapelrahmen "aufgepufft" oder aus dem Stapel entfernt. Der Stack-Trace, den Sie in der Exception sehen, besteht aus den Stack-Frames des Frames, in den die Exception geworfen wurde, zurück in den Frame, in dem die Exception letztlich behandelt wird, wenn der Stack "abgewickelt" wird.

+0

Möglicherweise möchten Sie diese Antwort reorganisieren, um deutlicher anzuzeigen, welcher Teil des Stack-Trace aufgrund des Hosting-Prozesses und welcher aufgrund des catch-Blocks ist. Sie könnten dann betonen, dass Stack-Traces aggregiert werden, wenn die Ausnahme Stapelebenen durchläuft, so dass der "Main" -Teil einfach noch nicht da ist. –

+0

Aber warum Main() ist nicht in der zweiten Stacktrace? Ich verstehe es nicht. Ich habe den Stacktrace an der Stelle der Ausnahme von System.Diagnostics.StackTrace und Main() überprüft. –

+2

Die Stack-Trace-Ausnahme ist der Stack-Trace bis zu dem Punkt, an dem die Ausnahme abgefangen wird. Diese Stack-Ablaufverfolgung wächst, wenn die Ausnahme die Ebenen des Aufruf-Stacks durchbricht. Es zeigt an, "was ist der Stack-Trace bis heute", nicht "was ist der Call-Stack zurück zum Anfang des Programms". –

Verwandte Themen