Membaca stack trace adalah langkah awal yang baik, tetapi sering kali kita perlu menjeda eksekusi program dan memeriksa nilai variabel pada momen tertentu. IDE debugger seperti yang ada di IntelliJ IDEA memberikan kemampuan tersebut dengan cara memasang breakpoint dan menelusuri kode baris demi baris. Pada chapter ini kita akan mengenal komponen utama IDE debugger, pola penggunaan sehari-hari, dan kapan memilih step over dibanding step into. Kode contoh pada chapter ini bukan program yang harus dijalankan untuk melihat output, melainkan skenario yang akan kita bedah menggunakan debugger.
Komponen Utama IDE Debugger #
Saat kita membuka panel Debug di IntelliJ (SHIFT+F9 atau tombol serangga hijau), kita melihat beberapa panel utama:
- Frames: menampilkan call stack pada momen breakpoint. Frame paling atas adalah method yang sedang dieksekusi; frame di bawahnya adalah pemanggil method tersebut.
- Variables: daftar variabel lokal dan field pada scope saat ini. Nilai di-refresh otomatis setiap kali program berhenti di breakpoint.
- Watches: variabel atau ekspresi yang ingin kita pantau khusus, tidak terbatas pada scope lokal.
- Console: output program berjalan; breakpoint berikutnya dapat dipicu dari sini.
- Evaluate Expression (ALT+F8): kotak dialog untuk mengetik ekspresi Kotlin yang akan dievaluasi pada konteks frame saat ini.
Kode Demo untuk Latihan Debug #
Program berikut sederhana namun memiliki cukup banyak titik observasi: list pengguna, pencarian admin, penjumlahan karakter, dan iterasi kondisional. Kita akan menggunakan kode ini sebagai bahan latihan memasang breakpoint dan menelusuri eksekusi.
data class Pengguna(val id: Int, val nama: String, val peran: String)
fun main() {
// Program sederhana untuk demo IDE Debugger
val daftar = listOf(
Pengguna(1, "Budi", "admin"),
Pengguna(2, "Siti", "editor"),
Pengguna(3, "Dewi", "viewer")
)
println("=== Demo IDE Debugger ===")
println("Total pengguna: ${daftar.size}")
val admin = cariAdmin(daftar)
println("Admin ditemukan: ${admin?.nama ?: "(tidak ada)"}")
// Hitung total karakter semua nama
val totalKarakter = daftar.sumOf { it.nama.length }
println("Total karakter nama: $totalKarakter")
// Pola yang umum di-debug: loop dengan kondisi kompleks
for (pengguna in daftar) {
if (pengguna.peran == "editor") {
println("Editor: ${pengguna.nama}")
}
}
}
fun cariAdmin(daftar: List<Pengguna>): Pengguna? {
// Set breakpoint di baris return untuk memeriksa daftar
return daftar.firstOrNull { it.peran == "admin" }
}Output yang Dihasilkan:
=== Demo IDE Debugger ===
Total pengguna: 3
Admin ditemukan: Budi
Total karakter nama: 12
Editor: SitiPause dan Resume #
Pause dan Resume adalah operasi paling dasar. Setelah program berjalan dalam mode debug dan menyentuh breakpoint, eksekusi terhenti; kita bisa memeriksa variabel di panel Variables. Tombol Resume (F9) melanjutkan eksekusi sampai breakpoint berikutnya atau sampai program selesai. Bila program terjebak dalam loop tanpa breakpoint lebih lanjut, gunakan tombol Pause untuk menghentikannya kapan pun.
Step Over, Step Into, Step Out #
Tiga operasi step adalah inti dari navigasi debugger:
- Step Over (F8): eksekusi baris saat ini. Bila baris memanggil method, method tersebut dijalankan lengkap tanpa kita masuki. Cocok untuk method library atau method yang sudah yakin benar.
- Step Into (F7): bila baris saat ini memanggil method, debugger masuk ke method tersebut. Berguna saat kita ingin memeriksa detail implementasi method yang dicurigai.
- Step Out (SHIFT+F8): melanjutkan eksekusi sampai method saat ini selesai, lalu berhenti di baris pemanggil. Berguna bila kita sudah tidak perlu memeriksa sisa method yang sedang aktif.
Panel Variables dan Evaluate Expression #
Panel Variables menampilkan semua nilai dalam scope saat ini secara otomatis. Untuk objek kompleks, kita bisa mengklik panah di samping variabel untuk membuka field-nya. Evaluate Expression berguna saat kita ingin menguji hipotesis: misalnya mengetik daftar.filter { it.peran == "admin" }.size untuk melihat berapa banyak admin dalam daftar, tanpa harus mengubah kode sumber.
Referensi Lanjutan #
- IntelliJ IDEA Debugging — panduan resmi penggunaan debugger IntelliJ IDEA untuk kode Kotlin
- IntelliJ IDEA Managed Debugging — panduan managed debugging di IntelliJ IDEA
Penutup #
IDE debugger mengubah debugging dari kegiatan menebak menjadi observasi terstruktur. Pada chapter berikutnya kita akan memperdalam penggunaan breakpoint: line breakpoint, conditional breakpoint, method breakpoint, dan field watchpoint, untuk menjeda eksekusi tepat di momen yang kita inginkan.