Xcode dan Advanced Debugging di LLDB: Bagian 2

Selamat siang, hari ini saya membawa perhatian Anda pada bagian kedua artikel tentang debugging aplikasi di LLDB.

Pada bagian pertama, kami menemukan cara menggunakan breakpoints di Xcode untuk memodifikasi properti variabel yang ada dan menambahkan baris kode melalui perintah instruksi.

Saya membuat proyek demo dengan sengaja dengan beberapa kesalahan untuk mengetahui cara menggunakan berbagai jenis breakpoint di LLDB untuk men-debug aplikasi.

Jika Anda belum mempelajari bagian pertama artikel, lebih baik memulainya. Biarkan saya mengingatkan Anda tentang aturan penting dari tutorial ini: Sampai akhir artikel ini, Anda tidak menghentikan kompiler dan tidak me-restart aplikasi setelah peluncuran pertama. Anda memperbaiki kesalahan selama eksekusi program.

Titik pantau

Jadi, kesalahan berikut dalam aplikasi:

3. Anda dapat memuat posting lebih dari 7 kali.

Cara mereproduksi kesalahan:

  • Nyalakan Internet di iPhone / simulator Anda
  • Gulir ke bawah ke ujung tabel untuk memuat lebih banyak posting.
  • Anda dapat memuat posting lebih dari 7 kali (walaupun dalam aplikasi ini pengguna seharusnya tidak memiliki kesempatan seperti itu).

Sebagai salah satu opsi untuk mendeteksi kesalahan, Anda perlu mengetahui bagaimana halaman variabel bilangan bulat diperbarui setelah posting baru dimuat pada halaman. Karena Anda masih belum terbiasa dengan kode saya, Anda perlu meluangkan waktu untuk memahami apa yang terjadi di dalamnya.

Jangan khawatir. Terapkan sihir.

Dari bagian pertama artikel kami mengetahui bahwa permintaan GET HTTP dijalankan di bagian pragma mark Networking . Ini persis mengandung satu fungsi loadPosts . Tempatkan breakpoint pada baris pertama fungsi ini dan seret tabel ke bawah untuk memperbarui. Compiler akan berhenti di breakpoint ini.

gambar
Objektif-c

gambar
Cepat

Di jendela bawah debugger, klik tombol "Tampilkan Variabel". Sebuah jendela baru akan muncul di sebelah kiri, di mana Anda akan melihat semua variabel PostsTableViewController.

gambar

Arahkan kursor ke pageNumber, klik kanan dan pilih “Watch _pageNumber” / “Watch pageNumber” untuk Objective-C dan Swift, masing-masing.

gambar
Objektif-c

gambar
Cepat

Jadi, Anda membuat apa yang disebut titik pantauan untuk variabel pageNumber. Watchpoint adalah jenis breakpoint yang menghentikan debugger setiap kali nilai variabel disetel ke perubahan.

gambar
Objektif-c

gambar
Cepat

Lanjutkan program. Debugger berhenti dan Anda melihat sesuatu seperti berikut ini:

Objektif-c

gambar

  1. Merekam nilai lama dan baru dari variabel pageNumber .
  2. Melacak tumpukan kode yang mengubah nilai variabel jumlah halaman .
  3. Titik saat ini yang menyebabkan variabel pageNumber berubah adalah metode setter dari variabel ini.

Jika Anda merujuk ke langkah 1 dalam pelacakan tumpukan, ini akan mengarahkan Anda ke potongan kode berikut:

gambar

Cepat

gambar

  1. Debugger memberi tahu Anda bahwa titik pengamatan yang Anda atur telah mengungkapkan sesuatu.
  2. Melacak tumpukan kode yang mengubah nilai variabel jumlah halaman .
  3. Titik saat ini yang menyebabkan variabel pageNumber berubah adalah fungsi updateForNetworkCallEnd .

Adalah logis untuk menyimpulkan bahwa setiap kali setelah permintaan GET HTTP berhasil, variabel pageNumber bertambah 1 hingga variabel status (dari tipe enum) berada dalam keadaan "aktif". Variabel ini dapat memiliki 2 status: aktif ("aktif") atau tidak aktif ("tidak aktif"). Keadaan "aktif" berarti bahwa pengguna dapat memuat posting (yaitu, batas 7 unduhan belum tercapai). Keadaan "tidak aktif", sebaliknya, mengasumsikan bahwa pengguna tidak lagi dapat memuat posting. Sebagai hasilnya, kita perlu menambahkan logika ke fungsi updateForNetworkCallEnd , yang akan memeriksa variabel pageNumber dan mengatur variabel status ke status yang sesuai.

Seperti yang sudah Anda duga, jauh lebih mudah untuk menguji hipotesis terlebih dahulu tanpa menghentikan kompiler sebelum membuat perubahan pada kode.

Saya perhatikan bahwa di bagian Dukungan tanda pragma kita sudah memiliki fungsi yang kita butuhkan ( setToInactiveState ), yang menetapkan variabel keadaan menjadi "tidak aktif".
Tambahkan breakpoint satu baris di atas kondisi if . Juga tambahkan perintah instruksi berikut ke debugger.

Objektif-c

expression if (self.pageNumber >= 7) {[self setToInactiveState]} 

gambar

Cepat

 expression if (self.pageNumber >= 7) {setToInactiveState()} 


gambar

Setelah itu, hapus breakpoint pertama yang Anda gunakan untuk mengatur titik observasi. Juga nonaktifkan watchpoint itu sendiri.

gambar
Objektif-c

gambar
Objektif-c

gambar
Cepat

gambar
Cepat

Sekarang gulir ke atas tabel, seret ke bawah untuk menyegarkan dan mulai membalik.
Semuanya berhasil! Tetapi masih terlalu dini untuk merayakannya, kami masih memiliki satu bug untuk diperbaiki!

Apa selanjutnya

Bagian terakhir, bagian ketiga dari artikel, di mana kita belajar tentang tipe breakpoints lainnya - simbolik (breakpoints simbolik).

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


All Articles