Selamat siang, hari ini saya sarankan Anda membiasakan diri dengan terjemahan artikel tentang debug aplikasi iOS menggunakan LLDB.
Salah satu bagian paling menarik dari presentasi WWDC 2018,
Xcode dan debugging lanjutan di LLDB diperkenalkan oleh para insinyur Apple. Mereka memberikan beberapa tips bermanfaat tentang cara menggunakan breakpoints dalam Xcode dan debugger tingkat rendah (LLDB) untuk mengoptimalkan proses debugging bug, di mana pun pengembang menangkapnya.
Artikel ini terdiri dari tiga bagian, kita akan membahas poin-poin utama yang telah dikatakan di WWDC. Saya membuat proyek demo khusus untuk memahami secara menyeluruh bagaimana menggunakan berbagai jenis breakpoints (breakpoints) bersama dengan LLDB untuk menangkap dan men-debug bug dalam aplikasi Anda.
Proyek demoSaya membuat proyek tugas templat yang telah dipenuhi setiap pengembang iOS dengan satu atau lain cara. Sangat penting untuk memahami cara kerjanya sebelum mempelajari membaca artikel. Berikut adalah fungsi utama dari proyek demo:
- Ketika dibuka, kita melihat pengontrol tampilan tabel yang memuat daftar posting.
- Saat menggulir ke bawah, pengontrol tampilan tabel memuat posting baru.
- Secara total, Anda dapat memuat posting 7 kali .
- Anda dapat memperbarui daftar posting dengan menarik ke bawah menggunakan pengendali penyegaran (tarik ke bawah untuk menyegarkan).
- Di bilah navigasi di atas ada 2 label (label) yang menunjukkan berapa banyak posting telah diunduh (label kanan) dan berapa kali pengguna telah mengunggah posting (label kiri).
Anda dapat mengunduh proyek demo
dari sini jika Anda lebih suka Objective-C.
Jika Anda lebih suka Swift, maka
dari sini .
Luncurkan Xcode dan mari kita pergi!
Bug untuk diperbaiki!Jadi, Anda membiasakan diri dengan proyek dan mungkin memperhatikan kesalahan berikut:
- Saat menarik tabel ke bawah, penyegaran tidak memperbarui posting.
- Pengguna tidak menerima pemberitahuan apa pun (menggunakan pengontrol peringatan) bahwa permintaan HTTP belum selesai karena masalah koneksi.
- Anda dapat memuat posting lebih dari 7 kali.
- Indikator kiri (label) di bilah navigasi, yang bertanggung jawab untuk menghitung jumlah unduhan, tidak berfungsi.
Aturan penting: sampai akhir artikel ini, Anda tidak menghentikan kompiler dan tidak me-restart aplikasi setelah peluncuran pertama. Anda memperbaiki kesalahan selama eksekusi program.
Kekuatan tim instruksiMari kita beralih ke bug pertama.
1. Ketika Anda menarik tabel ke bawah, posting tidak diperbarui.Cara mereproduksi kesalahan:
- Luncurkan aplikasi, 10 posting pertama sudah dimuat.
- Gulir ke bawah untuk memuat lebih banyak posting.
- Gulir ke atas ke awal tabel dan seret ke bawah untuk menyegarkan.
- Posting baru tidak dimuat dan yang lama tidak hilang, dan penghitung posting tidak diatur ulang.
Pendekatan standar untuk memperbaiki kesalahan tersebut melibatkan memeriksa apa yang terjadi di dalam pemilih metode yang bertanggung jawab untuk UIRefreshControl tabel kami. Pergi ke
PostsTableViewController di
tanda pragma Segarkan bagian
dukungan kontrol . Dari fungsi setupRefreshControl, kita dapat menyimpulkan bahwa pemilih yang bertanggung jawab untuk memperbarui posting adalah fungsi
reloadNewPosts . Mari tambahkan breakpoint ke baris pertama fungsi ini dan cari tahu apa yang sebenarnya terjadi di sini. Sekarang gulir ke bagian atas tabel dan seret layar untuk menyegarkan.
Objektif-c
CepatDebugger berhenti di breakpoint yang Anda atur. Untuk studi lebih lanjut, klik tombol "lewati blok" dari debugger.
Objektif-c
CepatSekarang kita memiliki pemahaman tentang apa yang salah!
Kondisi "jika" tidak terpenuhi (yaitu, variabel boolean isPullDownToRefreshEnabled diatur ke NO) dan, sebagai hasilnya, kode untuk memperbarui posting dilewati.
Pendekatan standar melibatkan penghentian kompiler, maka Anda perlu mengatur isPullDownToRefreshEnabled sebagai YES / true dan ini akan menyelesaikan masalah. Tetapi akan jauh lebih mudah untuk menguji hipotesis kami terlebih dahulu sebelum membuat perubahan pada kode dan tanpa harus menghentikan kompilator. Di sinilah perintah instruksi debugger ternyata sangat berguna.
Klik dua kali pada breakpoint yang diinstal atau klik kanan pada "Edit Breakpoint" dan klik tombol "Add Action". Juga pilih jenis tindakan "Perintah Debugger".

Sekarang kita perlu mengatur properti isPullDownToRefreshEnabled sebagai YA / true. Tambahkan perintah berikut ke debugger.
Objektif-c
expression self.isPullDownToRefreshEnabled = YES

Cepat
expression self.isPullDownToRefreshEnabled = true

Selanjutnya, periksa bahwa kotak centang "Lanjutkan secara otomatis setelah mengevaluasi tindakan" dipilih. Dia bertanggung jawab untuk memastikan bahwa debugger
tidak berhenti di breakpoint setiap waktu dan secara otomatis terus bekerja dengan perintah yang baru ditambahkan. Sekarang gulir ke atas ke awal tabel dan seret ke bawah untuk menyegarkan.
Voila, pos baru dimuat dan diganti yang lama dan, karenanya, penghitung pos diperbarui.
Kami memecahkan masalah pertama, dapatkan senjata anti-bug Anda, kami lanjutkan ke yang kedua.
2. Pengguna tidak menerima pemberitahuan apa pun (menggunakan pengontrol peringatan) bahwa permintaan HTTP belum selesai karena masalah koneksi.Cara mereproduksi kesalahan:
- Putuskan koneksi internet di iPhone / simulator Anda.
- Gulir ke atas ke awal tabel dan seret ke bawah untuk menyegarkan.
- Posting baru tidak akan diunduh karena kesalahan koneksi internet.
- Pengguna tidak diperlihatkan pemberitahuan kesalahan apa pun.
Pergi ke
PostsTableViewController di bagian
pragma mark Networking . Ini persis memiliki satu fungsi
loadPosts . Itu menggunakan contoh manajer jaringan umum untuk menjalankan permintaan GET HTTP, yang mengembalikan array posting melalui penangan penyelesaian "sukses" atau
NSError melalui penangan penyelesaian "kegagalan".
Kita perlu menambahkan kode ke penutupan "tidak berhasil" untuk menampilkan pengontrol peringatan. Jika Anda pergi ke bagian
Dukungan tanda pragma, Anda akan melihat bahwa sudah ada fungsi
PresentNetworkFailureAlertController yang bertanggung jawab untuk menampilkan pengontrol peringatan yang diinginkan. Yang perlu kita lakukan adalah memanggil fungsi ini di dalam penutupan "gagal" di
loadPosts .
Cara tradisional adalah menghentikan simulator dan menambahkan kode yang diinginkan. Ayo pergi ke arah lain!
Tambahkan breakpoint di dalam penutupan "tidak berhasil" setelah baris
Objektif-c
[self updateUIForNetworkCallEnd];
Cepat
self.updateUIForNetworkCallEnd()
Klik dua kali pada breakpoint yang diinstal atau klik kanan pada "Edit Breakpoint" dan klik tombol "Add Action". Juga pilih jenis tindakan "Perintah Debugger".
Tambahkan perintah berikut ke debugger.
Objektif-c
expression [self presentNetworkFailureAlertController]

Cepat
expression self.presentNetworkFailureAlertController()

Verifikasi bahwa kotak centang "Lanjutkan secara otomatis setelah mengevaluasi tindakan" dipilih.
Dengan Internet dimatikan, gulirkan ke awal tabel dan seret ke bawah untuk memperbarui, atau Anda dapat menggulir ke bawah ke ujung tabel dan mencoba memuat posting baru. Inilah yang akan Anda lihat:

Apa yang baru saja kita lakukan disebut
" menyuntikkan
" kode menggunakan perintah yang ditambahkan ke debugger pada breakpoint tertentu.
Ringkasan kecilMari kita sekali lagi mencantumkan apa yang bisa kita lakukan dengan perintah debugger yang ditambahkan ke breakpoint:
- Beroperasi dengan nilai properti yang ada.
- Tambahkan baris kode baru.
Kedua tugas dilakukan selama eksekusi program. Kami pada dasarnya tidak perlu menghentikan kompiler untuk memperbaiki kesalahan dan memulai ulang aplikasi.
Apa selanjutnyaSelanjutnya, saya membawa perhatian Anda pada
bagian kedua artikel , di mana kami akan memperbaiki lebih banyak kesalahan dan mencari tahu tentang jenis lain dari breakpoint (breakpoint) - titik pengamatan (watchpoint).