Debuggen Sie in Visual Studio einen von mehreren Threads


127

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?


Welche Version von Visual Studio verwenden Sie? Express, Pro, Ultimate ..?
Mark

dann wird jeffamaphone`s Link helfen und vielleicht auch diese für weitere Informationen Wechsel zu einem anderen Thread während des Debuggen msdn.microsoft.com/en-us/library/bb157786.aspx
Mark

Antworten:


107

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 .


24
Ich bin verwirrt. Ist die Antwort "Es kann nicht gemacht werden?" In der Frage wird gefragt, wie Sie an einen bestimmten Thread gebunden bleiben sollen, damit der Debugger nicht zwischen ihnen herumspringt. Das Wechseln zu einem Thread ist in Ordnung, aber sobald ein anderer Thread etwas tut, springt der Debugger dorthin. Wenn ich den anderen Thread nicht einfrieren kann, weil er etwas tun muss, wie kann ich dann nur an den Thread gebunden bleiben, um den es mir geht?
Bubbleking

Einkommen vollständig: | Sie müssen immer auf "Umschalten" klicken, jedes Mal, wenn etwas passiert
deadManN

16

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


1
"Ein einzelnes Durchlaufen eines einzelnen Threads scheint in VS 2012 größtenteils behoben zu sein" - nicht wirklich, es ist in VS2017 immer noch fehlerhaft.
user626528

10

Sie können auch einen bedingten Haltepunkt in Ihren Code einfügen und den thread.Id == [someValue] oder Thread.Name == "[Somename]"in den Haltepunkt setzen ...


Danke Charles, das war hilfreich (wusste nicht, dass du das kannst). Der effizienteste Weg für mich zum Debuggen ist jedoch der, den Jeffamaphone geschrieben hat, da ich den Namen nicht kenne, bevor er den Haltepunkt erreicht und einige Werte sieht
Oskar Kjellin

3

Für einfache Fälle gibt es eine viel schnellere Problemumgehung - siehe Kommentare in Steves Link.

Der Debugger führt immer nur einen Schritt in dem Thread aus, von dem der Schritt stammt. Wenn Sie also einen Haltepunkt erreichen, ihn deaktivieren und dann mit dem Schritt beginnen, sollten Sie nicht bei einem anderen Thread anhalten. Wenn Ihre Anwendung andere Haltepunkte enthält und ein anderer Thread einen erreicht, debuggen Sie wie beschrieben im gemischten Thread-Status

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.


2

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.


1

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.


0

5. Gehen Sie durch einen einzelnen Faden, ohne herumzuspringen

Wie oft debuggen Sie Multithread-Code, wenn Sie Ihren ersten Haltepunkt erreichen, einen Schritt machen und dann plötzlich mit dem gelben Pfeil auf einem anderen Thread gestoppt werden? Das unerwartete Verhalten kommt von dem Haltepunkt, der noch gesetzt und folglich getroffen wird. Standardmäßig stoppt der Debugger bei jedem Treffer an einem Haltepunkt. Dies bedeutet, dass bei einem Schritt alle Threads ausgeführt werden dürfen und einer Ihrer laufenden Threads diesen Haltepunkt erreicht, bevor der Schritt für Ihren aktuellen Thread abgeschlossen ist. Wenn Sie das nächste Mal in diese Situation geraten, versuchen Sie Folgendes:

  1. Deaktivieren oder löschen Sie den Haltepunkt, der von dem neuen Thread getroffen wurde, zu dem der Debugger gewechselt hat.
  2. Drücken Sie Weiter (F5)
  3. Beobachten Sie, wie Ihr erster erster Schritt in diesem ersten Thread abgeschlossen ist und jetzt der aktive Debugging-Kontext ist.
  4. Da Ihre Haltepunkte gelöscht oder deaktiviert sind, können Sie ohne Unterbrechung weiter auf diesen einzelnen Thread treten.

7 weniger bekannte Hacks zum Debuggen in Visual Studio

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.