Skip to main content
Gunakan alur kerja ini untuk merekam crash native dan hang (aplikasi berhenti merespons) di main thread pada aplikasi iOS. Perekaman hang memerlukan UIKit. Unggah dSYM yang cocok untuk melihat lokasi sumber di stack frame. Aplikasi menyimpan laporan lokal saat crash. Pada peluncuran berikutnya, aplikasi Anda memanggil replay untuk mengirim bukti crash ke LogBrew. LogBrew tidak mengirim laporan Apple mentah.
Gunakan LogBrew Swift 0.1.6 atau yang lebih baru. Gunakan LogBrew CLI native 0.1.24 atau yang lebih baru untuk mengunggah artefak debug.
Gunakan konfigurasi ingest khusus proyek di dalam aplikasi. Gunakan login akun untuk mengunggah artefak dan membaca masalah. Kunci artefak proyek juga bisa mengunggah dari mesin build. Jangan pernah menyertakan token akses akun atau kunci artefak di aplikasi.

Rencanakan batas perekaman

Periksa kapan aplikasi Anda bisa me-replay setiap jenis kegagalan. Tetapkan nilai rilis sebelum build. Nilai ini harus mengidentifikasi versi dan build aplikasi. Gunakan nilai yang sama di SDK, unggahan dSYM, dan filter masalah. Jangan lampirkan payload pengguna, body permintaan, atau header ke metadata crash.

Tambahkan produk crash

Pertama, siapkan telemetri SDK untuk aplikasi Anda dengan panduan Integrasi SDK. Replay memakai client dan transport dari penyiapan itu. Tambahkan SDK publik melalui Swift Package Manager.
Tambahkan produk LogBrew untuk mengirim telemetri. Tambahkan LogBrewCrash hanya jika aplikasi secara eksplisit mengaktifkan perekaman crash atau hang native. Integrasi perekaman mendukung iOS 15 atau yang lebih baru. Simpan satu objek perekaman milik aplikasi, karena handler fatal native berlaku untuk seluruh proses.

Konfigurasikan satu identitas yang tepat

Gunakan proyek, rilis, lingkungan, dan layanan yang sama di penyiapan runtime dan unggahan artefak. LogBrew tidak menyimpulkan nilai ini dari data lain dan tidak menggantinya.
Pasang objek perekaman di main thread sebelum Anda membuat UI root. Buat direktori induknya terlebih dahulu. Pastikan direktori penyimpanan dimiliki aplikasi dan bersifat privat. Objek perekaman merekam exception Mach, signal, exception C++, dan exception Objective-C. Laporan lokal tidak menyertakan isi memori, nama antrean, atau log konsol. Laporan crash lokal bisa berisi detail aplikasi dan perangkat yang sensitif. Jauhkan laporan itu dari cadangan cloud dan direktori bersama. LogBrew mengirim UUID frame, arsitektur, dan offset, bukan laporan mentah. NativeCrashConfiguration punya dua batas opsional: Nilai di luar rentangnya membuat konfigurasi melempar crash_invalid_configuration.

Aktifkan perekaman hang

Perekaman hang mati jika watchdog bernilai nil. Untuk mengaktifkannya, ganti deklarasi watchdog di atas sebelum Anda memanggil install():
Ambang batas dinyatakan dalam detik, dari 1 sampai 30. Perekaman hang juga memerlukan artifactIdentity. Tanpa itu, konfigurasi melempar crash_invalid_configuration. Simpan satu objek crashCapture selama proses berjalan. Objek perekaman kedua tidak bisa dipasang. Panggilan install() pada objek itu melempar crash_capture_owned. Untuk mengubah ambang batas, gunakan nilai baru pada peluncuran aplikasi berikutnya. Hang yang pulih di-replay dengan crash.handled bernilai true. Hang yang masih berlangsung saat proses dihentikan di-replay dengan crash.handled bernilai false. Kedua bentuk menyertakan metadata numerik durationMs. Keduanya mempertahankan identitas artefak yang sama dengan yang dipakai frame crash fatal. Watchdog berhenti sementara saat aplikasi tidak aktif atau sedang terhubung ke debugger. Watchdog juga menahan perekaman saat tekanan termal tinggi. Ambang batas yang pendek bisa melaporkan pekerjaan main thread yang normal sebagai hang. Uji ambang batas dengan konfigurasi build yang Anda rilis. Status ditangani menunjukkan bahwa aplikasi sudah pulih. Status itu tidak menandai masalah sebagai selesai. Hang yang ditangani tetap sempat memblokir antarmuka, jadi tinjau juga hang itu.

Replay setelah peluncuran

Setelah objek perekaman terpasang, jalankan replay untuk laporan yang tertunda melalui klien SDK Anda.
Aplikasi Anda harus memanggil replay. Pemulihan hang saja tidak mengirim peristiwa. Panggil metode yang sama setelah pemulihan atau pada peluncuran berikutnya. Replay memproses laporan yang valid mulai dari yang terlama dan mempertahankan ID peristiwanya yang stabil. Pengiriman yang gagal membiarkan laporannya tetap tertunda. Pengiriman yang diterima menghapus laporan itu. Replay membuang laporan yang tidak bisa dibaca dan laporan yang lebih besar dari maxReplayBytes. Periksa ketiga jumlah itu. Jumlah tertunda yang bernilai nol saja tidak membuktikan pengiriman. Aktifkan pengiriman tahan lama sebelum replay jika permintaan yang gagal harus bertahan setelah restart berikutnya. Jangan panggil purge() selama pemulihan jaringan atau autentikasi yang rutin.

Unggah dSYM yang cocok

Arsipkan aplikasi dengan informasi debug aktif. Simpan dSYM dari build yang sama persis dengan yang dijalankan pengguna. Periksa UUID image di dalamnya.
Validasi artefak secara lokal sebelum mengunggah.
Ulangi --expect-image-uuid untuk setiap arsitektur yang diperlukan. Perintah gagal jika kumpulan UUID yang ditemukan berbeda dari kumpulan yang diharapkan. Periksa akses akun. Lalu jalankan perintah yang sama tanpa --dry-run.
Perintah unggah memvalidasi objek Apple yang didukung dan memverifikasi setiap identitas yang diunggah. Perintah ini tidak menyertakan path lokal atau nama file di metadata API. status di JSON menunjukkan hasilnya: Mesin build bisa mengunggah dengan kunci artefak proyek di LOGBREW_TOKEN, bukan dengan akses akun. Buat kunci seperti yang ditunjukkan di Buat kunci artefak. Unggahan itu melaporkan uploaded. Verifikasi setiap identitas nanti dengan akses akun:
status: "found" mengonfirmasi artefak. status: "missing" berarti LogBrew tidak punya artefak untuk identitas itu. Pemetaan frame mencocokkan UUID image dan identitas artefak lengkap, bukan nama file sumber. Build ulang dari sumber yang sama bisa menghasilkan UUID yang berbeda. Unggah bundle dSYM yang persis, bukan seluruh direktori build.

Verifikasi hasil yang dibaca dari LogBrew

Filter daftar masalah dengan lingkup runtime yang sama. Contoh ini memilih masalah unresolved. Masalah yang sudah selesai atau diarsipkan tidak muncul.
Respons daftar mengidentifikasi masalah terkelompok. Baca detailnya untuk meminta pemetaan frame di LogBrew.
Artefak yang cocok menambahkan objek symbolication. Contoh ini menampilkan sebagian kolom dari masalah dengan frame yang sudah dipetakan, bukan respons lengkap.

Baca bukti crash

Setiap frame punya status sendiri. Kolom symbolication.status memakai nilai yang sama: Tetap catat frame yang belum dipetakan sebagai belum dipetakan. Jangan laporkan frame itu sebagai stack kosong. LogBrew memetakan frame saat Anda membaca masalah. dSYM yang diunggah belakangan bisa memetakan frame dari peristiwa yang lebih awal. dSYM itu tidak bisa menambahkan frame yang tidak direkam peristiwa. Frame aplikasi mempersempit pencarian kode, tetapi tidak membuktikan penyebab. Untuk breadcrumb, rantai exception, dan bukti trace, baca investigasi masalah:
Dalam respons itu, frame dengan source: "symbolicated" berasal dari artefak yang diunggah. Frame dengan source: "captured" adalah lokasi yang dikirim aplikasi. Lihat Investigasi masalah untuk kolom respons. Pertahankan lingkup lengkap proyek, rilis, lingkungan, dan layanan di setiap pembacaan. Jangan perluas pencarian yang gagal ke proyek lain.

Verifikasi penyiapan produksi

Gunakan kegagalan uji yang disetujui di build yang sudah di-deploy. Jangan pernah memakai tindakan pelanggan sebagai pemicu. Periksa setiap item secara berurutan dan berhenti di kegagalan pertama:
  1. Identitas runtime cocok dengan identitas artefak yang diunggah.
  2. Peluncuran berikutnya me-replay satu peristiwa yang dikonfirmasi, dengan nol laporan yang dibuang dan nol laporan yang tertunda.
  3. Daftar masalah dalam lingkup itu mengembalikan masalah uji dengan status ditangani yang diharapkan.
  4. Frame aplikasi yang diharapkan berhasil dipetakan.
  5. Peluncuran bersih berikutnya tidak menambahkan kemunculan lain.

Pulihkan dengan aman

Untuk investigasi masalah secara umum lewat API, lihat Investigasi masalah.