Berhenti di prompt K>> baru setengah kemenangan — debug sebenarnya terjadi pada lima detik berikutnya, saat kita menatap isi program yang terjeda dan bertanya: “nilai mana yang sudah salah?”. Karena tiap fungsi punya workspace sendiri, pemeriksaan harus tahu frame mana yang sedang aktif, lalu menginterogasi variabelnya satu per satu. MATLAB menyediakan perintah who/whos untuk isi, size/class untuk wujud, dan dbstack/dbup/dbdown untuk berpindah frame. Chapter ini mempraktikkan seluruh rantai pemeriksaan itu, masih dengan kasus jumlah_diskon() dari dua chapter sebelumnya.
Ruang Kerja yang Sedang Aktif #
Saat MATLAB berjeda, workspace aktif adalah workspace fungsi tempat jeda terjadi — bukan base workspace Command Window. Konsekuensinya, mengetik who di K>> memberi daftar variabel lokal fungsi itu. Melanjutkan sesi debug chapter sebelumnya (script memanggil jumlah_diskon(hargaUji), jeda di baris 6 saat iterasi k = 4):
K>> whos
Name Size Bytes Class Attributes
diskon 1x1 8 double
harga 1x3 24 double
k 1x1 8 double
total 1x1 8 double
K>> size(harga)
ans =
1 3
K>> class(harga)
ans =
doublewhos langsung memperlihatkan masalahnya: harga berukuran 1×3 sementara loop sedang membawa k = 4 — indeks yang jelas di luar jangkauan. Dari tabel itu kita juga tahu semua variabel bertipe double, sehingga dugaan “salah tipe data” bisa disingkirkan lebih dulu. Setelah pola umum terlihat, interogasi menjadi spesifik:
| Perintah | Menjawab pertanyaan |
|---|---|
who / whos | variabel apa saja yang hidup di frame aktif? |
size(v) / numel(v) / length(v) | berapa dimensi dan jumlah elemennya? |
class(v) | tipe datanya apa — double, char, cell, logical? |
isempty(v) / isfinite(v) | apakah kosong atau berisi NaN/Inf? |
v (cetak telanjang) | berapa nilainya sekarang? |
dbstack | siapa pemanggil frame aktif ini? |
dbstack: Melihat Rantai Pemanggil #
Galat jarang terjadi di tempat kesalahannya berada — fungsi dalam menerima masukan buruk dari pemanggil di atasnya. dbstack mencetak rantai pemanggilan saat jeda terjadi, terdalam di atas; bentuk terprogramnya mengembalikan struct array ber-field name, file, line, dan column:
K>> dbstack
In jumlah_diskon (line 6)
In contoh (line 12)Membaca output tersebut: kita sedang berhenti di jumlah_diskon baris 6, yang dipanggil oleh script contoh dari baris 12. Jika jumlah_diskon dipanggil fungsi lain yang juga dipanggil fungsi lain, daftarnya memanjang ke bawah sampai frame terluar — pola sama dengan stack trace galat di chapter Membaca Error Message.
dbup dan dbdown: Berpindah Workspace #
Dugaan kita kadang jatuh ke pemanggil: “mungkin argumen yang dikirim sudah salah”. Alih-alih membatalkan sesi, dbup menaikkan workspace aktif satu frame ke pemanggil — whos kini menampilkan variabel script contoh, bukan lagi variabel jumlah_diskon — dan dbdown menurunkannya kembali:
K>> dbup
In contoh (line 12)
K>> whos
Name Size Bytes Class Attributes
hargaUji 1x3 24 double
K>> dbdown
In jumlah_diskon (line 6)Saat berada di frame atas, kita bisa memeriksa argumen yang dikirim (hargaUji pada transkripsi di atas — skrip memanggil jumlah_diskon(hargaUji)), memodifikasinya, bahkan memanggil ulang fungsi dari prompt — semua tanpa membatalkan jeda. Di Editor, pemilihan frame yang sama dilakukan lewat dropdown stack di atas panel Workspace.
Membandingkan Nilai dan Ekspektasi #
Pemeriksaan berubah menjadi bukti ketika angka dibandingkan dengan ekspektasi. Di prompt K>>, ekspresi apa pun boleh dijalankan: total / numel(harga) menguji dugaan rata-rata, harga * (1 - diskon) menghitung ulang hasil seharusnya, dan isequal(hasilHitung, hasilEkspektasi) memberi vonis boolean. Untuk bug jumlah_diskon(), perbandingan minimalnya: k bernilai 4 sementara numel(harga) bernilai 3 — kontradiksi satu baris yang menutup kasus.
Teknik pelengkap saat masalah berasal dari data besar: isolasi dengan potongan input. Daripada menganalisis array ribuan elemen, potong segmen kecil yang mencurigakan di prompt — harga(1:3), atau baris data tertentu — lalu jalankan ulang logikanya pada potongan itu. Jika galat hilang di potongan kecil, sumber masalah ada di data yang terpotong; jika tetap muncul, kita baru memegang reproduksi mini yang jauh lebih cepat dijalankan ulang.
Workspace Browser #
Pengguna desktop MATLAB mendapat kembaran visual dari semua perintah di atas: panel Workspace menampilkan tabel whos yang diperbarui otomatis, klik dua kali variabel membukanya di Variables Editor (tabel besar bisa digulir dan disunting sel demi sel), dan dropdown di atasnya mengganti frame aktif — padanan dbup/dbdown. Panel itu menyorot perubahan nilai dengan warna, sehingga perubahan total antar-iterasi terlihat tanpa mengetik apa pun. Perintah db* dan panel GUI saling melengkapi: GUI untuk eksplorasi santai, perintah untuk presisi dan pencatatan hasil ke log.
Pemeriksaan Terprogram: contoh.m #
Semua pemeriksaan di atas berlaku di mode interaktif, tetapi teknik intinya — daftar variabel, class/size, rantai dbstack — bisa dipanggil terprogram dari dalam fungsi biasa. Berkas contoh.m memakai fungsi analisis_nilai() yang melaporkan workspace lokalnya sendiri, lalu script membandingkan hasil dengan ekspektasi:
% analisis_nilai.m — inti pelaporan workspace lokal
daftar = who();
fprintf('Variabel lokal di %s: %d\n', mfilename, numel(daftar));
for i = 1:numel(daftar)
v = eval(daftar{i});
fprintf(' %-7s %-7s %s\n', daftar{i}, class(v), mat2str(size(v)));
end
S = dbstack();
fprintf('dbstack: %d frame\n', numel(S));
for i = 1:numel(S)
fprintf(' %d. %s (line %d)\n', i, S(i).name, S(i).line);
endOutput yang Dihasilkan:
== Workspace script sebelum pemanggilan ==
variabel script : dataUji
ukuran dataUji : [1 5] (double)
== Workspace lokal fungsi analisis_nilai ==
Variabel lokal di analisis_nilai: 5
maks double [1 1]
n double [1 1]
nilai double [1 5]
rerata double [1 1]
total double [1 1]
dbstack: 2 frame
1. analisis_nilai (line 20)
2. contoh (line 12)Mari kita bedah baris-baris kode di atas:
- Baris 2 (
daftar = who()): meminta daftar nama variabel sebagai cell array —daftarsendiri belum terikat saatwho()berjalan, sehingga tidak ikut terdaftar; urutannya alfabetis. - Baris 3-7 (
for ... eval ...): untuk tiap nama,evalmengambil nilainya, laluclass(v)danmat2str(size(v))mencetak wujudnya — kolom yang sama dengan tabelwhos, hanya lebih ringkas. - Baris 9-12 (
S = dbstack() ...): rantai pemanggil diambil sebagai struct; frame 1 adalahanalisis_nilaiitu sendiri (baris pemanggilandbstack), frame 2 adalah script pemanggilnya — persis pola baca dari-dalam-ke-luar.
Output yang Dihasilkan (lanjutan, hasil fungsi dan pemeriksaan ekspektasi):
== Hasil fungsi ==
n=5, rerata=80.00, maks=95
rerata cocok dengan ekspektasi (80.00)Kolom rerata cocok dengan ekspektasi adalah pola banding-ekspektasi dari subbab sebelumnya yang dijalankan terprogram: abs(mean(dataUji) - 80) < 1e-12 — pola yang sama kita pakai nanti di bab pengujian.
Ringkasan #
Saat berjeda di K>>, workspace aktif milik fungsi tempat jeda terjadi: who/whos mendaftar isinya, size/class/isempty menanyakan wujudnya, dan ekspresi apa pun bisa dijalankan untuk mengadu nilai dengan ekspektasi. dbstack menampilkan rantai pemanggil, dbup/dbdown memindahkan workspace antarframe sehingga argumen pemanggil bisa diperiksa tanpa membatalkan sesi, dan Workspace Browser memberikan tampilan visual yang sama. Teknik isolasi — memotong input besar menjadi segmen kecil — mempercepat reproduksi. Kekuatan pemeriksaan manual ini kita kunci permanen di chapter berikutnya lewat assert.