App Center stürzt ab (Windows)
Wichtig
Visual Studio App Center wird am 31. März 2025 eingestellt. Sie können Visual Studio App Center zwar weiterhin verwenden, bis es vollständig eingestellt ist, es gibt jedoch mehrere empfohlene Alternativen, zu denen Sie eine Migration in Betracht ziehen können.
App Center-Abstürze generieren automatisch ein Absturzprotokoll, wenn Ihre App abstürzt. Das Protokoll wird zuerst in den Speicher des Geräts geschrieben, und wenn der Benutzer die App erneut startet, wird der Absturzbericht an App Center gesendet.
Das App Center SDK sammelt nur Abstürze, die durch nicht behandelte .NET-Ausnahmen verursacht werden. Es werden keine systemeigenen Abstürze erfasst, z. B. bei Verwendung von C oder C++. Wenn Sie jedoch eine App mit C++-Abstürze haben, können Sie sie über die Uploadabstürze-API in App Center hochladen.
Befolgen Sie die WPF/WinForms-Erste Schritte, wenn Sie das SDK noch nicht in Ihrer Anwendung eingerichtet haben.
Hinweis
Dieser Abschnitt und die folgenden Unterabschnitte gelten nur für WinForms. Sie können diesen Abschnitt überspringen, wenn Sie das SDK in WPF integrieren.
Standardmäßig löst eine nicht behandelte Ausnahme in einer WinForms-Anwendung keinen Absturz aus (die Anwendung wird nicht beendet), wenn der Debugger nicht angefügt ist.
Stattdessen zeigt Windows dem Benutzer in einem Dialogfeld die Option zum Fortsetzen oder Beenden der App-Ausführung an. Daher kann das App Center SDK diese Ausnahmen nicht automatisch erfassen (auch wenn der Benutzer auf die Schaltfläche Beenden klickt).
Abstürze werden nur dann in App Center erfasst, wenn die Anwendung automatisch beendet wird. App Center unterstützt nur einen Absturz pro Sitzung.
Es gibt zwei Möglichkeiten, nicht behandelte Ausnahmen in WinForms zu melden. Die Anwendung kann so konfiguriert werden, dass sie bei nicht behandelten Ausnahmen abstürzt oder die Ausführung fortsetzen, aber nicht behandelte Ausnahmen als Laufzeitfehler meldet.
Dies ist die einzige Möglichkeit, die nicht behandelte Ausnahme als Absturz in App Center zu melden und die Anwendung bei nicht behandelten Ausnahmen zu beenden.
Rufen Sie hierzu eine Windows-Methode auf, bevor Sie das SDK initialisieren:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppCenter.Start(...);
Wenn diese Option in Ihrer Anwendung nicht akzeptabel ist, können Sie die nicht behandelte Ausnahme als Laufzeitfehler melden (siehe unten).
Wenn Ihre Anwendung nach einer nicht behandelten Ausnahme weiterhin ausgeführt werden muss, können Sie die Ausnahme nicht als Absturz in App Center melden, sondern stattdessen als Fehler melden.
Dazu können Sie das folgende Codebeispiel verwenden:
Application.ThreadException += (sender, args) =>
{
Crashes.TrackError(args.Exception);
};
AppCenter.Start(...);
Hinweis
Wenn der Debugger angefügt ist, führen nicht behandelte Ausnahmen dazu, dass die Anwendung beendet wird (stürzt ab), es sei denn , ein Handler ist an Application.ThreadException
angefügt.
App Center Crashes bietet Ihnen eine API zum Generieren eines Testabsturzes zum einfachen Testen des SDK. Diese API überprüft, ob Debugkonfigurationen im Vergleich zu Releasekonfigurationen vorhanden sind. Daher können Sie es nur beim Debuggen verwenden, da es für Release-Apps nicht funktioniert.
Crashes.GenerateTestCrash();
App Center-Abstürze verfügt über zwei APIs, die Ihnen weitere Informationen für den Fall liefern, dass Ihre App abgestürzt ist.
Nach dem Starten des SDK können Sie jederzeit überprüfen, ob die App beim vorherigen Start abgestürzt ist:
bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();
Dies ist nützlich, wenn Sie das Verhalten oder die Benutzeroberfläche Ihrer App nach einem Absturz anpassen möchten. Einige Entwickler möchten eine zusätzliche Benutzeroberfläche anzeigen, um sich bei ihren Benutzern zu entschuldigen oder eine Möglichkeit zu erhalten, sich nach einem Absturz zu melden.
Hinweis
Diese Methode darf nur verwendet werden, nachdem Crashes
gestartet wurde. Sie wird immer vor dem Start zurückgegeben false
.
Wenn Ihre App zuvor abgestürzt ist, können Sie Details zum letzten Absturz abrufen.
ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();
Hinweis
Diese Methode darf nur verwendet werden, nachdem Crashes
gestartet wurde. Sie wird immer vor dem Start zurückgegeben null
.
Es gibt zahlreiche Anwendungsfälle für diese API. Am häufigsten sind Personen, die diese API aufrufen und ihren benutzerdefinierten Absturzdelegaten oder -listener implementieren.
App Center-Abstürze bietet Rückrufe für Entwickler, um zusätzliche Aktionen vor und beim Senden von Absturzprotokollen an App Center auszuführen.
Hinweis
Legen Sie den Rückruf vor dem Aufrufen AppCenter.Start()
von fest, da App Center die Verarbeitung unmittelbar nach dem Start abstürzt.
Legen Sie diesen Rückruf fest, wenn Sie entscheiden möchten, ob ein bestimmter Absturz verarbeitet werden muss oder nicht. Es kann z. B. zu einem Absturz auf Systemebene kommen, den Sie ignorieren und den Sie nicht an App Center senden möchten.
Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
// Check the report in here and return true or false depending on the ErrorReport.
return true;
};
Wenn Ihnen der Datenschutz des Benutzers wichtig ist, sollten Sie die Benutzerbestätigung erhalten, bevor Sie einen Absturzbericht an App Center senden. Das SDK macht einen Rückruf verfügbar, der App Center-Abstürze angibt, die Benutzerbestätigung abzuwarten, bevor Absturzberichte gesendet werden.
Wenn Sie sich dafür entschieden haben, sind Sie dafür verantwortlich, die Bestätigung des Benutzers zu erhalten, z. B. über eine Dialogaufforderung mit einer der folgenden Optionen: Immer senden, senden und Nicht senden. Basierend auf der Eingabe geben Sie App Center-Abstürze an, was zu tun ist, und der Absturz wird dann entsprechend behandelt.
Hinweis
Das SDK zeigt dafür kein Dialogfeld an. Die App muss eine eigene Benutzeroberfläche bereitstellen, um die Zustimmung des Benutzers zu verlangen.
Hinweis
Die App sollte nicht explizit aufrufen NotifyUserConfirmation
, wenn sie kein Benutzerbestätigungsdialogfeld implementiert. Das Modul Absturz behandelt das Implizite Senden von Protokollen für Sie.
Der folgende Rückruf zeigt, wie das SDK anweisen kann, auf die Benutzerbestätigung zu warten, bevor Abstürze gesendet werden:
Crashes.ShouldAwaitUserConfirmation = () =>
{
// Build your own UI to ask for user consent here. SDK doesn't provide one by default.
// Return true if you built a UI for user consent and are waiting for user input on that custom UI, otherwise false.
return true;
};
Falls Sie im obigen Rückruf zurückkehren true
, muss Ihre App (mit Ihrem eigenen Code) eine Benutzerberechtigung erhalten und dem SDK mit dem Ergebnis eine Nachricht mithilfe der folgenden API senden.
// Depending on the user's choice, call Crashes.NotifyUserConfirmation() with the right value.
Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
Crashes.NotifyUserConfirmation(UserConfirmation.Send);
Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);
Manchmal möchten Sie die status ihres App-Absturzes kennen. Ein häufiger Anwendungsfall ist, dass Sie möglicherweise eine Benutzeroberfläche anzeigen möchten, die den Benutzern mitteilt, dass Ihre App einen Absturzbericht übermittelt. Falls Ihre App nach dem Start schnell abstürzt, möchten Sie das Verhalten der App anpassen, um sicherzustellen, dass die Absturzprotokolle übermittelt werden können. App Center-Abstürze bietet drei verschiedene Rückrufe, die Sie in Ihrer App verwenden können, um über die Vorgänge benachrichtigt zu werden:
Crashes.SendingErrorReport += (sender, e) =>
{
// Your code, e.g. to present a custom UI.
};
Falls Netzwerkprobleme oder ein Ausfall des Endpunkts auftreten und Sie die App neu starten, SendingErrorReport
wird nach dem Prozessneustart erneut ausgelöst.
Der folgende Rückruf wird aufgerufen, nachdem das SDK erfolgreich ein Absturzprotokoll gesendet hat.
Crashes.SentErrorReport += (sender, e) =>
{
// Your code, e.g. to hide the custom UI.
};
Crashes.FailedToSendErrorReport += (sender, e) =>
{
// Your code goes here.
};
FailedToSendErrorReport
Empfangen bedeutet, dass ein nicht wiederherstellbarer Fehler auftritt, z. B. ein 4xx-Code. Beispielsweise bedeutet 401 , dass falsch appSecret
ist.
Dieser Rückruf wird nicht ausgelöst, wenn es sich um ein Netzwerkproblem handelt. In diesem Fall versucht das SDK immer wieder (und hält auch Wiederholungen an, während die Netzwerkverbindung ausfällt).
Sie können binär- und Textanlagen zu einem Absturzbericht hinzufügen. Das SDK sendet sie zusammen mit dem Absturz, sodass Sie sie im App Center-Portal sehen können. Der folgende Rückruf wird direkt vor dem Senden des gespeicherten Absturzes von früheren Anwendungsstarts aufgerufen. Es wird nicht aufgerufen, wenn der Absturz auftritt. Stellen Sie sicher, dass die Anlagedatei nicht benannt minidump.dmp
ist, da dieser Name für Minidumpdateien reserviert ist. Hier sehen Sie ein Beispiel für das Anfügen von Text und einem Bild an einen Absturz:
Crashes.GetErrorAttachments = (ErrorReport report) =>
{
// Your code goes here.
return new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
};
Hinweis
Die Größenbeschränkung beträgt derzeit 7 MB. Der Versuch, eine größere Anlage zu senden, löst einen Fehler aus.
Sie können App Center-Abstürze zur Laufzeit aktivieren und deaktivieren. Wenn Sie es deaktivieren, wird vom SDK keine Absturzberichte für die App ausgeführt.
Crashes.SetEnabledAsync(false);
Um App Center-Abstürze erneut zu aktivieren, verwenden Sie dieselbe API, übergeben true
sie aber als Parameter.
Crashes.SetEnabledAsync(true);
Sie müssen diesen Aufruf nicht abwarten, um andere API-Aufrufe (z IsEnabledAsync
. B. ) konsistent auszuführen.
Der Zustand wird im Speicher des Geräts bei allen Anwendungsstarts beibehalten.
Sie können auch überprüfen, ob App Center-Abstürze aktiviert ist oder nicht:
bool isEnabled = await Crashes.IsEnabledAsync();
Mit App Center können Sie auch Fehler mithilfe von behandelten Ausnahmen nachverfolgen. Verwenden Sie dazu die - TrackError
Methode:
try {
// your code goes here.
} catch (Exception exception) {
Crashes.TrackError(exception);
}
Eine App kann optional Eigenschaften an einen behandelten Fehlerbericht anfügen, um weiteren Kontext bereitzustellen. Übergeben Sie die Eigenschaften als Wörterbuch von Schlüssel-Wert-Paaren (nur Zeichenfolgen), wie im folgenden Beispiel gezeigt.
try {
// your code goes here.
} catch (Exception exception) {
var properties = new Dictionary<string, string>
{
{ "Category", "Music" },
{ "Wifi", "On"}
};
Crashes.TrackError(exception, properties);
}
Sie können auch optional Binär- und Textanlagen zu einem behandelten Fehlerbericht hinzufügen. Übergeben Sie die Anlagen als Array von ErrorAttachmentLog
Objekten, wie im folgenden Beispiel gezeigt.
try {
// your code goes here.
} catch (Exception exception) {
var attachments = new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
Crashes.TrackError(exception, attachments: attachments);
}