2010-04-27 2 views
21

Ich debugging ein offensichtliches Nebenläufigkeitsproblem in einer größeren App, die ich bei der Arbeit hack. Der fragliche Fehler manifestiert sich nur auf bestimmten leistungsschwächeren Rechnern nach mehr als 12 Stunden, und ich habe ihn nie im Debugger reproduziert. Aus diesem Grund beschränken sich meine Debugging-Tools im Wesentlichen auf die Analyse von Protokolldateien.Kann ich die Stack-Traces aller Threads in meiner C# App abrufen?

C# macht es einfach, den Stack-Trace des Threads zu erhalten, der die Ausnahme auslöst, aber ich möchte zusätzlich die Stack-Traces jedes anderen Threads abrufen, der zum Zeitpunkt des Auslösens der Ausnahme in meiner AppDomain ausgeführt wird.

Ist das möglich?

+3

Ich war gerade auf der Suche nach so etwas neulich (und kam auf diese Frage: http://stackoverflow.com/questions/190236/how-do-i-make-a-thread-dump-in- net-a-la-jvm-thread-dumps). Sieht so aus, als ob du kein Glück mehr hast, aber es ist immer noch gut zu sehen, was diejenigen, die diese Frage beantwortet haben, zu sagen haben. –

+0

Danke Dan, ich habe ein paar nützliche Dinge aus deiner verlinkten Frage gezogen ... –

Antwort

5

Es gibt ein Tool auf CodePlex namens Managed Stack Explorer (das glaube ich von Microsoft stammte). Es verwendet die Debugging- und Profiling-API, um die Stack-Traces der Threads in einer laufenden .Net-Anwendung zu erfassen, ohne dass die Anwendung geändert werden muss.

Sie können Ihre Anwendung ausführen, bis das Problem auftritt, und sie dann mit diesem Tool analysieren, um die aktuellen Stack-Traces aller laufenden Threads zu erfassen. Der Vorteil dieses Ansatzes besteht darin, dass Sie Ihre Anwendung unverändert lassen (Instrumentierung kann ihr Verhalten ändern), und das Tool ist kostenlos.

+0

Das sieht nach der besten Lösung aus. Es wäre sicherlich schön, wenn das Framework nativ innerhalb der Sprache unterstützt würde ... –

+4

Denke nicht, dass dies in .NET4 mehr unterstützt wird, selbst die Beispiel-App wird nicht in der Liste auf einem PC mit .NET4 angezeigt . – angularsen

4

Ich schlage vor, einen Dump des Prozesses, wenn die Ausnahme auftritt. An derselben Stelle, an der Sie die Ausnahme protokollieren, rufen Sie die MakeDumpFile() -Methode wie folgt auf.

Dies setzt voraus, dass Sie Debugging Tools For Windows auf der problematischen Maschine installiert haben.

private static void MakeDumpFile() 
    {    
     int pid = Process.GetCurrentProcess().Id; 
     Console.WriteLine("Creating dump for pid " + pid); 

     //path to adplus executable; ensure you have Debugging tools installed; 
     string program = @"C:\Program Files (x86)\Debugging Tools for Windows (x86)\adplus.exe"; 

     //args for adplus; ensure the crashdump folder exists! 
     string args = string.Format(@"-hang -p {0} -o c:\crashdump", pid); 

     var startInfo = new ProcessStartInfo(program, args); 
     startInfo.UseShellExecute = false; 
     startInfo.ErrorDialog = false; 
     startInfo.CreateNoWindow = true; 
     startInfo.RedirectStandardOutput = true; 

     var process = Process.Start(startInfo); 
     Console.WriteLine("The following is output from adplus"); 
     Console.WriteLine(process.StandardOutput.ReadToEnd()); 
     Console.WriteLine("Finished creating dump."); 
    } 

Navigieren Sie zu dem Dump-Verzeichnis und Sie sollten einen neuen Ordner mit einer Datei sehen darin FULLDUMP_something_.dmp benannt.

Wenn Sie auf .NET4 sind Sie einfach diese in VS2010 ziehen und alle Threads überprüfen oder parallele Threads verwenden, um zu sehen, was los ist (das ist genial!)

Wenn auf NET3.5 oder früher Sie müssen Windbg verwenden, um zu analysieren. Verwenden Sie den folgenden Befehl

~ * e! Clrstack

die Aufrufhierarchie aller verwalteten Threads zu drucken. Wenn Sie mehr Hilfe benötigen, um windbg gehen Post zurück oder google für ein Tutorial.

+0

Als ich die Debugging-Tools installiert habe, habe ich folgenden Installationspfad gefunden: C: \ Programme \ Windows Kits \ 8.1 \ Debuggers \ x86 – Charlie

Verwandte Themen