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.pybaris 5. - Jenisnya
TypeError. - Penyebabnya operasi
/antarastrdanint.
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:
| Perintah | Fungsi |
|---|---|
n | Jalankan baris berikutnya |
s | Masuk ke dalam function yang dipanggil |
c | Lanjutkan sampai breakpoint berikutnya |
p nama | Cetak nilai sebuah variabel |
q | Keluar 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:
- Klik di sebelah kiri nomor baris untuk menaruh breakpoint. Muncul titik merah.
- Tekan
F5atau pilih menu Run and Debug. - Program berjalan dan berhenti di baris breakpoint.
- Periksa nilai variabel di panel Variables di sebelah kiri.
- 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()danbreakpoint()— 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 sebenarnyabreakpoint()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.
