Materi Pertemuan 13
Melakukan Debugging
Mempersiapkan kode program
Pada kesempatan kali ini saya akan berbagi tutorial, tentang kegunaan debug dan cara debug di netbeans IDE. Bila teman belum install netbeans IDE, bisa melihat tutorial sebelumnya, tentang bagaimana install netbeans IDE di windows.
Sebelum saya terjun ke contoh debug program java di Netbeans IDE, akan saya jelaskan sedikit apa itu debug dan apa kegunaan debug??? Debug membolehkan kita menjalankan sebuah program dengan interaktif, arti interaktif disini adalah kita bisa melihat alur source code dan variable ketika eksekusi program, debug juga berguna untuk mencari error yang tidak terlihat (bugs). Untuk menjalankan debug kita harus memberikan breakpoint didalam spesifik source code dimana eksekusi program akan berhenti ketika debug.
Setting
breakpoint di Netbeans caranya mudah tinggal double klik baris atau sourcode
yang mau teman kasih breakpoint atau klik kanan breakpoint -> toggle line
breakpoint, untuk lebih jelasnya bisa dilihat pada gambar dibawah ini
bila sukses memasang breakpoint, maka hasil nya akan tampak seperti pada gambar dibawah ini
Bug adalah segala macam cacat dalam program. Bisa saja cacatnya hanya berupa tampilan yang sedikit salah, bisa crash, bisa berupa bug security (harusnya hanya bisa diakses user X, bisa diakses user Y), kadang bug tertentu tidak muncul sampai kasus ekstreem (misalnya jika jumlah user banyak maka akan out of memory karena ada memory leak).
Sumber bug bisa banyak, dari mulai salah design, salah implementasi, salah konfigurasi, dsb. Sebagai programmer, bug yang akan saya bahas adalah dari sisi implementasi (coding). Biasanya seorang programmer akan belajar sedikit demi sedkit jenis bug dari pengalaman. Semakin banyak coding, semakin banyak salah, semakin banyak belajar.
Beberapa jenis bug sangat umum di semua bahasa (kesalahan logika, kesalahan aritmatika, dsb), tapi bug tertentu hanya muncul di bahasa tertentu atau jika menggunakan framework tertentu. Jadi pengalaman coding tetap merupakan guru yang utama.
Source Control
Jangan heran juga kalau kadang bug baru muncul karena hal sepele, misalnya source code berubah karena keyboard tersenggol. Msalnya sebuah konstanta 1000 terdelete angka nol terakhirnya (atau bertambah satu), atau tanda "lebih besar sama dengan” terhapus menjadi lebih besar saja. Di sini penggunakan version control (yang populer saat ini: Git) sangat berguna, Anda bisa mereview segala perubahan pada source code.
Source control juga memungkinkan kita melihat sejarah perubahan secara keseluruhan. Bagi security researcher, ini sering menjadi ladang untuk mencari bug baru di software open source. Jika ada yang menambahkan fungsionalitas baru, maka kemungkinan ada bug baru yang muncul.
Unit Testing
Mencari dan membetulkan bug itu susah (baik bug sendiri maupun orang lain), jadi hal pertama yang perlu dicoba adalah: menghindari bug. Hal yang paling dasar adalah: kita perlu memecah program kita menjadi unit yang kecil (unit di sini berupa fungsi/kelas/method) dan menguji tiap bagian kecil tersebut. Istilahnya untuk ini adalah unit testing. Kita bisa menggunakan library tertentu untuk unit testing, atau panggil saja fungsi yang akan ditest.
Saya akan mengasumsikan Anda minimal sudah bisa membuat aplikasi yang bisa dicompile dan bisa dijalankan. Jika Anda masih salah syntax, salah opsi untuk mengcompile, dsb, sebaiknya ada mulai lagi dari nol dan mulai perlahan.
Dengan memecah program menjadi unit kecil dan mengujinya satu persatu, maka kesalahan umumnya bisa dilokalisasi: fungsi X ini masih salah. Pertanyaan berikutnya adalah: apa salahnya?
Asersi
Saat ini kebanyakan bahasa memiliki fitur assert. Fitur ini memungkinkan kita melakukan pengecekan ekstra (yang biasanya tidak akan dilakukan di versi produksi). Assert ini biasanya digunakan untuk menyatakan kondisi yang pasti harus benar, karena jika tidak benar maka titik program berikutnya akan error fatal.
Ini adalah contohnya:
assert(index >= 0);
val = values[index];
Jika index kurang dari 0, maka ada sesuatu kesalahan fatal di program kita (mungkin kesalahan logika, mungkin ada hal yang lupa ditangani). Jika asersi diaktifkan biasanya program akan berhenti dengan "Assertion error”.
Di berbagai bahasa assert ini bisa diaktifkan/nonaktifkan dengan opsi tertentu. Jadi dalam versi rilis kita bisa membuang berbagai pengecekan asersi ini.
Pesan dari Compiler dan Linter
Sebelum melihat jauh ke mana-mana, coba lihat dulu apakah ada warning dari compiler Anda. Contohnya untuk potongan kode C ini:
int i;
printf("i = %d\n", i);
Compiler memberitahu:
warning: 'i' is used uninitialized in this function [-Wuninitialized]
Bacalah pesan error dan warning dengan teliti. Di situ dijelaskan bahwa variabel i tidak diinisialisasi. Di C, variabel lokal nilainya tidak bisa diprediksi jika tidak diinisialisasi.
Selain compiler, biasanya ada program yang namanya linter untuk sebuah bahasa yang bisa memberi peringatan jika ada sesuatu yang dianggap tidak standar atau aneh. Anda bisa melihat daftar lengkap software semacam ini di Wikipedia. Sebagian software ini mudah sekali diinstall, dan sebagian lagi terlalu rumit, tapi beberapa IDE sudah memiliki linter built in. Saran saya: jika Anda masih belajar dan tools linter tersedia, pakailah dan perhatikan outputnya, jika terlalu sulit mensetupnya ya sudah lupakan saja untuk saat ini.
Print debugging
Lalu berikutnya cara paling primitif dalam debugging adalah dengan menuliskan nilai saat ini menggunakan: "print” "echo”, "printf” atau sejenisnya.
Contoh sederhana, misalnya kita punya conditional di Python seperti ini (melakukan regular expression matching):
if (re.search(PATTERN, x)): # do something
Lalu bagian aksi tidak pernah dieksekusi, atau cuma dieksekusi beberapa kali. Apakah Anda yakin patternnya benar? Coba print sebelumnya, jangan-jangan regexnya masih salah untuk input tertentu:
print "Input ", x, "Match result ", re.search(PATTERN, x)
Tentunya tidak semua aplikasi bisa punya layar yang menampilkan teks itu (contohnya Game, atau aplikasi grafik lain). Biasanya cara yang lebih baik adalah menggunakan library untuk logging yang saat ini sudah built in di banyak bahasa (misalnya ada modul logger di Python, java.util.logging di Java, dsb). Output logging bisa dikonfigurasi sedetail apa, dan outputnya ke mana (ke file, ke terminal, ke jaringan, dsb).
Logging tidak hanya untuk proses development. Banyak aplikasi menyediakan fungsi logging untuk mencatat berbagai hal yang berhubungan dengan aplikasi untuk mendebug jika ada masalah ketika dijalankan. Contohnya aplikasi bisa menampilkan di lognya: "berusaha melakukan koneksi database ke server XX port YY dengan username ZZ”, yang bisa diikuti dengan "Koneksi berhasil”, atau "Koneksi Gagal, pesan error: invalid username or password”.
Memperbaiki program
Error bukanlah hal yang asing lagi dikalangan programmer. Mau tidak mau ketika kita sedang membuat aplikasi berbagai macam error pasti kita temui baik itu error yang level mudah sampai level sulit.
Banyak dari meraka yang sedang belajar programming sering putus asa ketika mendapat error khususnya error NullPointerException bahkan ada yang sampai menyerah. Pengalaman ini saya dapat ketika melihat teman-teman saya yang sedang belajar programming khusunya java sering mendapat error NullPointerException dan tak kunjung resolve.
beberapa penyebab kenapa kita sering kesulitan dalam mengatasi error, antar lain :
- Kurangnya pemahaman logic kita terhadap apa yang kita buat dan tentang pemrograman sendiri. Untuk mengatasi hal ini satu satunya cara yaitu jam terbang dalam menulis kode dan memahaminya
- Kurang bertanya ketema-teman yang sudah ahli, belum apa-apa sudah bilang sulit. Sudah konsultasi keteman yang lebih pintar belum?
- Kurangnya pemahaman fitur-fitur EDI yang kalian pakai menulis program
Nah, kali ini saya akan sharing tetang bagaimana menyelesaikan error NullPointerException melalui cara nomer tiga (3). Saya akan menggunakan Netbeans untuk bahan percobaan. Di Netbeans sudah ada fitur DEBUG yang mempermudah kita mendeteksi error NullPointerException disetiap baris program yang kita buat. Bagaimana caranya? Tulis program dibawah ini :
NullPointer.java
/* |
|
* To change this license header, choose License Headers in Project Properties. |
* To change this template file, choose Tools | Templates |
* and open the template in the editor. |
*/ |
package error; |
/** |
* |
* @author putuguna |
*/ |
public class NullPointer { |
public static void main(String[] args) { |
String kalimat = "Saya akan belajar java"; |
String kalimatTest=null; |
/** |
* kita anggap saja jika kita tidak tau |
* kalau kalimatTest itu nilainya null |
*/ |
String [] kalimatSplit = kalimatTest.split(""); |
for (int i = 0; i < kalimatSplit.length; i++) { |
System.out.println("Kalimatnya : " + kalimatSplit[i]); |
} |
} |
} |
view rawNullPointer.java hosted with ❤ by GitHub
Di beberapa baris program diatas adalah program sederhana untuk men split kalimat
berdasarkan spasi. Pada String KalimatTest saya set sengaja dengan nilai
null agar lebih mudah kalian mengerti bagaimana proses debugging nya.
Jika di running program tersebut akan mendapatkan hasil error NullPointerException. Lihat Gambar 1
NullPointerException terjadi karena sesuatu yang akan di eksekusi bernilai null
Mari kita debug satu persatu line
program yang kita tulis dari atas :
Arahkan pointer kalian ke sisi kiri dari kodingan di Netbeans (yang ada
angka-angkanya), kemudian klik saja (yang ada angka-angkanya) line berapa yang
mau di debug, nanti akan terlihat kota berwarna pink/merah/jingga. Lihat Gambar
2
Pada Gambar 2 saya memulai proses debugging dari line paling atas (tepat dibawah nama method). Setelah itu lihat menubar Netbeans, pilih debug file. Atau bisa juga dengan klik kanan pada kodingan kalian, pilih debug file.
Setalah kalian pilih debug file, lihat satu satu dengan menekan f8 agar proses debuggingnya melihat baris kode satu persatu. Lihat Gambar 3
Hasilnya terlihat di console yang saya kotakin hitam tersebut penyebab error null pointer exception.
Karna sudah ketahuan errornya, selanjutnya kita tinggal isi variable yang bernilai null tersebut nilai baru, bisa menggunakan variable diatasnya yang sudah ada nilaiinya, menjadi seperti ini :
String
kalimat = "Saya akan belajar java”;
String kalimatTest=kalimat;
sehinggal value dari kalimatTest menjadi Saya akan belajar java
Silakan kalian running lagi, pasti tidak ada error. Hasilnya seperti Gambar 5