September 2017

Band 32, Nummer 9

Dieser Artikel wurde maschinell übersetzt.

ASP.NET Core: Snapshotdebuggen für Produktions-Apps und -dienste in Azure

Durch Nikhil Joglekar | September 2017

Das Mantra der DevOps ist "schnell zu verschieben und Dinge unterbrechen". Allerdings erfordert dies Sie ständig die Dinge zu korrigieren, die unterbrechen. In produktionsumgebungen können erkennen und Diagnose eines Problems zeitintensiv und Ressourcen sein. Probleme, die nur in der Produktion Probleme manifest gehören zu den höchst schwierig zu lösen. Wie oft haben Sie ein Problem in der Produktion auftreten, die gerade bearbeitet Ordnung, und klicken Sie auf die Entwicklung Box oder musste gezwungen Tausende von die Protokolle, um herauszufinden, was das Problem verursacht?

Derzeit stehen mehrere Möglichkeiten, die Sie Standort gemeldeten Probleme untersuchen können:

Wiederholen Sie zum Reproduzieren des Problems lokal. Eine produktiven Umgebung ist wesentlich komplexer als eine Entwicklungsumgebung: Es ist häufig in einem größeren Rahmen und enthält echte Daten in der Produktionsdatenbank. Abrufen von einem lokalen Reproduktion des Problems kann das Kopieren von Produktionsdaten in einer Umgebung Testserver umfassen. Im schlimmsten Fall kann es nicht zum Reproduzieren eines Problems lokal möglich.

Gezwungen Sie, in den Protokollen, um zu versuchen, die Ursache des Problems zu ermitteln. Protokolle im Idealfall enthält Details und dem angegebenen Kontext, um das Problem zu dem Moment, die dieser Fehler auftritt. Es ist ausreichend Tools zum Sammeln, aggregieren, und Suchen in den Protokollen, noch beim Suchen nach, dass die genauen Details zur Korrelation mit das gemeldete Problem z. B. eine Nadel im Heuhaufen gesucht werden können. Ihre app-Protokolle enthalten häufig, wird nicht die Details, die erforderlich sind, um die Ursache des Problems zu identifizieren. In solchen Fällen müssen Sie zusätzliche Protokolldateien der app hinzufügen und erneut bereitstellen, um die Details zu erhalten, die Sie benötigen.

Rufen Sie den Kunden mehr Kontext. Wenn Sie Protokolle und lokalen Vervielfältigung zum Scheitern verurteilt nachzuweisen, müssen Sie möglicherweise direkt wenden Sie sich an den Kunden abrufen, die in das Problem ausgeführt haben. Der Kunde möglicherweise mit der app auf eine Weise unerwartete oder gar nicht ausgeführt haben.

Fügen Sie einen echten Debugger als ein last-ditch Aufwand. Anfügen eines Debuggers in einer produktionsumgebung, können Sie den Status der app zu überprüfen, jedoch festlegen und das Erreichen eines Haltepunkts hält effektiv die app aus verarbeitet Clientanforderungen, während Sie debuggen.

Jede dieser Methoden haben, ihre vor- und Nachteile, aber auch die meisten erfahrenen Entwicklern, die nach der Schleife finde Produktionsfehlern zeitaufwändig und schwierig zu diagnostizieren. In diesem Artikel werde ich den Momentaufnahme-Debugger für Azure ist eine Reihe von neuen Tools in Visual Studio, die die Zeit erheblich reduzieren, können und Probleme im Zusammenhang mit "Produktion" Problemen führen.

Momentaufnahme-Debugger wurde von Grund auf als Tool zum Debuggen in Azure ausgeführte Produktionsdienste sicher entworfen. Sie können live Websiteproblemen praktisch keine Auswirkung auf den Dienst debuggen. Momentaufnahme-Debugging Schaltet die Einfachheit der Verwendung eines Debuggers an eine Skalierung des Cloud. Es gibt drei wichtige Funktionen im Debugger Momentaufnahme:

Snappoints. Snappoints befinden wie einen Haltepunkt eingestellte in Ihrer app beim Debuggen auf die Entwicklung Box in einer Zeile des Codes, die Sie angeben. Wenn Ihre app ein Snappoint trifft, erstellt der Momentaufnahme-Debugger eine Momentaufnahme der app, können Sie die Aufrufliste, lokale Variablen und Objekte im Heap zu überprüfen. Im Gegensatz zu Haltepunkten nicht der app zu beenden. Kunden, die Interaktion mit der app wird nicht beachten, dass Sie derzeit Ihre app Debuggen.

Logpoints. Sie fügen zusätzliche Log-Anweisungen in einer live-produktionsumgebung in Fällen, in denen Sie möglicherweise nicht protokollmeldungen, die Details einer Produktion ausstellen, kann. Diese neue Log-Anweisungen sind temporär und dazu führen, dass keine Nebeneffekte zu Ihrer app.

Bedingungen. Nur ein Bruchteil der Anzahl von Anforderungen, die durch eine live-app möglicherweise interessant sein oder Fehler auftreten. Bedingte Anweisungen, die Sie angeben, gelten für beide Snappoints und Logpoints, um sicherzustellen, dass Sie nur Diagnoseinformationen auf interessante Anfragen erhalten, mit deren Hilfe möglicherweise identifizieren den Stamm dazu führen, dass das Problem.

Derzeit ist der Momentaufnahme-Debugger in der öffentlichen Vorschau für ASP.NET und ASP.NET Core-apps, die auf Azure-App-Dienste ausgeführt wird. Können Sie herunterladen und Testen Sie den Momentaufnahme-Debugger an aka.ms/snappoint.

Debuggen Sie problemlos in der Produktion mit Snappoints

Im Beispiel im Abbildung 1, Besucher ist eine ASP.NET MVC-Website auf Azure-App-Dienste, die registriert und verfolgt Besucher Microsoft Niederlassungen ausgeführt wird.

Besucher ist eine ASP.NET MVC-Website, die auf Azure-App-Dienste
Abbildung 1 Besucher ist eine ASP.NET MVC-Website unter Azure App-Dienste

So richten dieses Beispielszenario Eine der registrierten Besucher angezeigt wurde, beenden den geheimen-Projekt erstellen, ein Erstellen von Besuchern sollte unbedingt keinen Zugriff auf! Sie haben Ihren Computer ausgelöst und Schritte versucht wird, um zu erfahren, wie die app das Erstellen der Benutzerzugriff gegeben. Im ersten Schritt haben Sie war, suchen Sie über die app-Protokolle, um verdächtige Sicherheit den Zugriff erteilt auf eines der Besucher. Leider konnten Sie keine belastende Protokolle zu suchen.

In dieser app werden Besucher von einem Objekt "Besuchers identisch" dargestellt, die eine interne SecurityCode-Eigenschaft aufweist, die sie bestimmte Gebäude zugreifen können. Die einzige Möglichkeit Besucher ein Gebäude eingeben können ist die SecurityCode-Eigenschaft, die ihnen zugeordneten diese das richtige Maß Zugriff gewährt hat. Diese Eigenschaft wird nur intern von der Anwendung behandelt, aber es ist möglich, eine Person in einer nicht überprüften SecurityCode aus irgendeinem Grund erzwingen konnte. Um dies zu untersuchen. darüber hinaus die Version des Quellcodes, die in der Produktion in Visual Studio ausgeführt wird sollte geöffnet werden, und der Momentaufnahme-Debugger gestartet (Dies erfolgt durch auf Snapshot-Debugger starten, auf ein Azure App Service in der Cloud-Explorer mit der rechten Maustaste). Visual Studio dann Herstellen einer Verbindung mit dem Produktions-app in Azure ausgeführt wird, und geben Sie die Debugsitzung eine Momentaufnahme, wie in Abbildung 2.

Snapshot Debugsitzung
Abbildung 2: Snapshot Debugsitzung

Die Momentaufnahme-Debugsitzung Funktionen stark ähnelt einer lokalen Debugsitzung auf ein Feld für die Entwicklung. Sie können in einer Zeile, die Sie interessiert, statt Haltepunkte, wie Sie lokal debuggen, Snappoints platzieren. Platzieren Sie Snappoints im gleichen Bundsteg angezeigt, dass Sie Haltepunkte in einer lokalen Debugsitzung platzieren, aber sie inaktiv, sind bis Sie die Schaltfläche "Start/Update-Auflistung" auf, die Snappoints aktiviert in Ihrer produktionsumgebung erreicht. Jede Snappoint wird nur eine Momentaufnahme standardmäßig erfasst: Diese Momentaufnahme spiegelt wider, eine Anforderung an Ihre app vorgenommen.

Es gibt einige Speicherorte, in dem die app Besucher Besucher (und deren SecurityCodes) aktualisiert. Der Update-Controller ist einer der beiden Speicherorte. Sie können untersuchen, ob es eine updateanforderung, die eine SecurityCode legt fest wird, indem Platzieren einer Snappoint innerhalb der Update-Methode und mit der Schaltfläche Sammlung starten einschalten entsprechend abbildung3.

der Update-Controller
Abbildung 3 der Update-Controller

Der Debugger Momentaufnahme nimmt eine Momentaufnahme, beim Ausführen der app in der Produktion durch einer Linie mit einem Snappoint. Diese Momentaufnahme wird in etwa 10 ms, erfasst wonach weiterhin, dass die app Anforderungen ausgeführt werden. Diese Momentaufnahme wird in Visual Studio im Fenster Diagnose-Tools auf der rechten Seite angezeigt; Doppelklicken Sie darauf, um die Momentaufnahme zu öffnen. Öffnen die Momentaufnahme, erhalten Sie alle Arten von Debug Details hinsichtlich Uhrzeit zum Zeitpunkt der Ausführung die Codezeile Ablauf, in dem die Snappoint platziert. Sie können die Aufrufliste und "lokal" in ihre jeweiligen Toolfenstern anzeigen. Sie können das Fenster "überwachen" wechseln und Besucher hinzufügen. SecurityCode, war es tatsächlich eine SecurityCode akzeptiert, die von der app zu überprüfen:

visitor.SecurityCode  null  string

SecurityCode auf diese Momentaufnahme wird wie erwartet: null. Der Momentaufnahme-Debugger erfasst eine Momentaufnahme auf die erste Anforderung an die Codezeile erreicht, in dem Sie eine Snappoint platziert. Diese Momentaufnahme widerspiegelt das richtige Verhalten Ihrer App und keine hilft Ihnen also das Problem zu diagnostizieren. Eine Momentaufnahme, in denen die SecurityCode nicht null ist, können Sie Ihre Hypothese untersuchen. Versucht, eine Momentaufnahme zu erfassen, wenn ein SecurityCode vorhanden ist und Sie können Bedingungen hinzufügen, die Snappoints durch Klicken auf die Optionen "Zahnrad"-Symbols beim auf die über eine Snappoint entsprechend Abbildung 4.

Erstellung einer Momentaufnahme aus, wenn SecurityCode vorhanden ist.
Abbildung 4 Erstellung einer Momentaufnahme aus, wenn SecurityCode vorhanden ist.

Die hinzugefügte Auswertung der Anweisung können Sie eingrenzen, und erstellen Sie eine Momentaufnahme nur auf eine interessante-Anforderung. Nach dem Einschalten neue Snappoint aus, indem Sie auf Start/Update-Auflistung, und warten einige Sekunden, sehen Sie eine andere Momentaufnahme in das Diagnosefenster Tools angezeigt. Doppelklicken zum Anzeigen der Debuginformationen für diese Momentaufnahme zeigt die folgende Informationen für die lokale Variable Besucher:

visitor  {MyCompany.Visitors.Model.Visitor}  MyCompany.Visitors.Model.Visitor
  Company  "Microsoft"  string
  Email  "toroidking@microsoft.com"  string
  FirstName  "Jackson"  string
  LastName  "Davis"  string
  Position  "Principal Software Engineer"  string
  SecurityCode  "SecretProjects"  string
  VisitorId  7  int

BAM! Es sieht aus, als wäre Ihre app aus irgendeinem Grund eine nicht überprüfte SecurityCode akzeptiert. Es wird angezeigt, als ob jemand Teil der HTTP-Anforderung Nutzlast in den Update-Controller hinzufügen in einem SecurityCode manuell geändert wurde. Ihre app akzeptiert dann die SecurityCode ohne keine weiteren Überprüfungen. Um dieses Problem zu beheben, konnte die SecurityCode-Eigenschaft als privat festlegen oder in Überprüfungen für Clients manuell festlegen einer SecurityCode hinzugefügt werden.

Die manuelle Änderung der PUT-Anforderung konnte kein Szenario, das Sie erstellt haben, Ihre app verwaltet, noch wurde dieses Szenario getestet wurden lokal. Snappoints können Sie echte Kundenanfragen untersuchen, die in Ihre app, die den Fehler praktisch keine Auswirkung für die Website selbst. erkennen stammen.

Weitere Informationen bei Bedarf mit Logpoints abrufen

Nun, dass Sie die Quelle des Fehlers identifiziert haben, können Sie den Code korrigieren und es in die Produktion bereitstellen. Allerdings kann es einige Zeit vor dem vornehmen, können Sie es von Ihrem Team überprüft und ihn durch die fortlaufende Integration-Systemen bis zur Produktion weitergegeben sein. Jetzt Sie müssen Nachverfolgen jeder Benutzer von, wer versucht, eine SecurityCode festzulegen.

Logpoints können Sie diese Meldung zusätzliche temporäre Protokollierung Ihrer app ohne Neustart oder erneuten Bereitstellung hinzufügen und diesen Cmdlets können Sie das Auswerten von Variablen in den protokollmeldungen aufgenommen werden sollen. Um Ihre app ein Logpoint hinzugefügt haben, rufen Sie die Einstellungen auf einem Snappoint und konvertieren Sie ihn in ein Logpoint (Beachten Sie, dass alle Bedingungen an, die Sie festlegen, auch für Logpoints geeignet ist) zu. Statt eine Momentaufnahme erstellen, wenn die Zeile des Codes ausgeführt wird, wird die app eine neue protokollmeldung auszugeben. Nur während einer Sitzung Momentaufnahme Debugger in Visual Studio wird Logpoints aktiv bleiben. Im Beispiel im Abbildung 5, Name des Besuchers zu protokollieren, wenn ein ungültiger SecurityCode festgelegt ist.

ein Logpoint hinzufügen
Abbildung 5 ein Logpoint hinzufügen

Logpoints können an zwei Orten Protokolle senden: wieder zu Visual Studio in einem Livestream und Ihre app Protokollspeicher. Beim Senden an das Fenster "Ausgabe" aktiviert ist, werden neue protokollmeldungen stream wieder in Visual Studio und im Fenster "Ausgabe" und das Diagnosefenster Tools angezeigt. Beim Senden an die app-Protokolle aktiviert ist, senden Sie die Protokolle an Ihre app Protokollspeicher. Um dies zu erreichen, stellen Sie einen System.Diagnostics.Trace-Aufruf, mit der Eingabe protokollmeldung für ASP.NET-Anwendungen und eines ILogger.LogInformation-Aufrufs für ASP.NET Core-apps. Wenn Sie Ihre protokollierungsframework Lauschen System.Diagnostics oder ILogger konfigurieren, werden die Protokolle in Verbindung mit anderen app-Protokolle angezeigt, die Sie derzeit erfassen.

Logpoints verursachen nicht auf Ihre app keine Nebeneffekte in der Produktion. Der Momentaufnahme-Debugger führt nahezu den input-Log-Anweisungen in einer Weise, die das Bundesland oder der Ausführung der Anwendung in der Produktion nicht ändern können.

Mithilfe von Logpoints überwachen Sie jetzt jeder Benutzer, der versucht, eine SecurityCode in Ihrer app verwenden. Sie können neue Protokollinformationen in einem Teil der app erfassen, die zuvor keine Protokolle generiert. Logpoints können Sie die zusätzliche Kontextinformationen für Ihre app nur abrufen, wo und wann Sie ihn benötigen.

Wie Momentaufnahme Debuggen einsatzbereit ist.

Der Debugger Momentaufnahme zielt darauf ab, um die Einfachheit des Visual Studio Debuggen einer Produktion für apps, die im Azure-Erfahrung zu bringen. Erfassen von Momentaufnahmen für eine live-app wird minimal intrusiv. Leistungsmessungen angezeigt, dass Momentaufnahme Debugger eine zu vernachlässigende Auswirkung auf die Geschwindigkeit Ihrer App enthält.

Momentaufnahme-Debugger dient für den Build der Releaseversionen Ihrer App verwendet werden soll. Derzeit kann Releaseversionen von verwalteten apps Debuggen schwierig sein, wie Debugger Controller möglicherweise etwas deaktiviert aufgrund Funktion Optimierung und Erstellen von apps in – gleich hohen in Version. Der Momentaufnahme-Debugger bietet Ihnen viel bessere Unterstützung für das Debuggen Release-Build-apps. Er erneut kompiliert, Funktionen, die mit Snappoints Optimierungen und in-Bruchzahlen mit horizontalen vorübergehend deaktiviert. Resultierende Momentaufnahmen in dieser Funktionen sind daher einfacher "debugfähig". Wenn Sie die Snapshot-Debugsitzung zu beenden, werden die Funktionen erneut einmal kompiliert und an den ursprünglichen Zustand für die Produktion zurückgegeben.

Wenn der Momentaufnahme-Debugger eine Momentaufnahme Ihrer App erfasst, wird eine Verzweigung von der app-Prozess erstellt. Diese Momentaufnahme oder verzweigter Prozess gibt den vollständigen Status der app und die app-Heap zum Zeitpunkt der Zeit, wenn die Momentaufnahme erstellt wurde, wieder. Jedoch kopieren nicht diese Momentaufnahme sofort die vollständige Heap der app; Stattdessen wird nur die Seite kopiert und Seiten beim Schreiben kopiert. Wenn ein Teil der app-Objekte auf dem Heap geändert wird, werden die entsprechenden Seiten in den verzweigter Prozess kopiert. Jede Momentaufnahme erfordert daher nur wenig Arbeitsspeicher Kosten (auf der Besucher von mehreren hundert Kilobyte app, die im Beispiel durch jede Momentaufnahme belegte Arbeitsspeicher verwendet wurde).

Der Debugger Momentaufnahme drosselt aggressiv die Anzahl der Momentaufnahmen erstellt werden, um sicherzustellen, dass er minimale speicherauslastung auf dem Produktionsserver legt. Der Momentaufnahme-Debugger wird nicht Momentaufnahmen erstellen, wenn die Menge des freien Speicherplatzes auf dem Server zu niedrig ist. Darüber hinaus vorhanden Momentaufnahmen nur, während die Momentaufnahme-Debugsitzung in Visual Studio aktiv ist. Wenn Sie die Snapshot-Debugger-Sitzung beenden, werden alle momentaufnahmeprozesse abgebrochen.

Snappoints können auch eine Anforderung zu untersuchen, währenddessen über verschiedene Codezeilen. Im Gegensatz zu Haltepunkten können Sie keinen Einzelschritt zwischen Snappoints ausführen. Allerdings können Sie mehrere Snappoints an verschiedenen Standorten von Interesse sind, in Ihrem Code platzieren. Die Schaltfläche "Start/Update-Auflistung" werden alle Snappoints aktivieren, die Sie in einer Massenoperation zu platzieren. Zwei Snappoints in eine bestimmte Funktion führt zu zwei Momentaufnahmen Diagnostic Tools im Fenster vorausgesetzt, dass beide Zeilen mit Snappoints ausführen. Sie können Wechseln zwischen den Momentaufnahmen zu sehen, wie Variablen in der ersten Momentaufnahme auf dem zweiten ändern. Der Momentaufnahme-Debugger wird sichergestellt, dass Gruppen von aktiviert in einer Massenoperation Snappoints im zugehörigen Momentaufnahmen führt. Zwei Momentaufnahmen in eine bestimmte Funktion ist sowohl in der gleichen Anforderung, selbst wenn es gibt Hunderte von Anforderungen, die durch Ihre app zu diesem Zeitpunkt.

In einer produktionsumgebung werden viele Druckservern identische Instanzen Ihrer App. In einigen Fällen möglicherweise interessante Anforderungen, die einen Fehler widerspiegeln, möglicherweise nur selten der Fall und nur auf bestimmten Servern auftreten. Der Momentaufnahme-Debugger können Sie diese Probleme zu untersuchen, wie sie gleichzeitig für mehrere Instanzen der app Debuggen unterstützt. Snappoints platziert, die in einer Funktion auf jedem Server, die mit einer Instanz Ihrer App zu aktivieren. Nur die erste Instanz die Zeile mit der Snappoint ausführen, wird eine Momentaufnahme erfasst. Sie können, daher bedingte Anweisungen verwenden, zum Analysieren von Problemen nur selten auftritt. Der Momentaufnahme-Debugger dauert die sich ergebende Momentaufnahme nur auf dem Server, auf dem die Eingabedaten Bedingungen "true" werden.

Zusammenfassung

Der Momentaufnahme-Debugger wurde nach Jahren mit Entwicklern arbeiten und deren Probleme beim debugging und Diagnose von Problemen der Produktion überwachen erstellt. Der Momentaufnahme-Debugger ermöglicht es Ihnen, eine umfassenden Diagnose Erfahrung bei der Entwicklung von apps mit .NET für Azure, die wiederum können Sie die sparen Sie Zeit und Geld in die Produktion unvermeidlich Probleme beim Ausführen.

Der Momentaufnahme-Debugger ist derzeit in der öffentlichen Vorschau für ASP.NET und ASP.NET Core-apps, die auf Azure-App-Dienste ausgeführt wird. Der Momentaufnahme-Debugger herunterzuladen und probieren Sie es aus am aka.ms/snappoint.


Nikhil Joglekar ist Programmmanager bei Microsoft gewonnen – wobei schwerpunktmäßig auf die Debug- und Diagnoseaufgaben für Azure-Dienste. Er arbeitet auf der Snapshot-Debugger, Visual Studio-Profiler und Azure SDK seit dem Beitritt Microsoft vor zwei Jahren. Wenden Sie sich an ihm am Nikhil.Joglekar@microsoft.com oder auf Twitter: @nikjogo.

Unser Dank gilt den folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Jackson Davis und Andy Sterland


Diesen Artikel im MSDN Magazine-Forum diskutieren