--==** Silahkan Baca Sesuka hati anda.....!! Jangan lupa klik buku tamu ...!!**==--

Sabtu, 29 Oktober 2011

tips teknik debuging

Pertama kali, perlu saya sampaikan bahwa tips ini tidak lengkap. Ini hanya cara/metode yang saya tau dan saya gunakan. Saya yakin, masih banyak metode-metode lain yang lebih efektif dan lebih baik. Bahkan sebenarnya, ada satu buku khusus yang membahas masalah ini. Jadi, apabila ada rekan-rekan yang mempunyai metode lain, silahkan sharing. Semoga post ini bisa bermanfaat untuk rekan-rekan programmer foxpro/VFP (dan programmer bahasa lain juga) baik yang profesional maupun yang hanya sekedar hobi.

1. Apa itu debuging (baca: dibaging)?
Debuging sendiri berasal dari kata debug (baca: dibag). Debug artinya adalah mencari kesalahan, sehingga debuging berarti proses mencari kesalahan (sedikit pelajaran bahasa inggris; 'ing' menekankan proses 'sedang terjadi'). Ada sejarahnya kenapa debug (bug = serangga) diartikan sebagai kesalahan dalam dunia programming. Saya tidak akan menjelaskan sejarah itu sekarang karena nanti terlalu bertele-tele. Kalau Anda penasaran, silahkan Anda cari sendiri lewat google :)

2. Syntax Error vs Logic Error
Debug akan mudah kalau VFP memberikan pesan kesalahan saat error terjadi. Kalau kesalahan adalah akibat salah penulisan atau salah penggunaan (syntax), VFP pasti memberikan pesan kesalahan. Tapi kalau kesalahannya adalah kesalahan logic, program akan tetap berjalan, tetapi memberikan hasil yang tidak diinginkan. Nah, disinilah diperlukan debuging untuk menemukan kesalahan dan memperbaikinya.
Contoh syntax error:
Code: [Select]
j = 1
For i = 1 too 100
   lcMachine = 'POS' + Transform(i)
   .
   .
   .
Endfor
(tidak ada block For...too -- kebanyakan huruf 'o')

Contoh logic error:
Code: [Select]
j = 1
For i = 1 too 100
   lcMachine = 'POS' + Transform(j)
   .
   .
   .
Endfor
Kesalahannya simple; harusnya yang di transform adalah variable i, tapi yang tertulis variable j. Akibatnya dalam setiap loop, nilai variable lcMachine selalu sama.

Kalau aplikasi Anda hanya terdiri dari satu .PRG 30 baris, tentu tidak sulit untuk menemukan error-nya. Masalahnya, mau bikin aplikasi apa yang cuma memerlukan 30 baris coding? <LOL>

3. Step pertama, kenali window Debuger!
Apakah Anda tau bahwa Foxpro (yup... Foxpro 2.6 for DOS) dan VFP dilengkapi dengan Debugger? Pernahkan Anda menggunakannya? Debugger bisa diakses melalui menu Tools --> Debuger. Silahkan Anda buka. "Lho, kok kosong?" Iya. Jelas kosong karena memang tidak ada program yang sedang di-debug. Cobalah dari window Debug, akses menu Debug --> Do... lalu jalankan salah satu .PRG Anda. Nah, Anda bisa lihat? Program Anda bisa berjalan satu-baris-per-satu-baris dengan tombol F8 (istilahnya; single-step). Anda juga bisa menggunakan tombol F5 (langsung Run mulai dari posisi pointer Debugger), Anda bisa memindahkan cursor di Debugger ke baris tertentu, lalu menekan F7 untuk menjalankan program sampai ke posisi cursor. Anda juga bisa membuat breakpoint dengan F9(breakpoint adalah lokasi dimana program harus berhenti (di-pause) dulu dan kendali diberikan ke Debugger). Efek/hasil program bisa Anda lihat di VFP (bisa pindah ke VFP dengan menu Alt+TAB). Di window Trace yang ada di Debugger, Anda juga bisa menggerakkan mouse pointer ke variable. Apabila variable tersebut mempunyai nilai, maka VFP akan menampilkan tool-tip text yang berisi nilai variable tersebut.
Saya tidak akan membahas seluruh kegunaan dan fitur window Debugger ini. Yang penting, untuk Anda yang belum tau, sekarang Anda tau bahwa window ini ADA dan penggunaan selanjutnya silahkan buka VFP help. Anda bisa mulai dari tab Contents --> Microsoft Visual FoxPro --> Using Visual FoxPro --> Developing Visual FoxPro Applications --> Testing and Debugging Application --> Using the Debugger.

4. Gunakan Breakpoints
Di point di atas, saya sudah sedikit menyinggung mengenai breakpoint. Anda bisa menggunakan tombol F9 di window Debugger untuk membuat breakpoint. Nah, sebenarnya, Anda juga bisa menggunakan tombol F9 itu di window edit VFP. Semisal Anda sedang mengedit method Init control grid di form Anda; Anda bisa saja menekan tombol F9 untuk menandai di mana aplikasi harus berhenti. Perhatikan saat Anda menekan tombol F9, akan ada titik berwarna merah di sisi kiri baris program Anda. Oh ya, breakpoint yang sudah Anda buat bisa dihilangkan dengan menekan tombol F9 sekali lagi (sebagai toggle) atau bisa juga dengan memilih menu Tools --> Breakpoints (atau Ctrl+B) untuk membuka window Breakpoints dan menghapus dari sana. Di window itu, Anda juga bisa membuat breakpoints dengan kondisi tertentu atau berdasarkan kriteria tertentu. Silahkan pelajari Breakpoints lebih lanjut di VFP Help sub-chapter  Microsoft Visual FoxPro --> Using Visual FoxPro --> Developing Visual FoxPro Applications --> Testing and Debugging Application --> Using the Debugger--> How to Suspend Program Execution.

5. SET STEP ON
Kalau Anda punya satu posisi tertentu di program dimana eksekusi program harus di-suspend, Anda juga bisa menggunakan perintah SET STEP ON. Perintah ini akan menyebabkan VFP menghentikan eksekusi program dan menyerahkan kendali ke Debugger. Kalau Anda menggunakan VFP versi 6 atau versi sebelumnya (termasuk FPD26) -- HATI-HATI. Perintah SET STEP ON akan memberikan pesan error Feature Not Available di FPD26 for DOS/Windows dan akan memberikan General Error (dalam beberapa konfigurasi komputer malahan BSOD) untuk VFP5 dan VFP6. VFP7 saya gak tau. Udah lupa. Sedangkan di VFP8 dan VFP9, team VFP sudah membuat way-around sehingga perintah SET STEP ON akan diabaikan di aplikasi yang berjalan di luar IDE.

6. Manfaatkan Command Windows untuk memeriksa baris yang error.
Pada saat program sedang dalam posisi 'Suspended' (di-pause atau berhenti sementara karena Debugger sedang bekerja) -- maka Anda tetap bisa kembali ke Window VFP dengan tombol Alt+TAB (asumsi: _Screen = .T. -- kalau Anda menggunakan Top-Level form; pastikan _Screen = .T. selama proses debugging, atau bisa juga dengan membuat sebuah program kecil yang berisi perintah _Screen = .T. -- lalu DO dari menu Debug --> Do... Dengan cara ini, _Screen bisa muncul). Di dalam window VFP, Anda bisa menggunakan tombol Ctrl+F2 untuk memunculkan Command Windows. Guna command Windows adalah, Anda bisa mengevaluasi perintah atau mencoba menjalankan perintah yang error secara interaktif. Sekalian, bisa memperbaiki perintah tersebut sampai sesuai dengan apa yang Anda inginkan. Keuntungan mencoba perintah dengan cara ini adalah semua variable dan kondisi bisa diusahakan semirip mungkin dengan saat run-time yang sebenarnya. Kalau Anda punya variable ldStartdate yang Anda inisialisasi sebelumnya, kemungkinan besar juga tersedia. Anda juga bisa melakukan browse data untuk melihat apakah (misalnya) cursor sudah berisi data yang Anda harapkan atau belum. Nah, setelah Anda menemukan perintah yang sesuai, Anda bisa copy-paste perintah tersebut ke Notepad (untuk sementara), lalu menghentikan eksekusi dan memperbaiki code tersebut.

7. Contoh kasus bagaimana debuging bekerja:

Code: [Select]
Text to lcSQLCmd textmerge noshow pretext 2
select Nama, Alamat From Customer
Endtext

If Sqlexec (liHandle, lcSQLCmd, [curCustomer])<= 0

   lcNama   = Alltrim(Nama)
   lcAlamat = Alltrim(Alamat)

   messagebox (lcNama + chr(13) + lcAlamat, 64, "Info")
Else
   Aerror(laErr)
   Messagebox(laErr(2), 64, "Oops")
Endif

Okay. Sekilas keliahatannya program ini akan baik-baik saja, tapi kalau dijalankan program ini hampir pasti tidak mencapai tujuannya. Nah, kalau kita memberikan perintah SET STEP ON di bagian atas coding (sebelum text to...), maka kita bisa menggunakan F8 dan melihat efek serta alur program baris-demi-baris. Dengan demikian Anda bisa menemukan errornya dimana (udah tau kan, dimana?)

Kasus lain, kita coba lihat langsung ke post pertanyaan di forum. Misal kasus http://fox-id.org/smf/index.php/topic,9734.msg63644/topicseen.html#new. Kalau saja @fajar memberikan perintah:
Code: [Select]
SET STEP ON
FOR i=1 TO thisform.list1.ListCount
       yangdicari=ALLTRIM(thisform.list1.List((i),1))
       IF cari $ yangdicari 
           baris=i
       ENDIF
ENDFOR
lalu menggunakan F8 untuk single step, dan maka alur program bisa dilihat. Pada saat seharusnya cari $ yangdicari = .T. -- tetapi malah bernilai false @fajar bisa meneliti nilai variable cari (dengan menggerakkan pointer mouse ke tulisan 'cari') dan membandingkan nilainya dengan variable yangdicari. Dari nilai variable itu, sebenarnya bisa terlihat apa penyebab kondisi menjadi FALSE. @fajar bisa mencoba-coba kondisi yang sesuai (mungkin dengan kombinasi UPPER atau ALLTRIM) untuk menemukan perintah kondisi yang benar. Mungkin sambil single-step, @fajar juga akan menemukan bahwa pencarian dengan cara seperti ini tidak efektif karena walaupun yangdicari sudah ditemukan di baris pertama, looping tetap berlanjut sampai list habis. Padahal untuk apa kan? Jadi di sini, bisa ada pembelajaran untuk mencari metode yang lebih baik.
(btw, hint untuk fajar: gunakan perintah LOCATE dan manfaatkan fungsi LIKE).

Okay. Saya rasa segini dulu untuk tips bagian pertama. Untuk membuat post ini memerlukan waktu sekitar satu jam, dan saya rasa kalau dilanjutkan sekarang, nanti post-nya akan terlalu panjang (untuk ditulis maupun dibaca). Jadi, ini akan menjadi bagian pertama. Di bagian kedua nanti, saya akan tunjukkan cara untuk men-debug aplikasi di tengah event yang kritis (seperti Timer atau event KeyPressed) dan bagaimana cara men-debug report.

Okay guys... sampai lain kali.. :)

Tidak ada komentar:

Posting Komentar