Tracing dan debug

Modul sys, trace, dan observer untuk mengamati perilaku sistem secara langsung.

Daftar isi

Topik ini memperkenalkan peralatan pengamatan pada sistem Erlang yang hidup: dbg untuk melacak panggilan fungsi apa pun, sys untuk mengintip proses OTP, dan observer untuk melihat keseluruhan VM. Semua contoh dieksekusi nyata pada server tiket dari modul OTP behaviour, beserta perbandingan langsung kedua sudut pandangnya.

Trace fungsi dengan dbg#

Modul dbg melacak panggilan fungsi yang dipilih dan mengalirkan hasilnya ke tracer. Urutannya tiga langkah: menyalakan tracer, menentukan siapa yang dilacak, dan menentukan fungsi apa:

erlang Melacak fungsi ambil milik server tiket
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> dbg:tracer().
{ok,<0.90.0>}
2> dbg:p(all, c).
{ok,[{matched,nonode@nohost,48}]}
3> dbg:tpl(tiket, ambil, x).
{ok,[{matched,nonode@nohost,1},{saved,x}]}
4> tiket:ambil().
(<0.85.0>) call tiket:ambil()
(<0.85.0>) returned from tiket:ambil/0 -> {error,kosong}
{error,kosong}
5> dbg:stop_clear().
ok

Pemanggilan dbg:p/2 memilih target berupa semua proses dengan jenis jejak panggilan, sedangkan dbg:tpl/3 memilih fungsi dengan x sebagai penanda agar nilai kembaliannya juga dilacak. Baris keluaran menunjukkan pasangan panggilan dan hasilnya beserta PID pelakunya, dan dbg:stop_clear/0 membersihkan seluruh pemasangan. Pada sistem yang berjalan, pola ini menjadi alat pertama untuk menanyakan apakah fungsi benar dipanggil, oleh siapa, dan apa hasilnya.

Intip proses OTP dengan sys#

Untuk proses yang dibangun behaviour OTP, modul sys menyediakan akses sistem yang lebih ramah: sys:trace/2 menyalakan jejak peristiwa pesan server, dan sys:get_state/1 yang dilihat pada topik gen_statem membaca statenya. Jejak sys menampilkan peristiwa dari sudut pandang server, bukan sudut pandang fungsi:

erlang Jejak peristiwa gen_server lewat sys
1> c(tiket).
{ok,tiket}
2> tiket:start_link().
{ok,<0.92.0>}
3> sys:trace(whereis(tiket), true).
ok
4> tiket:ambil().
*DBG* tiket got call ambil from <0.85.0>
*DBG* tiket sent {error,kosong} to <0.85.0>, new state []
{error,kosong}
5> sys:trace(whereis(tiket), false).
ok

Dua baris *DBG* menceritakan seluruh pertukaran: pesan call yang masuk, balasan yang keluar, dan state baru setelahnya. Fasilitas ini bekerja karena gen_server menjawab pesan sistem OTP, dan itulah alasan loop rakitan tidak bisa dilihat dengan cara ini. Perlu ditegaskan pula biayanya: tracer yang menyala menambah pekerjaan pada setiap panggilan yang dilacak, sehingga peralatan ini dipasang saat menyelidiki dan dilepas setelah selesai, bukan dibiarkan menyala di produksi.

Observer dan kebiasaan pengamatan#

Observer adalah alat grafis bawaan OTP yang menampilkan proses, aplikasi, tabel ETS, pemakaian memori, dan grafik beban VM dalam jendela interaktif. Karena berantarmuka grafisnya, pemanggilannya dengan observer:start(). tidak dapat dieksekusi dalam topik ini dan diserahkan sebagai latihan mandiri. Untuk lingkungan tanpa layar, pendekatan yang sama dilakukan lewat sys:get_status/1 untuk status lengkap server, process_info/2 untuk anatomi satu proses, dan trace ke berkas lewat dbg:tracer(file, ...).

Kebiasaan pengamatan yang sehat bergerak dari yang murah ke yang mahal: logger dan supervisor report dulu untuk peristiwa yang sudah terjadi, sys dan process_info untuk proses yang dicurigai, lalu dbg untuk pertanyaan yang tidak bisa dijawab tanpa mengikuti aliran panggilan. Urutan ini menjaga sistem tetap sehat sementara penyelidikannya berjalan.

Trace ke berkas dan pertimbangan bebannya#

Tracer bawaan menulis ke terminal proses yang menjalankannya, dan untuk sistem yang hidup di jauh, keluaran diarahkan ke berkas:

erlang Tracer yang menulis ke berkas
1> dbg:tracer(file, [{file, "jejak.log"}]).
{ok,<0.95.0>}
2> dbg:p(all, c).
{ok,[{matched,nonode@nohost,48}]}
3> dbg:tpl(tiket, ambil, x).
{ok,[{matched,nonode@nohost,1},{saved,x}]}

Seluruh baris trace kemudian tertulis di jejak.log tanpa mengganggu layar operasi. Dua batas menemani setiap pemakaian trace: beban per panggilan yang dilacak tetap ada dan bertumbuh dengan kepadatan lalu lintas, serta berkas jejak yang aktif bertumbuh tanpa pemberitahuan, sehingga cakupan dbg:tpl dibatasi pada fungsi yang benar-benar diselidiki dan pemantauan dihentikan dengan dbg:stop_clear/0 segera setelah jawaban terbaca.

Kombinasi alat di atas menjadi resep penyelidikan yang lazim. Peristiwa aneh di log menunjuk proses yang dicurigai. sys:get_status/1 membaca status lengkapnya termasuk state dan riwayat pesan terakhir. sys:trace/2 menyala selama penyelidikan berlangsung. Bila pertanyaannya menyentuh fungsi lain, dbg menyala dengan cakupan sempit. Setelah penyelidikan selesai, seluruh pemasangan dilepas dan sistem kembali ke keadaan diam. Urutan ini menjaga biaya pengamatan tetap proporsional dengan pertanyaannya, dan sistem produksi yang sehat adalah yang bisa diselidiki tanpa dihentikan, bukan yang harus dimatikan alat pengamatannya dulu agar dapat dilihat.

Ringkasan#

  • dbg melacak panggilan fungsi apa pun lewat tiga langkah: tracer, target proses, dan fungsi yang dilacak.
  • tpl/3 dengan penanda x menampilkan pasangan panggilan dan hasilnya beserta PID pelakunya.
  • sys:trace/2 menceritakan pesan masuk, balasan, dan state baru dari sudut pandang proses OTP, dan hanya bekerja pada behaviour.
  • Observer menampilkan keseluruhan VM secara grafis, dan urutan pengamatan yang sehat bergerak dari log ke sys ke dbg.

Referensi#