Delen via


App Center loopt vast (Windows)

Belangrijk

Visual Studio App Center is op 31 maart 2025 buiten gebruik gesteld, met uitzondering van de functies analyse en diagnose, die tot 30 juni 2026 nog steeds worden ondersteund. Meer informatie.

App Center-crashes genereren automatisch een crashlogboek telkens wanneer uw app vastloopt. Het logboek wordt eerst naar de opslag van het apparaat geschreven en wanneer de gebruiker de app opnieuw start, wordt het crashrapport verzonden naar App Center.

De App Center SDK verzamelt alleen crashes die worden veroorzaakt door niet-verwerkte .NET-uitzonderingen. Er worden geen systeemeigen crashes verzameld, bijvoorbeeld bij het gebruik van C of C++. Als u echter een app met C++-crashes hebt, kunt u deze uploaden naar App Center via de API voor het uploaden van crashes.

Volg de aan de slag met WPF/WinForms als u de SDK nog niet hebt ingesteld in uw toepassing.

Niet-verwerkte uitzonderingen voor WinForms-toepassingen

Opmerking

Deze sectie en de volgende subsecties zijn alleen van toepassing op WinForms. U kunt deze sectie overslaan als u de SDK op WPF integreert.

Standaard activeert een niet-verwerkte uitzondering in een WinForms-toepassing geen crash (de toepassing wordt niet afgesloten) als het foutopsporingsprogramma niet is gekoppeld.

In plaats daarvan wordt in Windows een dialoogvenster weergegeven voor de gebruiker om door te gaan of de app-uitvoering af te sluiten. De App Center SDK kan deze uitzonderingen dus niet automatisch vastleggen (zelfs als de gebruiker op de knop Afsluiten klikt).

Crashes worden alleen verzameld in App Center als de toepassing automatisch wordt afgesloten. App Center ondersteunt slechts één crash per sessie.

Er zijn twee manieren om niet-verwerkte uitzonderingen in WinForms te rapporteren. De toepassing kan worden geconfigureerd om vast te lopen bij niet-verwerkte uitzonderingen, of om door te gaan met uitvoeren en niet-verwerkte uitzonderingen te rapporteren als runtimefouten.

De toepassing configureren om af te sluiten bij vastlopen

Dit is de enige manier om de niet-verwerkte uitzondering te rapporteren als een crash in App Center, zodat de toepassing wordt afgesloten bij niet-verwerkte uitzonderingen.

Hiervoor roept u een Windows-methode aan voordat u de SDK initialiseert:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppCenter.Start(...);

Als deze optie niet acceptabel is in uw toepassing, kunt u de niet-verwerkte uitzondering rapporteren als een runtimefout (zoals hieronder wordt beschreven).

De niet-verwerkte uitzondering rapporteren als runtimefout

Als uw toepassing moet blijven werken na een niet-verwerkte uitzondering, kunt u de uitzondering niet rapporteren als een crash in App Center, maar u kunt deze in plaats daarvan rapporteren als een fout.

Hiervoor kunt u het volgende codevoorbeeld gebruiken:

Application.ThreadException += (sender, args) =>
{
    Crashes.TrackError(args.Exception);
};
AppCenter.Start(...);

Opmerking

Wanneer het foutopsporingsprogramma is gekoppeld, leiden niet-verwerkte uitzonderingen ertoe dat de toepassing wordt afgesloten (crashes), tenzij er een handler aan is gekoppeld Application.ThreadException.

Een testcrash genereren

App Center-crashes biedt u een API om een testcrash te genereren voor eenvoudige tests van de SDK. Met deze API wordt gecontroleerd op foutopsporing versus releaseconfiguraties. U kunt deze dus alleen gebruiken bij foutopsporing, omdat dit niet werkt voor release-apps.

Crashes.GenerateTestCrash();

Meer informatie over een eerdere crash

App Center Crashes heeft twee API's die u meer informatie geven voor het geval uw app is vastgelopen.

Is de app in de vorige sessie vastgelopen?

U kunt op elk gewenst moment na het starten van de SDK controleren of de app is vastgelopen tijdens de vorige start:

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

Dit is handig als u het gedrag of de gebruikersinterface van uw app wilt aanpassen nadat er een crash is opgetreden. Sommige ontwikkelaars kiezen ervoor om aanvullende gebruikersinterface weer te geven om zich te verontschuldigen bij hun gebruikers of willen een manier om contact op te nemen nadat er een crash is opgetreden.

Opmerking

Deze methode mag alleen worden gebruikt nadat Crashes is gestart. Het zal altijd false retourneren voordat het gestart is.

Details over de laatste crash

Als uw app eerder is gecrasht, kunt u meer informatie krijgen over de laatste crash.

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

Opmerking

Deze methode mag alleen worden gebruikt nadat Crashes is gestart. Het zal altijd null retourneren voordat het gestart is.

Er zijn talloze gebruiksvoorbeelden voor deze API, en de meest voorkomende is dat mensen deze API gebruiken om hun aangepaste Crashes-gedelegeerde of luisteraar te implementeren.

Pas de manier waarop u App Center Crashes gebruikt aan

App Center Crashes biedt callbacks voor ontwikkelaars om extra acties uit te voeren voordat en tijdens het verzenden van crashlogboeken naar App Center.

Opmerking

Stel de callback in voordat u aanroept AppCenter.Start(), omdat App Center begint met het verwerken van crashes direct na het starten.

Moet de crash worden verwerkt?

Stel deze callback in als u wilt bepalen of een bepaalde crash moet worden verwerkt of niet. Er kan bijvoorbeeld een crash op systeemniveau zijn die u wilt negeren en dat u niet naar App Center wilt verzenden.

Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
    // Check the report in here and return true or false depending on the ErrorReport.
    return true;
};

Als gebruikersprivacy belangrijk voor u is, wilt u mogelijk bevestiging van de gebruiker krijgen voordat u een crashrapport naar App Center verzendt. De SDK biedt een callback die App Center Crashes instrueert om te wachten op bevestiging van de gebruiker voordat crashrapporten worden verzonden.

Als u hiervoor kiest, bent u verantwoordelijk voor het verkrijgen van de bevestiging van de gebruiker, bijvoorbeeld via een dialoogvenster met een van de volgende opties: Altijd verzenden, verzenden en niet verzenden. Op basis van de invoer geeft u App Center Crashes instructies over wat te doen en wordt de crash vervolgens dienovereenkomstig afgehandeld.

Opmerking

In de SDK wordt hiervoor geen dialoogvenster weergegeven. De app moet een eigen gebruikersinterface opgeven om toestemming van de gebruiker te vragen.

Opmerking

De app moet NotifyUserConfirmation niet expliciet aanroepen als er geen dialoogvenster voor gebruikersbevestiging wordt geïmplementeerd; de Crashes-module stuurt impliciet logboeken voor u.

De volgende callback laat zien hoe de SDK moet wachten op bevestiging van de gebruiker voordat crashes worden verzonden:

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

Als u true retourneert in de callback hierboven, moet uw app de gebruikersmachtiging verkrijgen (met behulp van uw eigen code) en de SDK berichten met het resultaat via de volgende API.

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

Informatie ophalen over de verzendstatus voor een crashlogboek

Soms wilt u weten wat de status van de crash van uw app is. Een veelvoorkomend gebruiksvoorbeeld is dat u de gebruikersinterface wilt weergeven die de gebruikers vertelt dat uw app een crashrapport indient, of, als uw app snel vastloopt na de start, wilt u het gedrag van de app aanpassen om ervoor te zorgen dat de crashlogboeken kunnen worden verzonden. App Center Crashes biedt drie verschillende callbacks die u in uw app kunt gebruiken om te worden geïnformeerd over wat er gebeurt.

De volgende callback wordt aangeroepen voordat de SDK een crashlogboek verzendt

Crashes.SendingErrorReport += (sender, e) =>
{
    // Your code, e.g. to present a custom UI.
};

Als er netwerkproblemen of een storing op het eindpunt zijn en u de app opnieuw start, SendingErrorReport wordt deze opnieuw geactiveerd nadat het proces opnieuw is opgestart.

De volgende callback wordt aangeroepen nadat de SDK succesvol een crashrapport heeft verzonden.

Crashes.SentErrorReport += (sender, e) =>
{
    // Your code, e.g. to hide the custom UI.
};

De volgende callback wordt aangeroepen als de SDK een crashlogboek niet heeft verzonden

Crashes.FailedToSendErrorReport += (sender, e) =>
{
    // Your code goes here.
};

Het ontvangen FailedToSendErrorReport betekent dat er een niet-herstelbare fout is opgetreden, zoals een 4xx-code . 401 betekent bijvoorbeeld dat het appSecret verkeerd is.

Deze callback wordt niet geactiveerd als het een netwerkprobleem is. In dit geval blijft de SDK pogingen herhalen (en worden die pogingen ook gepauzeerd terwijl de netwerkverbinding verstoord is).

Bijlagen toevoegen aan een crashrapport

U kunt binaire en tekstbijlagen toevoegen aan een crashrapport. De SDK verzendt ze samen met de crash, zodat u ze kunt zien in de App Center-portal. De volgende callback wordt aangeroepen vlak voordat de opgeslagen crash van eerdere applicatiestarts wordt verstuurd. Deze wordt niet aangeroepen wanneer de crash plaatsvindt. Zorg ervoor dat het bijlagebestand niet de naam minidump.dmp heeft, aangezien die naam gereserveerd is voor minidump-bestanden. Hier volgt een voorbeeld van het koppelen van tekst en een afbeelding aan een crash:

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

Opmerking

De groottelimiet is momenteel 7 MB. Als u probeert een grotere bijlage te verzenden, zal er een fout optreden.

De App Center-functie voor crashes tijdens uitvoering in- of uitschakelen

U kunt App Center-crashes tijdens de uitvoering van de applicatie in- en uitschakelen. Als u deze optie uitschakelt, zal de SDK geen crashrapportage uitvoeren voor de app.

Crashes.SetEnabledAsync(false);

Om App Center Crashes opnieuw in te schakelen, gebruikt u dezelfde API, maar geeft u true door als parameter.

Crashes.SetEnabledAsync(true);

U hoeft deze aanroep niet te wachten om andere API-aanroepen (zoals IsEnabledAsync) consistent te maken.

De status blijft behouden in de opslag van het apparaat tijdens het starten van de toepassing.

Controleren of App Center Crashes is ingeschakeld

U kunt ook controleren of App Center-crashes is ingeschakeld of niet:

bool isEnabled = await Crashes.IsEnabledAsync();

Afgehandelde fouten

Met App Center kunt u ook fouten bijhouden met behulp van afgehandelde uitzonderingen. Gebruik hiervoor de TrackError methode:

try {
    // your code goes here.
} catch (Exception exception) {
    Crashes.TrackError(exception);
}

Een app kan desgewenst eigenschappen toevoegen aan een afgehandeld foutenrapport om verdere context te bieden. Geef de eigenschappen door als een woordenlijst van sleutel-waardeparen (alleen tekenreeksen) zoals weergegeven in het onderstaande voorbeeld.

try {
    // your code goes here.
} catch (Exception exception) {
    var properties = new Dictionary<string, string>
    {
        { "Category", "Music" },
        { "Wifi", "On"}
    };
    Crashes.TrackError(exception, properties); 
}

U kunt eventueel binaire en tekstbijlagen toevoegen aan een afgehandeld foutenrapport. Geef de bijlagen door als een matrix van ErrorAttachmentLog objecten, zoals wordt weergegeven in het onderstaande voorbeeld.

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