Ich habe eine Anwendung mit 4 Threads, die den gleichen Code bearbeiten. Wenn ich jedoch einen Schritt mache, springt es zwischen den verschiedenen Threads. Wie kann ich es für einen Thread sperren, damit die anderen Threads beim Debuggen ignoriert werden?
c#
multithreading
visual-studio-2010
Oskar Kjellin
quelle
quelle
Antworten:
Ja.
Klicken Sie im Thread-Fenster (Debug -> Windows -> Threads) mit der rechten Maustaste auf den gewünschten Thread und wählen Sie "Zum Thread wechseln".
Sie können auch "Einfrieren" für die Threads auswählen, die Sie nicht debuggen möchten, um zu verhindern, dass sie ausgeführt werden. Vergessen Sie jedoch nicht, sie aufzutauen, wenn Sie erwarten, dass sie funktionieren.
Weiterführende Literatur .
quelle
Das einzelne Durchlaufen eines einzelnen Threads scheint in VS 2012 größtenteils behoben zu sein (mit einigen Einschränkungen, die Sie in meinem Link unten sehen können). Haltepunkte sind ein Schmerz.
Das Einfrieren und Auftauen von Threads ist die übliche Problemumgehung, wie in früheren Antworten angegeben, aber es ist mühsam und kann zu Hängen führen, wenn Ihr Thread auf einen anderen Thread wartet, der eingefroren ist. Es kann schwierig sein, sich von diesen zu erholen, ohne Ihren Platz in Ihrem Interessensfaden zu verlieren.
Ein weiterer nützlicher Workflow besteht darin, einen Thread-Filter auf Ihre Haltepunkte anzuwenden, der auch in einigen Antworten angegeben ist:
Erstellen Sie einen Haltepunkt, klicken Sie mit der rechten Maustaste auf den Haltepunkt, klicken Sie auf Filter und geben Sie ThreadId = 7740 (Ihre Thread-ID aus dem Thread-Fenster) ein.
Dies kann sehr mühsam sein.
Mein Vorschlag an Microsoft ist, einzelne Schritte (und Variationen davon) so zu korrigieren, dass Threads niemals gewechselt werden, es sei denn, in einem anderen Thread wird ein expliziter Haltepunkt erreicht. Sie sollten auch eine Verknüpfung hinzufügen (möglicherweise Strg-F9), um einen Haltepunkt mit der aktuellen Thread-ID als Filter zu erstellen. Dies würde den zweiten Workflow viel komfortabler machen.
Stimmen Sie über den Vorschlag ab, wenn Sie damit einverstanden sind, oder fügen Sie Ihre eigenen Vorschläge hinzu:
https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst
quelle
Sie können auch einen bedingten Haltepunkt in Ihren Code einfügen und den
thread.Id == [someValue]
oderThread.Name == "[Somename]"
in den Haltepunkt setzen ...quelle
Für einfache Fälle gibt es eine viel schnellere Problemumgehung - siehe Kommentare in Steves Link.
In meinem Fall habe ich, sobald die verschiedenen Threads meinen Haltepunkt erreicht haben, ein paar Mal auf Weiter geklickt, bis ich den gesuchten Anruf identifiziert habe. Dann habe ich den Haltepunkt entfernt und bin durch den Rest des Codes gegangen, während ich ohne Störung von demselben Thread geblieben bin der Rest von ihnen.
Dies wird offensichtlich zu einem Problem, wenn Sie mehrere Haltepunkte haben, die Sie behalten möchten usw. - aber auch in einfachen Fällen ist dies viel einfacher.
quelle
Dies ähnelt stark einem sehr ähnlichen Problem in Visual Studio 2008 SP1. Es wurde mit einem Post-SP-Hotfix behoben. Es gibt aber auch andere Hinweise darauf, dass der Hotfix nicht in die Codebasis aufgenommen wurde. Dieses Feedback-Element war ebenfalls ein Problem. Es ist nicht ungewöhnlich, dass Hotfixes nicht wieder integriert werden.
Es gibt kein Feedback, das Ihr Problem genau beschreibt, zumindest das ich finden kann. Ich würde empfehlen, dass Sie eine einreichen. Angesichts der üblichen Probleme mit solchen Reproduktionsfehlern würde ich Ihnen dringend empfehlen, ein Reproduktionsprojekt einzuschließen, das dieses Problem mit Anweisungen zum Reproduzieren des Problems aufzeigt.
Es gibt eine Art Problemumgehung für Ihr Problem. Gehen Sie zu Debug + Windows + Threads, klicken Sie mit der rechten Maustaste auf die Threads, die Sie nicht debuggen möchten, und wählen Sie Einfrieren. Vergiss nicht, sie später aufzutauen.
Diese Fehler wurden in Visual Studio 2010 Service Pack 1 erneut behoben.
quelle
Ich verwende Visual Studio Professional 2017 und verwende das Threads-Fenster, um Threads selektiv einzufrieren und aufzutauen. Normalerweise habe ich mehrere Threads mit demselben Code und möchte sie nur einfrieren, nicht andere. Ich mag das MS Threads-Fenster tatsächlich, weil ich eine Teilmenge von Threads zum Einfrieren auswählen kann. Ich gruppiere die Threads nach Namen und kann dann alle Threads einfrieren, auf denen derselbe Code ausgeführt wird, den ich gerade debugge, während die verbleibenden Threads ausgeführt werden. Ich habe versucht, die Erwin Mayer-Erweiterung zu verwenden, und sie hat sehr gut funktioniert, aber sie friert alle Threads außer dem von mir ausgeführten ein, und manchmal gerate ich in eine Situation, in der das Debuggen nicht den Haltepunkt erreicht, den ich denke, dass es sollte, dann, weil alle Andere Threads werden gestoppt und die Anwendung scheint angehalten zu sein. Durch Drücken der Pause-Schaltfläche und Aufheben des Einfrierens von Threads im Thread-Fenster wird dieses Problem behoben.
quelle
7 weniger bekannte Hacks zum Debuggen in Visual Studio
quelle