HN Rilis: FlowTracker – Melacak aliran data dalam program Java
(github.com/coekie)FlowTracker: Melacak aliran data program Java
FlowTracker adalah agen Java yang melacak bagaimana program membaca, memanipulasi, dan menulis data. Dengan ini, Anda dapat memeriksa I/O file dan jaringan, serta menghubungkan input dan output untuk menunjukkan dari mana output berasal. Hal ini membantu memahami arti output dari program Java.
Demo
Spring PetClinic adalah aplikasi demo dari framework Spring. Untuk menunjukkan kemampuan FlowTracker, diamati proses saat PetClinic menangani permintaan HTTP dan menghasilkan halaman HTML dari template dan database. Anda dapat menjalankan demo di browser atau menonton videonya.
- Pemrosesan HTTP: FlowTracker menunjukkan kode mana yang menghasilkan output tertentu. Misalnya, jika Anda mengklik "HTTP/1.1" atau header HTTP, Anda dapat mengetahui bahwa bagian tersebut dihasilkan oleh kelas dalam paket
org.apache.coyote. - Template Thymeleaf: Menunjukkan bagaimana input yang dibaca program (template HTML) terhubung ke output. Jika Anda mengklik nama tag HTML, Anda dapat melihat bahwa bagian tersebut berasal dari file
layout.html. - Database: Menunjukkan bahwa informasi dalam tabel pada halaman HTML berasal dari database. Misalnya, jika Anda mengklik
Georgedi tabel, Anda dapat melihat bahwa nilai tersebut berasal dari database.
Demo ini menggunakan database in-memory sehingga pelacakan dapat dilakukan hingga skrip SQL. Jika menggunakan database MySQL, pelacakan dapat dilakukan hingga ke koneksi database.
Cara penggunaan
FlowTracker saat ini masih berada pada tahap proof of concept, sehingga mungkin tidak bekerja dengan baik pada semua program. Selain itu, alat ini menambahkan overhead yang besar sehingga memperlambat eksekusi program. Penggunaannya dilakukan dengan mengunduh file jar agen FlowTracker dan menambahkannya ke command line Java.
Cara kerja internal
Penjelasan singkat
FlowTracker menyuntikkan kode ke file kelas (bytecode) untuk melacak data di memori beserta asalnya. Alat ini terutama melacak data teks dan biner (String, array char, dan array byte).
- Mengganti pemanggilan metode JDK dengan pemanggilan metode milik FlowTracker.
- Menyuntikkan kode pada lokasi-lokasi penting di JDK untuk melacak input dan output.
- Melakukan analisis aliran data dan instrumentasi yang lebih mendalam untuk melacak nilai variabel lokal dan stack di dalam metode.
- Menambahkan kode sebelum dan sesudah pemanggilan metode, serta di awal dan akhir metode, untuk melacak argumen metode dan nilai kembalian.
Model data: Tracker
Kelas inti dan konsep dalam model data FlowTracker:
- Tracker: Menyimpan informasi tentang isi objek yang dilacak dan asalnya.
- content: Isi yang dilalui data. Contoh: semua byte yang melewati
InputStreamatauOutputStream. - source: Menghubungkan rentang isi ke rentang sumber dari tracker lain.
- content: Isi yang dilalui data. Contoh: semua byte yang melewati
- TrackerRepository: Menyimpan map global yang menghubungkan objek-objek penting dengan tracker-nya.
- TrackerPoint: Menunjuk ke lokasi dalam tracker yang merepresentasikan satu nilai primitif.
Instrumentasi dasar
Untuk menjaga agar Trackers tetap mutakhir, FlowTracker menyisipkan pemanggilan metode hook miliknya sendiri saat metode JDK tertentu dipanggil. Misalnya, pemanggilan System.arraycopy diganti dengan pemanggilan com.coekie.flowtracker.hook.SystemHook.arraycopy.
Nilai primitif, analisis aliran data
Melacak nilai primitif adalah tantangan yang lebih besar. Misalnya, untuk melacak nilai byte, tracker disimpan dalam variabel lokal di dalam metode.
Pemanggilan metode
Memodelkan bagaimana nilai primitif mengalir ke metode lain sebagai argumen pemanggilan metode dan nilai kembalian. Invocation digunakan untuk menyimpan PointTracker dari argumen dan nilai kembalian.
Menggunakan kode itu sendiri sebagai sumber
Melacak nilai yang berasal dari kode itu sendiri, seperti konstanta primitif dan konstanta String. Tracker dibuat untuk setiap kelas, lalu tracker tersebut direferensikan saat konstanta digunakan.
Literal String
Literal String disalin ulang, lalu isi String dihubungkan ke ClassOriginTracker. Misalnya, String s = "abc"; ditulis ulang menjadi String s = StringHook.constantString("abc", 1234, 81);.
Metode fallback untuk nilai yang tidak dilacak
Tidak semua nilai dalam program dilacak. Jika nilai yang tidak dilacak mencapai lokasi yang perlu dilacak, nilainya diperlakukan mirip seperti konstanta.
Ringkasan GN⁺
- FlowTracker melacak aliran data dalam program Java untuk membantu memahami output program.
- Melalui demo Spring PetClinic, Anda dapat melihat secara visual pemrosesan permintaan HTTP, penggunaan template, dan integrasi database.
- Saat ini masih pada tahap proof of concept, sehingga mungkin tidak bekerja dengan baik di semua program dan memiliki overhead performa yang besar.
- Melalui analisis aliran data dan pelacakan pemanggilan metode, alat ini melacak asal nilai primitif dan objek.
- Alat dengan fungsi serupa antara lain Dynatrace dan New Relic.
1 komentar
Komentar Hacker News
Memperkenalkan alat bernama FlowStorm untuk Clojure
Memuji bahwa alat-alat di ekosistem Java/JVM sangat luar biasa
Terkesan dengan demo yang melacak elemen HTML hingga ke pernyataan SQL
Mengingatkan pada lingkungan Smalltalk
Menekankan bahwa video demo sangat berguna
Membagikan pengalaman bereksperimen dengan konsep yang mirip dengan HTML source map
Menyebutkan kemiripan dengan demo Eve-lang
Mengingat sebuah makalah yang mirip dengan alat untuk menemukan SQL injection secara dinamis
Membagikan pengalaman pernah memiliki visi untuk melacak data di internet
Berterima kasih atas upaya mencoba alat ini dengan VSCode dan proyek mereka