Breakpoint standar dari chapter sebelumnya berhenti setiap kali sebuah baris dijalankan — dan di dalam loop seribu iterasi, menekan dbcont seribu kali justru menyiksa. Kebutuhan nyata kita lebih spesifik: berhenti hanya saat kondisi tertentu terpenuhi, atau berhenti di berkas mana pun saat galat meledak tanpa kita tahu harus curiga ke siapa. MATLAB menyediakan tiga varian breakpoint untuk tiga kebutuhan itu. Chapter ini memetakan semuanya, lengkap dengan perintah pembersihnya dbclear.
Tiga Jenis Breakpoint #
| Jenis | Cara memasang | Berhenti ketika |
|---|---|---|
| Standar | dbstop in file at N | baris N hendak dijalankan — selalu |
| Conditional | dbstop in file at N if ekspresi | baris N hendak dijalankan dan ekspresi bernilai true |
| Error/warning | dbstop if error / dbstop if warning | galat atau peringatan terjadi di berkas mana pun |
Mekanisme dasarnya sama: semua varian terdaftar di tabel internal yang dilaporkan dbstatus, dan semuanya memindahkan kita ke prompt K>> saat terpicu. Bedanya hanya pada pemicunya — varian pertama memicu jeda selalu, varian kedua mengevaluasi ekspresi dulu, varian ketiga memasang “penjaga” global di luar berkas mana pun.
Breakpoint Standar dan Lokasi Berkas #
dbstop hanya mengenali berkas yang berada di current folder atau search path. Sebelum memasang breakpoint pada berkas yang jarang dipakai, pastikan lokasinya dengan which:
which jumlah_diskonContoh tampilan di Command Window MATLAB (jalur lengkap bergantung lokasi folder di mesin masing-masing):
C:\proyek\debug\jumlah_diskon.mJika which tidak menemukan berkas, dbstop menolak memasang breakpoint — jalankan addpath atau cd ke folder berkas lebih dulu. Perintah pasang dan hapusnya berpasangan: dbstop in jumlah_diskon at 5 dipasang, dbclear in jumlah_diskon at 5 dihapus, dan dbclear all menyapu bersih seluruh breakpoint di semua berkas — perintah pamungkas sebelum menjalankan program secara utuh.
Conditional Breakpoint #
Inilah senjata utama untuk loop panjang. Sintaksnya dbstop in file at N if ekspresi: setiap kali baris N hendak dieksekusi, MATLAB mengevaluasi ekspresi di workspace fungsi itu — variabel loop, variabel lokal, semuanya bisa dipakai. Ekspresi bernilai true → jeda; false → baris dijalankan tanpa jeda, nyaris tanpa overhead. Pada fungsi jumlah_diskon() kita, bug terjadi persis saat k melampaui jumlah elemen harga, jadi kondisinya menulis dirinya sendiri:
>> dbstop in jumlah_diskon at 6 if k > numel(harga)
>> totalDiskon = jumlah_diskon([100 200 300])
6 total = total + harga(k) * (1 - diskon);
K>> k
k =
4
K>> dbquit
>>Transkripsi di atas adalah sesi Command Window MATLAB. Tiga iterasi pertama lolos tanpa jeda karena 1 > 3, 2 > 3, 3 > 3 semuanya false; di iterasi ke-4 kondisi 4 > 3 bernilai true sehingga eksekusi berhenti tepat di baris bermasalah — tanpa satu pun tombol dbcont yang terbuang. Setelah yakin, dbquit menutup sesi dan kita langsung memperbaiki numel(harga) + 1.
Error dan Warning Breakpoint #
Ketika galat muncul di tempat yang tak terduga, kita bisa memasang jebakan global. dbstop if error membuat MATLAB berhenti di baris tempat galat tidak tertangkap terjadi — di berkas mana pun — lalu masuk mode K>> sehingga kita bisa memeriksa workspace pada momen kejatuhan. Varian lainnya mengikuti pola yang sama:
| Perintah | Pemicu |
|---|---|
dbstop if error | galat tak tertangkap apa pun |
dbstop if error MATLAB:badsubscript | hanya galat ber-identifier itu (lihat chapter Membaca Error Message) |
dbstop if caught error | galat yang ditangkap try/catch |
dbstop if warning | peringatan pertama yang muncul |
dbstop if naninf | hasil NaN atau Inf muncul — jejak klasik pembagian dengan nol |
Varian identifier sangat berguna ketika galat yang dicari tenggelam di antara galat lain: dbstop if error MATLAB:badsubscript hanya berhenti untuk indexing di luar batas dan mengabaikan galat bertipe lain. Semua varian ini dihapus dengan dbclear if error (atau dbclear all).
Tips Menempatkan Breakpoint #
Breakpoint menjeda eksekusi sebelum barisnya dijalankan, jadi pasang di baris sebelum kejadian mencurigakan. Berhenti setelahnya berarti nilai yang sudah dirusak bug — k sudah melompat, total sudah terkontaminasi — dan kita kehilangan momen transisinya. Untuk bug yang baru terlihat dari hasil (output salah, galat muncul), bertanyalah mundur: hasil dihasilkan baris mana → variabel pembentuknya diisi baris mana → pasang breakpoint di baris pengisian itu.
Verifikasi Batch dengan contoh.m #
Sesi K>> memang interaktif, tetapi memasang, mendaftar, dan menghapus breakpoint murni mengelola tabel status — aman dijalankan batch. Berkas contoh.m memverifikasi tiga hal: error breakpoint tidak menghentikan batch ketika galatnya tertangkap, conditional breakpoint terpasang dengan benar, dan error breakpoint identifier-specific dikenali:
% contoh.m — inti alurnya
dbstop if error;
fprintf('dbstatus: %d breakpoint aktif (stop jika error)\n', ...
numel(dbstatus()));
try
error('demo:ujiBatch', 'Galat sengaja untuk menguji error breakpoint');
catch err
fprintf('galat tertangkap try/catch: %s\n', err.message);
end
fprintf('eksekusi batch berlanjut — tidak berhenti di K>>.\n');
dbclear all;
dbstop in jumlah_diskon at 6 if k > numel(harga);
st = dbstatus();
fprintf('dbstatus: %d breakpoint aktif\n', numel(st));Output yang Dihasilkan:
== Breakpoint 1: error breakpoint ==
dbstatus: 1 breakpoint aktif (stop jika error)
galat tertangkap try/catch: Galat sengaja untuk menguji error breakpoint
eksekusi batch berlanjut — tidak berhenti di K>>.
setelah dbclear all: 0 breakpoint
== Breakpoint 2: conditional breakpoint ==
dbstatus: 1 breakpoint aktif
fungsi: jumlah_diskon, baris: 6
Kondisi k > numel(harga) dievaluasi setiap kali baris 6
hendak dijalankan — MATLAB berhenti tepat saat k = 4.
setelah dbclear all: 0 breakpoint
== Breakpoint 3: error breakpoint dengan identifier ==
dbstatus: 1 breakpoint aktif (khusus MATLAB:badsubscript)
setelah dbclear all: 0 breakpoint
SELESAI — breakpoint standar/conditional/error siap dipakai
di sesi debug interaktif.Mari kita bedah baris-baris kode di atas:
- Baris 2 (
dbstop if error): memasang error breakpoint global;dbstatus()melaporkan 1 entri aktif. - Baris 5-8 (
try ... error ... catch): galat sengaja dilempar lalu ditangkap — sesuai catatan sebelumnya, penangkapan membuat galat tidak memicu jeda, sehingga barisfprintfsesudahnya tetap tereksekusi dan berkas berakhir exit 0. - Baris 13 (
dbstop in jumlah_diskon at 6 if k > numel(harga)): conditional breakpoint terpasang tanpa memanggil fungsinya; entri dbstatus mencatat nama berkas dan baris 6.dbstatusdalam bentuk struct MATLAB memuat fieldexpressionberisi teks kondisi ini. - Blok ketiga
contoh.m(dbstop if error MATLAB:badsubscript): error breakpoint yang hanya menyaring galat ber-identifierMATLAB:badsubscript— pola yang sama bekerja untuk identifier galat apa pun.
Berkas contoh.m pada bagian Berkas Sumber menjalankan ketiga blok itu secara utuh; dbclear all selalu ditutup di tiap blok agar state kembali bersih.
Ringkasan #
Breakpoint standar (dbstop in file at N) berhenti selalu; conditional breakpoint (dbstop in file at N if ekspresi) hanya saat kondisi terpenuhi — pilihan utama untuk loop besar; error breakpoint (dbstop if error, dbstop if warning, varian identifier) menjebak galat di berkas mana pun. Galat yang tertangkap try/catch tidak memicu dbstop if error — gunakan dbstop if caught error untuk itu. dbclear all membersihkan segalanya, dbstatus mendaftar sisanya, dan which memastikan berkas berada di path sebelum dipasangi breakpoint. Setelah berhenti di K>>, chapter berikutnya melatih kita memeriksa isi workspace yang terjeda itu.