Debuggen eines verwalteten Speicherabbilds mit .NET-Diagnoseanalysetools

In diesem Lernprogramm lernen Sie Folgendes:

  • Öffnen eines Speicherabbilds
  • Auswählen und Ausführen von Diagnoseanalysetools für das Speicherabbild
  • Überprüfen der Ergebnisse der Diagnoseanalysetools
  • Navigieren zum problematischen Code

Bei dem Beispiel in diesem Artikel besteht das Problem, dass Ihre App nicht schnell genug auf Anforderungen reagiert.

Öffnen eines Speicherabbilds in Visual Studio

  1. Sie öffnen ein Speicherabbild in Visual Studio, indem Sie den Menübefehl Datei > Öffnen > Datei und dann Ihr Speicherabbild auswählen.

  2. Beachten Sie auf der Seite „Zusammenfassung“ des Speicherabbilds die neue Aktion namens Diagnoseanalyse ausführen.

    Action - Diagnostics Analysis

  3. Wählen Sie diese Aktion aus, um den Debugger zu starten, und öffnen Sie die neue Seite Diagnoseanalyse mit einer Liste der verfügbaren Optionen für Diagnoseanalysetools, die nach dem zugrunde liegenden Symptom organisiert sind.

Auswählen und Ausführen von Diagnoseanalysetools für das Speicherabbild

Die besten Optionen für die Untersuchung dieser Symptome sind unter Reaktionsfähigkeit von Prozessen verfügbar, da sie dem Problem in diesem Beispiel am besten entsprechen.

Select diagnostics analyzers

  1. Klicken Sie auf die Schaltfläche Analysieren, um den Untersuchungsvorgang zu starten.

  2. Das Analysemodul zeigt Ergebnisse basierend auf der Kombination aus Prozessinformationen und im Speicherabbild erfassten CLR-Daten an.

Überprüfen der Ergebnisse der Diagnoseanalysetools

  1. In diesem Fall hat das Analysetool zwei Fehler gefunden. Wählen Sie das Ergebnis des Diagnoseanalysetools aus, um die Zusammenfassung der Analyse und die vorgeschlagene Korrektur anzuzeigen.

    Diagnostics analyzers results

  2. In der Zusammenfassung der Analyse wurde angegeben, dass der CLR-Threadpool ausgelastet ist. Dies deutet darauf hin, dass die CLR derzeit alle im Threadpool verfügbaren Threads verwendet hat, sodass Ihr Dienst erst auf neue Anforderungen reagieren kann, wenn ein Thread freigegeben wurde.

    Hinweis

    In diesem Fall lautet die empfohlene Korrektur: „Warten Sie nicht synchron auf Monitore, Ereignisse, Aufgaben oder andere Objekte, die Ihren Thread blockieren können. Überprüfen Sie, ob die Methode in eine asynchrone Methode aktualisiert werden kann.“

Die nächste Aufgabe besteht darin, den problematischen Code zu finden.

  1. Wenn Sie auf den Link Aufrufliste anzeigen klicken, wechselt Visual Studio sofort zu den Threads, die dieses Verhalten aufweisen.

  2. Im Fenster Aufrufliste werden Methoden angezeigt, die möglicherweise schnell zwischen dem eigenen Code („SyncOverAsyncExmple. “) und Frameworkcode („System. “) unterscheiden.

    Diagnostics analyzers link to call stack

  3. Jeder Aufruflistenrahmen entspricht einer Methode, und durch Doppelklicken auf die Stapelrahmen navigiert Visual Studio zu dem Code, der direkt zu dem Szenario in diesem Thread geführt hat.

  4. In diesem Beispiel gibt es zwar keine Symbole oder Code, aber Sie können auf der Seite Symbole nicht geladen die Option Quellcode dekompilieren auswählen.

    Decompilation

  5. Im dekompilierten Quellcode unten ist offensichtlich, dass ein asynchroner Task (ConsumeThreadPoolThread) eine synchrone blockierende Funktion aufruft.

    Hinweis

    Die DoSomething()-Methode enthält eine WaitHandle.WaitOne-Methode, die den aktuellen Thread aus dem Threadpool blockiert, bis sie ein Signal empfängt.

    Um die Reaktionsfähigkeit von Apps zu verbessern, ist es wichtig, blockierenden synchronen Code aus allen asynchronen Kontexten zu entfernen.

    Analyze decompiled code