1. Sebelum memulai
Hingga saat ini, sebagian besar developer pemula mungkin akan mengetahui proses debug dengan Laporan log. Jika sudah menyelesaikan Unit 1, Anda juga akan mengetahui cara membaca pelacakan tumpukan dan meneliti pesan error. Meskipun keduanya adalah alat debug canggih, IDE modern menyediakan lebih banyak fungsi untuk membuat proses debug Anda lebih efisien.
Di pelajaran ini, Anda akan mempelajari debugger terintegrasi Android Studio, cara menjeda eksekusi aplikasi, dan cara mengeksekusi satu baris kode dalam satu waktu untuk menemukan sumber bug yang tepat. Anda juga akan mempelajari cara menggunakan fitur yang disebut Watches dan melacak variabel tertentu, tanpa harus menambahkan laporan log tertentu.
Prasyarat
- Anda sudah mengetahui cara membuka project di Android Studio.
- Pemahaman tentang logging di Kotlin.
Yang akan Anda pelajari
- Cara memasang debugger ke aplikasi yang sedang berjalan.
- Menggunakan titik henti sementara untuk menjeda aplikasi yang sedang berjalan dan memeriksa kode baris demi baris.
- Menambahkan ekspresi bersyarat ke titik henti sementara untuk menghemat waktu proses debug.
- Menambahkan variabel ke panel Watches untuk membantu proses debug.
Yang akan Anda butuhkan
- Komputer yang dilengkapi Android Studio.
2. Membuat project baru
Daripada men-debug aplikasi yang besar dan kompleks, kita akan memulai dengan project kosong dan memperkenalkan beberapa kode yang berisi bug untuk mendemonstrasikan alat proses debug di Android Studio.
Mulailah dengan membuat project Android Studio baru.
- Di layar Select a Project Template, pilih Blank Activity.
- Beri nama aplikasi Proses debug, pastikan bahasa disetel ke Kotlin dan lainnya tidak berubah.
- Anda akan disambut dengan project Android Studio baru, yang menampilkan file bernama
MainActivity.kt
.
Menghadirkan bug
Ingat contoh pembagian dengan nol dari pelajaran proses debug di Unit 1? Pada iterasi akhir loop, saat aplikasi mencoba melakukan pembagian dengan nol, aplikasi akan mengalami error dengan java.langArithmeticException
karena pembagian dengan nol tidak mungkin dilakukan. Bug tersebut ditemukan dan diperbaiki dengan memeriksa pelacakan tumpukan, dan asumsi ini telah diverifikasi menggunakan laporan log.
Karena Anda sudah memahami contoh tersebut, contoh ini akan digunakan untuk mendemonstrasikan cara menggunakan titik henti sementara. Titik henti sementara melewati kode satu baris dalam satu waktu tanpa perlu menambahkan laporan log dan menjalankan ulang aplikasi Anda terlebih dahulu.
- Buka
MainActivity.kt
dan ganti kode dengan kode berikut:
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
public val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
division()
}
fun division() {
val numerator = 60
var denominator = 4
repeat(5) {
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
}
- Jalankan aplikasi. Perhatikan bahwa aplikasi mengalami error seperti yang kita duga.
3. Melakukan debug dengan titik henti sementara
Saat mempelajari logging, Anda belajar menempatkan log secara strategis untuk membantu mengidentifikasi bug, dan memastikan bahwa bug telah diperbaiki. Namun, saat dihadapkan pada bug yang tidak Anda ketahui, terkadang sulit untuk membuat laporan log atau mengetahui variabel mana yang harus dicetak. Sering kali, Anda hanya dapat menemukan informasi ini pada runtime.
fun division() {
val numerator = 60
var denominator = 4
repeat(5) {
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
Di sinilah titik henti sementara dapat digunakan. Meskipun kurang memahami penyebab bug berdasarkan informasi di pelacakan tumpukan, Anda dapat menambahkan titik henti sementara yang berfungsi sebagai tanda berhenti untuk baris kode tertentu. Setelah tercapai, titik henti sementara akan menjeda eksekusi, sehingga Anda dapat menggunakan alat debug lainnya saat runtime untuk melihat masalah yang terjadi serta kode mana yang bermasalah.
Memasang debugger
Di balik layar, Android Studio menggunakan alat bernama Android Debug Bridge, yang juga dikenal dengan singkatan ADB. Ini adalah alat command line yang terintegrasi ke dalam Android Studio dan menyediakan kemampuan proses debug, seperti titik henti sementara, untuk aplikasi yang sedang berjalan. Alat untuk proses debug sering disebut debugger.
Untuk menggunakan atau memasang debugger ke aplikasi, Anda tidak dapat langsung menjalankan aplikasi dengan Run > Run seperti sebelumnya. Sebagai gantinya, Anda dapat menjalankan aplikasi dengan Run > Debug 'app'.
Menambahkan titik henti sementara ke project
Lakukan langkah-langkah berikut untuk melihat titik henti sementara berfungsi:
- Tambahkan titik henti sementara dengan mengklik gutter di samping nomor baris yang ingin Anda jeda. Titik akan muncul di samping nomor baris dan baris tersebut akan ditandai.
- Jalankan aplikasi yang telah dipasangi debugger menggunakan Run > Debug 'app' atau ikon di toolbar. Saat aplikasi diluncurkan, Anda akan melihat layar seperti ini:
Setelah aplikasi diluncurkan, Anda akan melihat titik henti sementara yang ditandai saat diaktifkan.
Di bagian bawah layar tempat Anda sebelumnya melihat jendela Logcat, tab Debug baru telah terbuka.
Di sisi kiri adalah daftar fungsi, daftar yang sama dengan daftar yang muncul di pelacakan tumpukan. Di sisi kanan adalah panel tempat Anda dapat memeriksa nilai setiap variabel dalam fungsi saat ini (yaitu division()
). Di bagian atas, ada juga tombol yang membantu Anda menavigasi program saat dijeda. Tombol yang akan sering Anda gunakan adalah Step Over yang mengeksekusi satu baris kode yang ditandai.
Lakukan langkah-langkah berikut untuk men-debug kode:
- Setelah titik henti sementara tercapai, baris 19 (mendeklarasikan variabel
numerator
) sekarang ditandai, tetapi belum berjalan. Gunakan tombol Step Over untuk mengeksekusi baris 19. Baris 20 sekarang akan ditandai.
- Tetapkan titik henti sementara pada baris 22. Di sini terjadi pembagian dan merupakan baris pengecualian yang dilaporkan oleh pelacakan tumpukan.
- Gunakan tombol Resume Program di sebelah kiri jendela Debug untuk membuka titik henti sementara berikutnya. Jalankan fungsi
division()
lainnya.
- Perhatikan bahwa eksekusi akan berhenti di baris 17 sebelum mengeksekusinya.
- Nilai setiap variabel
numerator
dandenominator
akan ditampilkan di samping deklarasi variabel tersebut. Nilai variabel dapat dilihat di jendela debug di tab Variables.
- Tekan tombol Resume Program di sebelah kiri jendela debug sebanyak empat kali lagi. Setiap kali tombol ditekan, loop akan menjeda dan mengamati nilai
numerator
dandenominator
. Pada iterasi terakhir,numerator
harus60
, dandenominator
harus0
. Anda tidak dapat membagi 60 dengan 0.
Anda sekarang mengetahui baris kode penyebab bug yang tepat, dan mengetahui alasan persisnya. Seperti sebelumnya, Anda dapat memperbaiki bug dengan mengubah frekuensi pengulangan kode dari 5
menjadi 4
.
fun division() {
val numerator = 60
var denominator = 4
repeat(4) {
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
4. Menetapkan syarat untuk titik henti sementara
Di bagian sebelumnya, Anda harus melewati setiap iterasi loop hingga penyebutnya nol. Pada aplikasi yang lebih rumit, hal ini dapat merepotkan jika Anda memiliki lebih sedikit informasi tentang bug. Namun, jika Anda memiliki asumsi seperti aplikasi hanya mengalami error saat penyebutnya nol, Anda dapat mengubah titik henti sementara agar hanya akan tercapai jika asumsi ini terpenuhi, tanpa harus melalui setiap iterasi loop.
- Jika perlu, masukkan kembali bug dengan mengubah
4
menjadi5
di loop berulang.
repeat(4) {
...
}
- Tempatkan titik henti sementara baru pada baris dengan pernyataan
repeat
.
- Klik kanan ikon titik henti sementara berwarna merah. Akan muncul menu berisi beberapa opsi, seperti apakah titik henti sementara diaktifkan atau tidak. Titik henti sementara yang dinonaktifkan masih ada, tetapi tidak akan dipicu saat runtime. Anda juga memiliki opsi untuk menambahkan ekspresi Kotlin yang jika dievaluasi ke true (benar), titik henti sementara akan dipicu. Misalnya, jika Anda menggunakan ekspresi
denominator > 3
, titik henti sementara hanya akan dipicu pada iterasi pertama loop. Untuk hanya memicu titik henti sementara saat aplikasi Anda berpotensi membagi dengan nol, setel ekspresi kedenominator == 0
. Opsi untuk titik henti sementara akan terlihat seperti berikut:
- Jalankan aplikasi menggunakan Run > Debug 'app' dan pastikan titik henti sementara tercapai.
Anda dapat melihat bahwa penyebutnya sudah 0. Titik henti sementara hanya dipicu jika syarat tersebut terpenuhi, sehingga menghemat waktu dan tenaga Anda untuk meneliti kode.
- Seperti sebelumnya, Anda melihat bahwa bug disebabkan oleh loop yang mengeksekusi satu baris kode terlalu sering, yakni ketika penyebut disetel ke 0.
Menambahkan watches
Jika ingin memantau nilai tertentu saat proses debug, Anda tidak perlu melakukan penelusuran di tab Variables untuk menemukannya. Anda dapat menambahkan sesuatu yang disebut Watches untuk memantau variabel tertentu. Variabel ini akan terlihat di panel debug. Saat eksekusi dijeda dan variabel berada dalam cakupan, variabel tersebut akan terlihat di panel Watches. Hal ini membuat proses debug Anda lebih efisien saat bekerja dengan project yang lebih besar. Anda dapat melacak semua variabel yang relevan dalam satu tempat.
- Dalam tampilan debug, di sebelah kanan panel variabel, harus ada panel kosong lain yang disebut Watches. Klik tombol plus di pojok kiri atas. Anda mungkin melihat opsi menu yang bertuliskan New Watch.
- Ketik nama variabel,
denominator
, di kolom yang disediakan, lalu klik enter. - Jalankan kembali aplikasi dengan Run > debug ‘app', dan amati bahwa saat titik henti sementara tercapai, Anda akan melihat nilai penyebut dalam panel Watches.
5. Selamat
Rangkuman:
- Anda dapat menyetel titik henti sementara untuk menjeda eksekusi aplikasi.
- Saat eksekusi dijeda, Anda dapat "step over" (melewati ke bagian berikutnya) untuk mengeksekusi satu baris kode saja.
- Anda dapat menetapkan pernyataan bersyarat hanya untuk memicu titik henti sementara berdasarkan ekspresi Kotlin.
- Watches memungkinkan Anda mengelompokkan variabel yang Anda inginkan saat melakukan debug.