Teilen über


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.

Erfahren Sie mehr über Supportzeitpläne und Alternativen.

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.

Nicht behandelte Ausnahmen für WinForms-Anwendungen

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.

Konfigurieren der Anwendung zum Beenden bei Einem Absturz

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).

Melden der nicht behandelten Ausnahme als Laufzeitfehler

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.ThreadExceptionangefügt.

Generieren eines Testabsturzes

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();

Weitere Informationen zu einem vorherigen Absturz

App Center-Abstürze verfügt über zwei APIs, die Ihnen weitere Informationen für den Fall liefern, dass Ihre App abgestürzt ist.

Ist die App in der vorherigen Sitzung abgestürzt?

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 .

Details zum letzten Absturz

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.

Anpassen der Nutzung von App Center-Abstürze

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.

Sollte der Absturz verarbeitet werden?

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);

Abrufen von Informationen zum sendenden status für ein Absturzprotokoll

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:

Der folgende Rückruf wird aufgerufen, bevor das SDK ein Absturzprotokoll sendet.

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.
};

Der folgende Rückruf wird aufgerufen, wenn das SDK ein Absturzprotokoll nicht senden konnte.

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).

Hinzufügen von Anlagen zu einem Absturzbericht

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.

Aktivieren oder Deaktivieren von App Center-Abstürze zur Laufzeit

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.

Überprüfen, ob App Center-Abstürze aktiviert ist

Sie können auch überprüfen, ob App Center-Abstürze aktiviert ist oder nicht:

bool isEnabled = await Crashes.IsEnabledAsync();

Behandelte Fehler

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);
}