2 puan yazan GN⁺ 2024-09-15 | 1 yorum | WhatsApp'ta paylaş

FlowTracker: Java programlarında veri akışını izleme

FlowTracker, bir Java ajanıdır ve programın verileri nasıl okuduğunu, işlediğini ve yazdığını izler. Bu sayede dosya ve ağ G/Ç’sini inceleyebilir, girdiler ile çıktıları birbirine bağlayarak çıktının nereden geldiğini gösterebilir. Böylece bir Java programının çıktısının ne anlama geldiğini anlamaya yardımcı olur.

Demo

Spring PetClinic, Spring framework’ünün demo uygulamasıdır. FlowTracker’ın yeteneklerini göstermek için, PetClinic’in HTTP isteklerini işleyip şablonlar ve veritabanından HTML sayfaları oluşturma süreci gözlemlenir. Demoyu tarayıcıda çalıştırabilir veya videoyu izleyebilirsiniz.

  • HTTP işleme: FlowTracker, hangi kodun hangi çıktıyı ürettiğini gösterir. Örneğin, HTTP/1.1 veya HTTP başlıklarından birine tıklarsanız, bu bölümün org.apache.coyote paketindeki sınıflar tarafından üretildiğini görebilirsiniz.
  • Thymeleaf şablonları: Programın okuduğu girdinin (HTML şablonunun) çıktıyla nasıl bağlandığını gösterir. HTML etiket adlarına tıklarsanız, ilgili kısmın layout.html dosyasından geldiğini görebilirsiniz.
  • Veritabanı: HTML sayfasındaki tablodaki bilgilerin veritabanından geldiğini gösterir. Örneğin, tablodaki George değerine tıklarsanız, bu değerin veritabanından geldiğini görebilirsiniz.

Bu demo, bellek içi bir veritabanı kullandığından SQL script’lerine kadar izleme yapabilir. MySQL veritabanı kullanıldığında ise veritabanı bağlantısına kadar izleme mümkündür.

Kullanım

FlowTracker şu anda kavram kanıtlama aşamasındadır; bu nedenle her programda iyi çalışmayabilir. Ayrıca önemli ölçüde ek yük getirerek programın daha yavaş çalışmasına neden olur. Kullanmak için FlowTracker ajan jar dosyasını indirip Java komut satırına eklemeniz gerekir.

Nasıl çalışır

Kısa açıklama

FlowTracker, sınıf dosyalarına (bytecode) kod enjekte ederek bellekteki verileri ve bunların kaynaklarını izler. Başlıca metin ve ikili verileri (String, char ve byte dizileri) takip eder.

  • JDK metot çağrılarını FlowTracker metot çağrılarıyla değiştirir.
  • Girdi ve çıktıyı izlemek için JDK’nin önemli noktalarına kod enjekte eder.
  • Metotlar içinde yerel değişkenler ve stack üzerindeki değerleri izlemek için veri akışı analizi ve daha derin enstrümantasyon uygular.
  • Metot argümanlarını ve dönüş değerlerini izlemek için metot çağrılarının öncesine ve sonrasına, ayrıca metotların başlangıcına ve sonuna kod ekler.

Veri modeli: Tracker

FlowTracker’ın veri modelindeki temel sınıflar ve kavramlar:

  • Tracker: İzlenen nesnenin içeriği ve kaynağı hakkında bilgi tutar.
    • content: Verinin içinden geçtiği içerik. Örn. InputStream veya OutputStream içinden geçen tüm baytlar.
    • source: İçerik aralıklarını, diğer tracker’ların kaynak aralıklarıyla ilişkilendirir.
  • TrackerRepository: İlgi çekici nesneleri ve bunların tracker’larını ilişkilendiren global bir harita tutar.
  • TrackerPoint: Tek bir ilkel değeri temsil eden tracker içindeki bir konumu işaret eder.

Temel enstrümantasyon

Tracker’ları güncel tutmak için, belirli JDK metot çağrılarında FlowTracker’ın hook metot çağrıları eklenir. Örneğin, System.arraycopy çağrısı com.coekie.flowtracker.hook.SystemHook.arraycopy çağrısıyla değiştirilir.

İlkel değerler, veri akışı analizi

İlkel değerleri izlemek daha büyük bir zorluktur. Örneğin, bir byte değerini izlemek için metot içinde yerel değişkenlerde tracker bilgisi saklanır.

Metot çağrıları

İlkel değerlerin metot çağrılarının argümanları ve dönüş değerleri olarak başka metotlara akışı modellenir. Bunun için argümanların ve dönüş değerlerinin PointTracker bilgilerini saklayan Invocation kullanılır.

Kaynak olarak kodun kendisini kullanma

Kodun kendisinden gelen değerler de izlenir (ör. ilkel sabitler ve String sabitleri). Her sınıf için bir tracker oluşturulur ve sabite başvurulduğunda ilgili tracker referans alınır.

String sabitleri

String sabitleri yeniden kopyalanır ve String içeriği ClassOriginTracker ile ilişkilendirilir. Örneğin, String s = "abc"; ifadesi String s = StringHook.constantString("abc", 1234, 81); olarak yeniden yazılır.

İzlenmeyen değerler için yedek yaklaşım

Programdaki tüm değerler izlenmez. İzlenmeyen bir değer, izlenmesi gereken bir noktaya ulaştığında sabitlere benzer şekilde ele alınır.

GN⁺ özeti

  • FlowTracker, Java programlarındaki veri akışını izleyerek program çıktısını anlamaya yardımcı olur.
  • Spring PetClinic demosu üzerinden HTTP istek işleme, şablon kullanımı ve veritabanı entegrasyonu görsel olarak incelenebilir.
  • Araç şu anda kavram kanıtlama aşamasındadır; her programda sorunsuz çalışmayabilir ve yüksek performans ek yükü vardır.
  • Veri akışı analizi ve metot çağrısı takibi sayesinde ilkel değerlerin ve nesnelerin kaynakları izlenebilir.
  • Benzer işlevler sunan araçlar arasında Dynatrace ve New Relic bulunur.

1 yorum

 
GN⁺ 2024-09-15
Hacker News yorumu
  • Clojure için FlowStorm adlı bir araçtan bahsediliyor

    • Resmi Clojure derleyicisi fork edilerek ek bytecode ekleniyor
    • Değerlerin çoğu immutable olduğu için işaretçiler korunarak snapshot alınabiliyor
    • Web uygulaması hata ayıklama demosu bağlantısı veriliyor: FlowStorm demosu
  • Java/JVM ekosistemindeki araçlar çok iyi diye övülüyor

    • jitwatch ile benzer düzeyde etkileyici bulunuyor
    • FlowTracker, taint analizini çağrıştırıyor
    • İlgili anahtar kelimeler: "dynamic taint tracking/analysis"
    • İlgili proje bağlantıları:
  • HTML öğelerinden SQL sorgularına kadar izleme yapan demo etkileyici bulunuyor

    • Böyle bir aracın bug çözümünde ilk savunma hattı olabileceği söyleniyor
  • Smalltalk ortamını hatırlattığı belirtiliyor

    • Tüm nesnelerin ve mesajların izlenip etkileşime girilebildiği söyleniyor
  • Demo videosunun çok faydalı olduğu özellikle vurgulanıyor

    • Alışılmadık bir kod tabanını keşfederken yararlı olacağı belirtiliyor
  • HTML source map'e benzer bir kavramı deneme deneyimi paylaşılıyor

    • Web geliştirme araçlarının bu tür tam yığın özelliklerden büyük fayda göreceği söyleniyor
    • Bunu mevcut framework'lere entegre etmenin büyük zorluk olduğu belirtiliyor
    • İlgili proje bağlantısı: HTML Source Maps
  • Eve-lang demosuna benzediği söyleniyor

  • SQL injection'ı dinamik olarak bulan bir araca benzer bir makalenin hatırlandığı belirtiliyor

  • İnternetteki verileri izleme vizyonuna sahip olma deneyimi paylaşılıyor

    • Bunun, bir görselin kaynağını ya da bir string'in izlediği yolu takip etmeye giden bir adım olduğu söyleniyor
  • Bu aracı VSCode ve projelerde deneme girişimi için teşekkür ediliyor

    • Şu anda bırakılmış olsa da yeniden denemeyi planladıkları belirtiliyor