共用方式為


App Center 崩潰 (MAUI 和 Xamarin)

這很重要

Visual Studio App Center 於 2025 年 3 月 31 日淘汰,但分析和診斷功能除外,這些功能將持續支援到 2026 年 6 月 30 日。 瞭解更多資訊。

App Center 崩潰會在每次應用程式當機時自動產生當機記錄檔。 記錄會先寫入裝置的記憶體,當使用者再次啟動應用程式時,當機報告會傳送至 App Center。 收集崩潰資訊適用於 Beta 和上線的應用程式,也就是已提交到 App Store 的應用程式。 當機記錄包含協助您修正當機的重要資訊。

如果您尚未在應用程式中設定 SDK,請遵循 開始使用 一節。

此外,iOS 上的當機記錄需要符號,請參閱 App Center 診斷檔 ,說明如何為您的應用程式提供符號。

備註

如果您附加調試程式,在iOS和Mac上,SDK 將不會儲存任何當機記錄檔。 當您當機 iOS 和 macOS 應用程式時,請確定除錯程式未附加。 在 Android 上,您可以在附加除錯器時發生當機,但在遇到未處理的例外狀況後,您需要繼續執行。

產生測試當機

App Center 當機提供 API 來產生測試當機,以便輕鬆測試 SDK。 此 API 會檢查偵錯與發行組態。 因此,您只能在偵錯時使用它,因為它不適用於發行應用程式。

Crashes.GenerateTestCrash();

取得先前當機的詳細資訊

App Center Crashes 有兩個 API,可以在應用程式當機時提供更多資訊。

應用程式在上一個會話中是否收到記憶體不足的警告?

在啟動 SDK 之後,您可以隨時檢查應用程式是否在上一個工作階段中收到記憶體警告:

bool hadMemoryWarning = await Crashes.HasReceivedMemoryWarningInLastSessionAsync();

備註

這個方法只能在 Crashes 已啟動後使用,開始之前它總是會傳回 false

備註

在某些情況下,記憶體不足的裝置無法傳送事件。

應用程式在上一個工作階段中是否當機?

在啟動 SDK 之後,您可以隨時檢查應用程式是否在上一次啟動中當機:

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

如果您想要在發生當機后調整應用程式的行為或 UI,這會派上用場。 有些開發人員選擇顯示其他UI來向使用者道歉,或想要在發生當機後取得聯繫的方法。

備註

這個方法只能在 Crashes 已啟動後使用,開始之前它總是會傳回 false

上次當機的詳細數據

如果您的應用程式先前當機,您可以取得上次當機的詳細數據。

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

備註

這個方法只能在 Crashes 已啟動後使用,開始之前它總是會傳回 null

此 API 有多種使用情境,其中最常見的是人們呼叫此 API 並實作他們自定義的 崩潰委派或監聽器

自訂 App Center 當機的使用方式

App Center 崩潰提供回呼函式,讓開發人員在將錯誤記錄送出至 App Center 之前以及執行其他動作時使用。

備註

在呼叫 之前,設置回呼 AppCenter.Start(),因為 App Center 在啟動後會立即開始處理當機。

是否應該處理當機?

如果您想要決定是否需要處理特定當機,請設定此回呼。 例如,您可能會想要忽略系統層級的崩潰,而且您也不希望將其傳送至 App Center。

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

如果用戶隱私權對於您很重要,您可能會想要先取得使用者確認,再將當機報告傳送至 App Center。 SDK 會公開回呼,告知 App Center 損毀在傳送任何損毀報告之前等候用戶確認。

如果您選擇這樣做,您必須負責取得使用者的確認,例如透過具有下列其中一個選項的對話框提示: 永遠傳送傳送不要傳送。 根據輸入,您將告訴 App Center 崩潰需執行的動作,然後會據以處理崩潰。

備註

SDK 不會顯示此對話框,應用程式必須提供自己的 UI 以要求使用者同意。

備註

如果應用程式未實作使用者確認對話框,則不應顯式呼叫 NotifyUserConfirmation,因為當機模組會自動為您處理傳送記錄。

下列回呼顯示如何告訴 SDK 等到使用者確認之後,再傳送錯誤回報:

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

如果您在上述回呼中傳回 true ,您的應用程式必須取得(使用您自己的程式碼)用戶許可權,並使用下列 API 將 SDK 訊息傳送給 SDK。

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

例如,您可以參考 我們的自定義對話範例

取得當機記錄檔傳送狀態的相關資訊

有時,您想要知道應用程式當機狀態。 常見的使用案例是,您可能會想要顯示UI,告知使用者您的應用程式正在提交當機報告,或者,如果app在啟動後快速當機,您想要調整應用程式的行為,以確保可以提交當機記錄。 App Center 當機提供三個不同的回呼,您可以在應用程式中用來通知發生什麼情況:

SDK 傳送當機記錄檔之前,將會調用下列回呼函式

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

如果我們在端點上有網路問題或中斷,而且您重新啟動應用程式, SendingErrorReport 則會在進程重新啟動后再次觸發。

在 SDK 成功傳送當機記錄檔後,將會執行下列回呼函數

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

如果 SDK 無法傳送當機記錄檔,將會叫用下列回呼

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

FailedToSendErrorReport接收表示發生無法復原的錯誤,例如發生 4xx 碼。 例如, 401 表示 appSecret 錯誤。

若是網路問題,則不會觸發此回呼。 在此情況下,SDK 會持續重試(並在網路連線關閉時暫停重試)。

將附件新增至當機報表

您可以將二進位和文字附件新增至當機報表。 SDK 會連同當機一起傳送它們,讓您可以在 App Center 入口網站中看到它們。 在傳送先前應用程式啟動時生成的預存當機報告之前,會立即調用以下的回呼函數。 當系統崩潰時,不會被調用。 請確定附件檔案 被命名為 minidump.dmp,因為該名稱是保留給迷你傾印檔案使用的。 以下是將文字和圖片附加至故障報告的範例:

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

備註

大小限制目前為 7 MB。 嘗試傳送較大的附件將會觸發錯誤。

在運行時間啟用或停用 App Center 當機

您可以在執行時間啟用和停用 App Center 崩潰功能。 如果您將其停用,SDK 將不會針對應用程式執行任何當機報告。

Crashes.SetEnabledAsync(false);

若要再次啟用 App Center 異常回報功能,請使用相同的 API,但傳遞 true 作為參數。

Crashes.SetEnabledAsync(true);

您不需要等候此呼叫,即可讓其他 API 呼叫 (例如) IsEnabledAsync保持一致。

狀態會保存在裝置跨應用程式啟動時的記憶體中。

備註

只在啟動 Crashes 之後,才能使用這個方法。

檢查應用程式中心崩潰是否已啟用

您也可以檢查 App Center 損毀是否已啟用:

bool isEnabled = await Crashes.IsEnabledAsync();

備註

這個方法只能在 Crashes 已啟動後使用,開始之前它總是會傳回 false

已處理的錯誤

App Center 也可讓您使用已處理的例外狀況來追蹤錯誤。 若要這樣做,請使用 TrackError 方法:

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

應用程式可以選擇性地將屬性附加至已處理的錯誤報告,以提供進一步的內容。 傳遞屬性做為索引鍵/值組的字典(僅限字串),如下列範例所示。

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

您也可以選擇性地將二進位和文字附件新增至已處理的錯誤報告。 傳遞附件作為ErrorAttachmentLog物件陣列,如下列範例所示。

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