Xcode dan Advanced Debugging di LLDB: Bagian 1

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 demo

Saya 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 instruksi

Mari 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.

gambar
Objektif-c

gambar
Cepat

Debugger berhenti di breakpoint yang Anda atur. Untuk studi lebih lanjut, klik tombol "lewati blok" dari debugger.

gambar
Objektif-c

gambar
Cepat

Sekarang 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".

gambar

Sekarang kita perlu mengatur properti isPullDownToRefreshEnabled sebagai YA / true. Tambahkan perintah berikut ke debugger.

Objektif-c

expression self.isPullDownToRefreshEnabled = YES 


gambar

Cepat

 expression self.isPullDownToRefreshEnabled = true 

gambar

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] 

gambar

Cepat

 expression self.presentNetworkFailureAlertController() 

gambar

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:

gambar

Apa yang baru saja kita lakukan disebut " menyuntikkan " kode menggunakan perintah yang ditambahkan ke debugger pada breakpoint tertentu.

Ringkasan kecil

Mari 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 selanjutnya

Selanjutnya, 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).

Source: https://habr.com/ru/post/id431506/


All Articles