Bagikan melalui


App Center Crash (Windows)

Penting

Visual Studio App Center dijadwalkan untuk dihentikan pada 31 Maret 2025. Meskipun Anda dapat terus menggunakan Visual Studio App Center hingga sepenuhnya dihentikan, ada beberapa alternatif yang direkomendasikan yang dapat Anda pertimbangkan untuk bermigrasi.

Pelajari selengkapnya tentang garis waktu dukungan dan alternatif.

Crash App Center akan secara otomatis menghasilkan log crash setiap kali aplikasi Anda mengalami crash. Log pertama kali ditulis ke penyimpanan perangkat dan ketika pengguna memulai aplikasi lagi, laporan crash akan dikirim ke App Center.

App Center SDK hanya mengumpulkan crash yang disebabkan oleh pengecualian .NET yang tidak tertangani. Ini tidak mengumpulkan crash asli misalnya saat menggunakan C atau C++. Namun, jika Anda memiliki aplikasi dengan C++ crash, Anda dapat mengunggahnya ke App Center melalui API crash unggahan.

Ikuti Memulai WPF/WinForms jika Anda belum menyiapkan SDK di aplikasi Anda.

Pengecualian yang tidak tertangani pada aplikasi WinForms

Catatan

Bagian ini dan sub bagian berikut hanya berlaku untuk WinForms. Anda dapat melewati bagian ini jika mengintegrasikan SDK di WPF.

Secara default, pengecualian yang tidak tertangani dalam aplikasi WinForms tidak memicu crash (aplikasi tidak keluar) jika debugger tidak terpasang.

Sebagai gantinya, Windows menampilkan dialog kepada pengguna opsi untuk melanjutkan atau keluar dari eksekusi aplikasi. Akibatnya, App Center SDK tidak dapat mengambil pengecualian ini secara otomatis (bahkan jika pengguna mengklik tombol Keluar ).

Crash dikumpulkan di App Center hanya jika menyebabkan aplikasi keluar secara otomatis. App Center hanya mendukung satu crash per sesi.

Ada dua cara untuk melaporkan pengecualian yang tidak tertangani di WinForms. Aplikasi dapat dikonfigurasi untuk crash pada pengecualian yang tidak tertangani, atau terus berjalan tetapi melaporkan pengecualian yang tidak tertangani sebagai kesalahan runtime.

Mengonfigurasi aplikasi untuk keluar saat crash

Ini adalah satu-satunya cara untuk melaporkan pengecualian yang tidak tertangani sebagai crash di App Center, membuat aplikasi keluar pada pengecualian yang tidak tertangani.

Untuk melakukannya, panggil metode Windows sebelum menginisialisasi SDK:

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

Jika opsi ini tidak dapat diterima di aplikasi, Anda dapat melaporkan pengecualian yang tidak tertangani sebagai kesalahan runtime (dijelaskan di bawah).

Laporkan pengecualian yang tidak tertangani sebagai kesalahan runtime

Jika aplikasi Anda harus terus berjalan setelah pengecualian yang tidak tertangani, Anda tidak dapat melaporkan pengecualian sebagai crash di App Center tetapi Anda dapat melaporkannya sebagai kesalahan.

Untuk melakukannya, Anda dapat menggunakan sampel kode berikut:

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

Catatan

Ketika debugger dilampirkan, pengecualian yang tidak tertangani akan menyebabkan aplikasi keluar (crash) kecuali handler dilampirkan ke Application.ThreadException.

Membuat crash pengujian

App Center Crashes memberi Anda API untuk menghasilkan crash pengujian untuk pengujian SDK yang mudah. API ini memeriksa konfigurasi debug vs rilis. Jadi Anda hanya dapat menggunakannya saat penelusuran kesalahan karena tidak akan berfungsi untuk aplikasi rilis.

Crashes.GenerateTestCrash();

Mendapatkan informasi selengkapnya tentang crash sebelumnya

App Center Crashes memiliki dua API yang memberi Anda informasi lebih lanjut jika aplikasi Anda mengalami crash.

Apakah aplikasi mengalami crash di sesi sebelumnya?

Kapan saja setelah memulai SDK, Anda dapat memeriksa apakah aplikasi mengalami crash di peluncuran sebelumnya:

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

Ini berguna jika Anda ingin menyesuaikan perilaku atau UI aplikasi Anda setelah crash terjadi. Beberapa pengembang memilih untuk menunjukkan UI tambahan untuk meminta maaf kepada pengguna mereka, atau ingin cara menghubungi setelah crash terjadi.

Catatan

Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali false sebelum dimulai.

Detail tentang crash terakhir

Jika aplikasi Anda mengalami crash sebelumnya, Anda bisa mendapatkan detail tentang crash terakhir.

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

Catatan

Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali null sebelum dimulai.

Ada banyak kasus penggunaan untuk API ini, yang paling umum adalah orang-orang yang memanggil API ini dan mengimplementasikan delegasi atau pendengar Crash kustom mereka.

Menyesuaikan penggunaan Crash App Center Anda

Crash App Center menyediakan panggilan balik bagi pengembang untuk melakukan tindakan tambahan sebelum dan saat mengirim log crash ke App Center.

Catatan

Atur panggilan balik sebelum memanggil AppCenter.Start(), karena App Center mulai memproses crash segera setelah awal.

Haruskah crash diproses?

Atur panggilan balik ini jika Anda ingin memutuskan apakah crash tertentu perlu diproses atau tidak. Misalnya, mungkin ada crash tingkat sistem yang ingin Anda abaikan dan yang tidak ingin Anda kirim ke App Center.

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

Jika privasi pengguna penting bagi Anda, Anda mungkin ingin mendapatkan konfirmasi pengguna sebelum mengirim laporan crash ke App Center. SDK mengekspos panggilan balik yang memberi tahu App Center Crash untuk menunggu konfirmasi pengguna sebelum mengirim laporan crash.

Jika Anda memilih untuk melakukannya, Anda bertanggung jawab untuk mendapatkan konfirmasi pengguna, misalnya melalui perintah dialog dengan salah satu opsi berikut: Selalu Kirim, Kirim, dan Jangan kirim. Berdasarkan input, Anda akan memberi tahu App Center Crash apa yang harus dilakukan dan crash kemudian akan ditangani dengan sesuai.

Catatan

SDK tidak menampilkan dialog untuk ini, aplikasi harus menyediakan UI sendiri untuk meminta persetujuan pengguna.

Catatan

Aplikasi tidak boleh memanggil NotifyUserConfirmation secara eksplisit jika tidak menerapkan dialog konfirmasi pengguna; modul Crash akan menangani pengiriman log untuk Anda secara implisit.

Panggilan balik berikut menunjukkan cara memberi tahu SDK untuk menunggu konfirmasi pengguna sebelum mengirim crash:

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

Jika Anda kembali true dalam panggilan balik di atas, aplikasi Anda harus mendapatkan izin pengguna (menggunakan kode Anda sendiri) dan mengirim pesan ke SDK dengan hasilnya menggunakan API berikut.

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

Mendapatkan informasi tentang status pengiriman untuk log crash

Terkadang, Anda ingin mengetahui status crash aplikasi Anda. Kasus penggunaan umum adalah Anda mungkin ingin menampilkan UI yang memberi tahu pengguna bahwa aplikasi Anda mengirimkan laporan crash, atau, jika aplikasi Anda crash dengan cepat setelah peluncuran, Anda ingin menyesuaikan perilaku aplikasi untuk memastikan log crash dapat dikirimkan. App Center Crashes menyediakan tiga panggilan balik berbeda yang dapat Anda gunakan di aplikasi Anda untuk diberi tahu tentang apa yang terjadi:

Panggilan balik berikut akan dipanggil sebelum SDK mengirim log crash

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

Jika kami mengalami masalah jaringan atau pemadaman pada titik akhir, dan Anda memulai ulang aplikasi, SendingErrorReport dipicu lagi setelah proses dimulai ulang.

Panggilan balik berikut akan dipanggil setelah SDK berhasil mengirim log crash

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

Panggilan balik berikut akan dipanggil jika SDK gagal mengirim log crash

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

Penerimaan FailedToSendErrorReport berarti terjadi kesalahan yang tidak dapat dipulihkan seperti kode 4xx . Misalnya, 401 berarti appSecret salah.

Panggilan balik ini tidak dipicu jika masalah jaringan. Dalam hal ini, SDK terus mencoba kembali (dan juga menjeda percobaan kembali saat koneksi jaringan tidak berfungsi).

Menambahkan lampiran ke laporan crash

Anda dapat menambahkan lampiran biner dan teks ke laporan crash. SDK akan mengirimkannya bersama dengan crash sehingga Anda dapat melihatnya di portal App Center. Panggilan balik berikut akan dipanggil tepat sebelum mengirim crash yang disimpan dari peluncuran aplikasi sebelumnya. Ini tidak akan dipanggil ketika crash terjadi. Pastikan file lampiran tidak dinamai minidump.dmp sebagai nama tersebut dicadangkan untuk file minidump. Berikut adalah contoh cara melampirkan teks dan gambar ke 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")
    };
};

Catatan

Batas ukuran saat ini adalah 7 MB. Mencoba mengirim lampiran yang lebih besar akan memicu kesalahan.

Mengaktifkan atau menonaktifkan Crash App Center saat runtime

Anda dapat mengaktifkan dan menonaktifkan App Center Crash saat runtime. Jika Anda menonaktifkannya, SDK tidak akan melakukan pelaporan crash untuk aplikasi.

Crashes.SetEnabledAsync(false);

Untuk mengaktifkan App Center Crash lagi, gunakan API yang sama tetapi lewati true sebagai parameter.

Crashes.SetEnabledAsync(true);

Anda tidak perlu menunggu panggilan ini untuk melakukan panggilan API lain (seperti IsEnabledAsync) konsisten.

Status ini bertahan di penyimpanan perangkat di seluruh peluncuran aplikasi.

Periksa apakah Crash App Center diaktifkan

Anda juga dapat memeriksa apakah App Center Crash diaktifkan atau tidak:

bool isEnabled = await Crashes.IsEnabledAsync();

Kesalahan Yang Ditangani

App Center juga memungkinkan Anda melacak kesalahan dengan menggunakan pengecualian yang ditangani. Untuk melakukannya, gunakan TrackError metode :

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

Aplikasi dapat secara opsional melampirkan properti ke laporan kesalahan yang ditangani untuk memberikan konteks lebih lanjut. Teruskan properti sebagai kamus pasangan kunci/nilai (hanya string) seperti yang ditunjukkan pada contoh di bawah ini.

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

Anda juga dapat menambahkan lampiran biner dan teks secara opsional ke laporan kesalahan yang ditangani. Teruskan lampiran sebagai array ErrorAttachmentLog objek seperti yang ditunjukkan pada contoh di bawah ini.

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