Langsung ke konten

Debugging Dasar di Python: Melacak Penyebab Bug

Debugging adalah cara melacak penyebab bug di Python. Artikel ini membahas membaca pesan error, print debugging, breakpoint, dan debugger di VS Code.

Belajar Python Level Basic
Belajar Python Level Basic
Advertisement

Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah membahas Best Practice Python (PEP 8). Sekarang kita hadapi kode yang berperilaku tidak sesuai harapan.

Ada dua jenis masalah dalam menulis program. Yang pertama program berhenti dengan pesan error. Yang kedua lebih menjengkelkan: program berjalan mulus, tapi hasilnya salah. Debugging adalah keterampilan melacak penyebab keduanya.

Apa itu Debugging?

Debugging adalah proses mencari dan memperbaiki penyebab program tidak berjalan sesuai harapan. Istilah “bug” sendiri sudah dipakai sejak era komputer awal untuk menyebut kesalahan pada program.

Kunci debugging yang baik adalah berhenti menebak. Ganti tebakan dengan pemeriksaan: cari tahu di baris mana nilainya mulai menyimpang, lalu telusuri ke belakang.

Membaca Pesan Error

Langkah pertama selalu membaca pesan error dengan tenang. Seperti yang dibahas di artikel tentang exception, bacalah traceback dari bawah ke atas.

Traceback (most recent call last):
  File "hitung.py", line 8, in <module>
    print(rata_rata([80, 90, 100]))
  File "hitung.py", line 5, in rata_rata
    return total / len(angka)
TypeError: unsupported operand type(s) for /: 'str' and 'int'

Dari laporan ini kita tahu:

  • Kesalahan terjadi di hitung.py baris 5.
  • Jenisnya TypeError.
  • Penyebabnya operasi / antara str dan int.

Pesannya sudah menunjukkan bahwa total ternyata string, bukan angka. Dari situ kita bisa melacak mengapa total berisi string.

Debugging dengan print()

Cara paling sederhana untuk melihat apa yang terjadi adalah mencetak nilai di titik-titik tertentu. Teknik ini disebut print debugging.

Misalnya function berikut menghasilkan nilai yang salah:

def rata_rata(angka):
    total = 0
    for nilai in angka:
        total += nilai
    return total / (len(angka) + 1)

print(rata_rata([80, 90, 100]))   # 67.5, padahal seharusnya 90.0

Tidak ada pesan error, hanya hasil yang keliru. Tambahkan print() untuk mengintip nilai di dalamnya:

def rata_rata(angka):
    total = 0
    for nilai in angka:
        total += nilai

    print(f"total = {total}")            # total = 270
    print(f"jumlah data = {len(angka)}")  # jumlah data = 3

    return total / (len(angka) + 1)

print(rata_rata([80, 90, 100]))

Dari cetakan itu terlihat total sudah benar 270, tapi pembaginya len(angka) + 1 bernilai 4. Seharusnya pembaginya 3. Tambahan + 1 itulah bugnya.

def rata_rata(angka):
    total = 0
    for nilai in angka:
        total += nilai
    return total / len(angka)

print(rata_rata([80, 90, 100]))   # 90.0

Print debugging cepat dan tidak butuh alat tambahan. Kelemahannya, kode jadi penuh print() yang harus dibersihkan lagi setelah selesai. Untuk kasus yang lebih rumit, gunakan debugger.

breakpoint()

Python menyediakan function breakpoint() untuk menghentikan program dan memeriksa keadaan saat itu. Saat dijalankan, program berhenti dan membuka sesi interaktif:

def rata_rata(angka):
    total = 0
    for nilai in angka:
        total += nilai

    breakpoint()

    return total / len(angka)

rata_rata([80, 90, 100])

Di dalam sesi itu kamu bisa mengetik nama variabel untuk melihat nilainya:

(Pdb) total
270
(Pdb) len(angka)
3
(Pdb) continue
90.0

Beberapa perintah yang berguna:

PerintahFungsi
nJalankan baris berikutnya
sMasuk ke dalam function yang dipanggil
cLanjutkan sampai breakpoint berikutnya
p namaCetak nilai sebuah variabel
qKeluar dari sesi debug

Ingat untuk menghapus breakpoint() setelah selesai. Kalau tidak, program akan berhenti di situ setiap kali dijalankan.

Debugger di VS Code

Kalau kamu memakai VS Code, debugger visualnya jauh lebih nyaman daripada print(). Caranya:

  1. Klik di sebelah kiri nomor baris untuk menaruh breakpoint. Muncul titik merah.
  2. Tekan F5 atau pilih menu Run and Debug.
  3. Program berjalan dan berhenti di baris breakpoint.
  4. Periksa nilai variabel di panel Variables di sebelah kiri.
  5. Gunakan tombol Step Over (F10) untuk maju baris per baris, atau Step Into (F11) untuk masuk ke function.

Dengan debugger, kamu bisa melihat seluruh isi variabel tanpa menambahkan satu baris print() pun. Kode pun tetap bersih.

Strategi Melacak Bug

Selain alat, ada beberapa kebiasaan yang mempercepat pencarian bug.

Perkecil area masalah. Kalau program panjang, tentukan dulu bagian mana yang bermasalah. Beri print() di tengah alur untuk memastikan bagian awal sudah benar.

Bagi dua. Kalau tidak tahu di mana letak masalahnya, periksa di tengah. Setengah yang bermasalah tinggal dibagi dua lagi, sampai ketemu barisnya.

Uji dengan input terkecil. Coba satu data sederhana dulu. Bug sering lebih mudah terlihat pada kasus kecil.

Baca ulang kode dengan suara. Menjelaskan kode baris per baris, bahkan kepada benda mati, sering memunculkan kesalahan yang terlewat.

Periksa asumsi. Bug biasanya muncul karena satu nilai ternyata tidak seperti yang kamu kira. Cetak dan buktikan.

Contoh Kasus: Nilai yang Tertukar

Mari telusuri sebuah bug langkah demi langkah:

def cari_terbesar(data):
    terbesar = data[0]
    for nilai in data:
        if nilai < terbesar:
            terbesar = nilai
    return terbesar

print(cari_terbesar([3, 9, 1, 7]))   # 1, padahal seharusnya 9

Program mencari nilai terbesar, tapi mengembalikan yang terkecil. Tambahkan print() untuk melihat perbandingannya:

def cari_terbesar(data):
    terbesar = data[0]
    for nilai in data:
        print(f"bandingkan {nilai} dengan {terbesar}")
        if nilai < terbesar:
            terbesar = nilai
    return terbesar

Output:

bandingkan 3 dengan 3
bandingkan 9 dengan 3
bandingkan 1 dengan 3
bandingkan 7 dengan 1

Terlihat bahwa nilai yang lebih besar justru diabaikan, dan yang tersimpan adalah yang lebih kecil. Tanda < seharusnya >:

def cari_terbesar(data):
    terbesar = data[0]
    for nilai in data:
        if nilai > terbesar:
            terbesar = nilai
    return terbesar

print(cari_terbesar([3, 9, 1, 7]))   # 9

Satu karakter salah, dan seluruh hasilnya terbalik. Debugging menemukannya lewat pengamatan, bukan tebakan.

Kesalahan Umum Pemula

  • Menebak tanpa memeriksa — ubah kode sembarangan tanpa tahu penyebabnya, bug bisa tambah banyak.
  • Tidak membaca pesan error — padahal lokasi dan jenis masalahnya sudah disebut jelas.
  • Meninggalkan print() dan breakpoint() — kode jadi berisik saat dijalankan lagi.
  • Mengubah banyak hal sekaligus — kalau berhasil, tidak tahu bagian mana yang memperbaiki.
  • Mengabaikan kasus terkecil — mencoba data besar lebih dulu mempersulit pencarian.

Ringkasan

  • Debugging adalah proses melacak penyebab bug, bukan menebak
  • Baca traceback dari bawah ke atas untuk menemukan lokasi dan jenis error
  • print() di titik penting membantu melihat nilai yang sebenarnya
  • breakpoint() menghentikan program untuk diperiksa secara interaktif
  • Debugger VS Code menampilkan variabel dan langkah eksekusi tanpa mengubah kode
  • Perkecil area masalah, uji dengan input kecil, dan buktikan setiap asumsi

Langkah Selanjutnya

Semua bekal sudah lengkap: variabel, struktur kontrol, struktur data, function, error handling, file, module, dan cara merapikan serta melacak kode.

Sekarang saatnya menyatukan semuanya. Artikel selanjutnya adalah Proyek 1: Kalkulator Sederhana, tempat kamu memakai kembali hampir semua yang sudah dipelajari.