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 #

JenisCara memasangBerhenti ketika
Standardbstop in file at Nbaris N hendak dijalankan — selalu
Conditionaldbstop in file at N if ekspresibaris N hendak dijalankan dan ekspresi bernilai true
Error/warningdbstop if error / dbstop if warninggalat 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:

matlab
which jumlah_diskon

Contoh tampilan di Command Window MATLAB (jalur lengkap bergantung lokasi folder di mesin masing-masing):

text
C:\proyek\debug\jumlah_diskon.m

Jika 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:

text
>> 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:

PerintahPemicu
dbstop if errorgalat tak tertangkap apa pun
dbstop if error MATLAB:badsubscripthanya galat ber-identifier itu (lihat chapter Membaca Error Message)
dbstop if caught errorgalat yang ditangkap try/catch
dbstop if warningperingatan pertama yang muncul
dbstop if naninfhasil 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:

matlab
% 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:

text
== 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:

  1. Baris 2 (dbstop if error): memasang error breakpoint global; dbstatus() melaporkan 1 entri aktif.
  2. Baris 5-8 (try ... error ... catch): galat sengaja dilempar lalu ditangkap — sesuai catatan sebelumnya, penangkapan membuat galat tidak memicu jeda, sehingga baris fprintf sesudahnya tetap tereksekusi dan berkas berakhir exit 0.
  3. 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. dbstatus dalam bentuk struct MATLAB memuat field expression berisi teks kondisi ini.
  4. Blok ketiga contoh.m (dbstop if error MATLAB:badsubscript): error breakpoint yang hanya menyaring galat ber-identifier MATLAB: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.