2010-02-23 6 views
5

Ich entwickle eine WinForm Multithread-Anwendung mit C#. Manchmal passiert es, dass meine Anwendung hängt oder friert oder blockiert.Wissen, an welcher Stelle die Anwendung einfriert

Wenn dies passiert und ich im DEBUG-Modus ausgeführt werde, ist es sowieso zu verstehen, in welcher Codezeile meine Anwendung momentan ist? Da es eingefroren ist, erwarte ich, einen Punkt zu finden, wo die Anwendung gesperrt oder blockiert ist oder was auch immer. Ist es möglich, das irgendwie zu tun?

Wenn es eingefroren ist, habe ich versucht, das CALL STACK-Fenster zu öffnen, aber das zeigt keine Informationen an; Gibt es etwas, was ich tun könnte? Einige "Pause und Check" oder was auch immer?

Antwort

5

Möglicherweise müssen Sie das Fenster Threads öffnen und den aktuellen Thread ändern. Wählen Sie während des Debuggen Debug-> Alles unterbrechen, und öffnen Sie das Fenster Threads. Wenn Sie durch jeden Thread gehen, indem Sie auf den Thread doppelklicken, sollten Sie in der Lage sein, den Aufruf-Stack für jeden Thread zu untersuchen.

Das heißt, wenn Sie Ihr Programm in VS 2010 ausführen können - das wird viel einfacher. In VS 2010 können Sie den neuen Concurrency Profiler verwenden und Ihren Code unter dem Concurrency Profiler mit der Option ausführen, um das Verhalten einer Multithreadanwendung zu veranschaulichen. Sobald Ihre Anwendung abstürzt, killen Sie sie und lassen Sie den Profiler churn -

Schließlich erhalten Sie ein Diagramm, das jeden Thread in Ihrem Programm zeigt, und wenn sie gesperrt sind. Der Callstack für jeden blockierten Thread wird angezeigt, ebenso wie die Sperre (mit der Zeile des Quellcodes). Dies macht es sehr einfach, ein totes Schloss aufzuspüren.

+0

Hallo Reed! Vielen Dank für Ihre großartige Antwort! Noch eine kleine Sache, wenn Sie noch da sind .. Ich habe VS 2010 nicht und ich benutze immer noch VS 2008. Wissen Sie, ob es ein gutes freies Werkzeug gibt, das mehr oder weniger dasselbe erzeugt, das Sie gerade für Gewindediagramme beschrieben haben? Danke für Ihre Hilfe. –

+0

Nein - ich weiß nichts, was frei ist. Intels Threading-Toolkit funktioniert (ist aber sehr teuer). Sie können VS 2010 RC Ultimate jetzt kostenlos herunterladen und es auf Ihre Projekte ausführen, aber ... –

+0

Hallo Reed! Vielen Dank für Ihre Hilfe! Einen schönen Tag noch! –

2

Wenn der Debugger angeschlossen ist, gehen Sie in das Debug-Menü und wählen Sie 'Break All' ... Dann können Sie Call-Stacks für alle Threads untersuchen.

+0

Cool! Danke, Mann! –

2

Sie könnten pause drücken und sehen, wo es endet (verwenden Sie das oben genannte Call-Stack-Fenster). Die Chancen stehen jedoch gut, dass Sie in nativem Code landen. Sie könnten versuchen, ein wenig auszusteigen oder sich den Stack anzusehen, um eine verwaltete Funktion zu debuggen.

Alternativ können Sie einen Haltepunkt setzen, nachdem die Anwendung "friert" und versuchen, eine Schleife zu lokalisieren, die nicht endet.

Beide gehen davon aus, dass Ihre Anwendung beschäftigt ist (100% CPU-Auslastung). Wenn Ihre Anwendung jedoch in einer toten Sperre steckt oder einfach auf einen Mutex wartet, der nicht abhebt, müssen Sie Ihren Code manuell neu lesen und versuchen, es selbst herauszufinden.

+0

Auch! "Ja wirklich?" Manuell den Code lesen ist der einzige Weg, um herauszufinden, wo ich einen Deadlock habe? Vor einiger Zeit las ich über ein mächtiges Werkzeug namens WinDbg. Haben Sie jemals benutzt und wissen Sie, ob diese Tabelle mir helfen kann zu erkennen, an welchem ​​Stück Code die Anwendung stucked_ –

+0

Nun, wenn Sie in einem Deadlock sind, ist Ihr Thread in einer Funktion irgendwo tief in der RTL-DLL stecken bis die Bedingung vom Scheduler erfüllt wird. Ein Call-Stack teilt Ihnen nicht mit, auf welchen Zustand gewartet wird. – Blindy

Verwandte Themen