Ich habe eine Lösung mit einigen Projekten. In verschiedenen Projekten gibt es mehrere Haltepunkte. Ich möchte verfolgen, ob der erste Thread einen dieser Haltepunkte erreicht hat, und diesen einzelnen Thread weiter verfolgen, obwohl andere Threads dieselben Codeblöcke eingeben.
Ich weiß, dass dies möglich ist, indem eine Bedingung am Haltepunkt definiert wird, dh Threadname = ... oder Thread-ID = ..., aber mein Fall ist eine stark geladene ASP.NET- Anwendung und sobald ich an w3wp.exe
viele anhänge Threads treffen die Haltepunkte. Ich brauche so etwas wie ein ThreadLocal<break-point>
.
Ist es möglich? Wenn das so ist, wie?
Antworten:
Das Einfrieren / Auftauen von Threads ist eine falsche Methode, da andere Threads keinen Code ausführen.
Der korrekteste und nützlichste Weg ist:
In Visual Studio 2015 und höher ist der Prozess ähnlich:
Es werden also alle Threads ausgeführt, aber der Debugger trifft nur auf den aktuellen Thread.
quelle
System.Threading.Thread.CurrentThread.ManagedThreadId
oder so?Folgendes habe ich getan:
Stellen Sie einen bedingten Haltepunkt ein, von dem ich wusste, dass er nur auf den gesuchten Thread trifft.
Sobald der Haltepunkt erreicht ist und Sie sich im gewünschten Thread befinden, klicken Sie im Fenster Visual Studio-Threads (während des Debuggens auf Debuggen -> Windows -> Threads) auf Ctrl+ A(um alle Threads auszuwählen) und dann Ctrlauf den Thread, in dem Sie sich gerade befinden . Sie sollten alle Threads außer dem auswählen, den Sie debuggen möchten.
Jetzt durchläuft Visual Studio nur noch den aufgetauten Thread. Es scheint dabei viel langsamer zu sein, vermutlich weil es alle eingefrorenen Threads durchlaufen muss, aber es hat meinem Multithread-Debugging etwas Vernunft gebracht.
quelle
Ich habe gerade eine Visual Studio 2010+ -Erweiterung veröffentlicht, die genau das tut, wonach Sie suchen. Und es ist kostenlos :).
Überprüfen Sie es hier in der Galerie , auf der offiziellen Seite oder im Github-Repository .
quelle
Wenn wie bei einer Webanwendung mehrere Threads erzeugt werden, funktionieren die Antworten von @MattFaus nicht. Was ich stattdessen getan habe, ist das Folgende
quelle
Ein etwas anderer Ansatz, den ich verwendet habe:
Dies setzt voraus, dass Sie Zeit haben, die oben genannten Schritte auszuführen, bevor ein zweiter Thread Ihren Haltepunkt erreicht. Wenn dies nicht der Fall ist und andere Threads Ihren Haltepunkt erreichen, bevor Sie die oben genannten Schritte ausgeführt haben, können Sie mit der rechten Maustaste auf sie im Thread-Fenster klicken und Einfrieren auswählen.
quelle
lock(m_someObject) { ; }
In VS 2019:
quelle
Ich würde vorschlagen, eine weitere Instanz der Anwendung auf dem Live-Server hinzuzufügen, entweder auf derselben Hardware oder auf einem neuen Computer (Cluster it) und dann nur diese Instanz zu debuggen. Ich würde keinen Haltepunkt in Code hinzufügen, den Benutzer auslösen. Wenn dies keine Option ist, würde ich mehr Ablaufverfolgung hinzufügen.
Wenn dies jedoch unbedingt erforderlich ist und Sie einen Lösungsstatus benötigen, können Sie sicher einen Haltepunkt hinzufügen, der nur dann unterbrochen wird, wenn die Anforderung von Ihrer IP-Adresse stammt. Sie würden dies tun, indem Sie einen bedingten Haltepunkt hinzufügen, der überprüft
HttpContext.Request.UserHostAddress
. Beachten Sie jedoch, dass dies Ihre Anwendung erheblich verlangsamt.quelle
Wenn Sie nicht alle anderen Threads stoppen möchten (möglicherweise hängen Sie den Visual Studio-Debugger an eine laufende Anwendung an, die auf Anforderungen antworten muss), können Sie ein Makro verwenden, mit dem Haltepunkte automatisch erstellt und entfernt werden.
Dies wird in einer Antwort auf die Stapelüberlauffrage "Step over" beim Debuggen von Multithread-Programmen in Visual Studio vorgeschlagen .
Der Link erklärt jedoch nur das zeilenweise Debuggen. Ich schlage vor, dass Sie das Makro ändern (wenn Sie damit vertraut sind), damit alle Haltepunkte (z. B. in einem bestimmten Zeilenbereich) so geändert werden, dass sie nur im aktuellen Thread anhalten.
quelle
Ich denke, dass dies in Visual Studio 2015 etwas anders ist. Sie haben einige Änderungen an den Haltepunkten vorgenommen, aber hier erfahren Sie, wie Sie die akzeptierte Antwort von hzdbyte (oben) anwenden:
Klicken Sie am Haltepunkt am Codierungsrand mit der rechten Maustaste auf> Bedingungen> Von 'Bedingter Ausdruck' zu 'Filter'. Auf diese Weise können Sie nach ThreadId filtern.
Alternativ können Sie auf dem Haltepunkt im Fenster Haltepunkte mit der rechten Maustaste> Einstellungen> das Kontrollkästchen Bedingungen aktivieren und die oben genannten Schritte ausführen.
quelle
Legen Sie eine Haltepunktbedingung fest, indem Sie mit der rechten Maustaste auf die Seitenleiste der Linie klicken. Wählen Sie "Bedingung" und geben Sie Folgendes mit dem Namen Ihres Threads in Anführungszeichen ein:
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
Alternativ können Sie dasselbe tun, indem Sie die "verwaltete ID" des Threads aus dem Fenster "Threads" abrufen und Folgendes verwenden:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
quelle