2 points par GN⁺ 2024-09-15 | 1 commentaires | Partager sur WhatsApp

FlowTracker : suivi du flux de données d’un programme Java

FlowTracker est un agent Java qui suit la manière dont un programme lit, manipule et écrit des données. Il permet d’inspecter les E/S de fichiers et réseau, et relie les entrées aux sorties pour montrer d’où provient une sortie. Cela aide à comprendre ce que signifie la sortie d’un programme Java.

Démo

Spring PetClinic est une application de démonstration du framework Spring. Pour montrer les capacités de FlowTracker, on observe comment PetClinic traite des requêtes HTTP et génère des pages HTML à partir de modèles et de la base de données. Vous pouvez lancer la démo dans le navigateur ou regarder la vidéo.

  • Traitement HTTP : FlowTracker montre quel code a produit quelle sortie. Par exemple, si vous cliquez sur "HTTP/1.1" ou sur des en-têtes HTTP, vous pouvez voir que cette partie a été générée par des classes du package org.apache.coyote.
  • Modèles Thymeleaf : il montre comment l’entrée lue par le programme (le modèle HTML) est reliée à la sortie. En cliquant sur le nom d’une balise HTML, vous pouvez voir que cette partie provient du fichier layout.html.
  • Base de données : il montre que les informations présentes dans le tableau de la page HTML proviennent de la base de données. Par exemple, si vous cliquez sur George dans le tableau, vous pouvez voir que cette valeur vient de la base de données.

Cette démo utilise une base de données en mémoire, ce qui permet de remonter jusqu’aux scripts SQL. En utilisant une base de données MySQL, il est possible de remonter jusqu’à la connexion à la base.

Utilisation

FlowTracker est actuellement au stade de preuve de concept et peut ne pas bien fonctionner avec tous les programmes. Il ajoute également beaucoup d’overhead, ce qui ralentit l’exécution du programme. Il s’utilise en téléchargeant le fichier jar de l’agent FlowTracker et en l’ajoutant à la ligne de commande Java.

Fonctionnement interne

Explication simple

FlowTracker injecte du code dans les fichiers de classes (bytecode) pour suivre les données en mémoire et leur origine. Il suit principalement les données textuelles et binaires (String, tableaux de char et de byte).

  • Il remplace les appels de méthodes du JDK par des appels aux méthodes de FlowTracker.
  • Il injecte du code à des endroits clés du JDK pour suivre les entrées et les sorties.
  • Il effectue une analyse de flux de données et une instrumentation plus poussée afin de suivre les valeurs des variables locales et de la pile dans les méthodes.
  • Il ajoute du code avant et après les appels de méthode, ainsi qu’au début et à la fin des méthodes, pour suivre les arguments et les valeurs de retour.

Modèle de données : Tracker

Classes et concepts au cœur du modèle de données de FlowTracker :

  • Tracker : conserve des informations sur le contenu d’un objet suivi et sur son origine.
    • content : le contenu qui a traversé les données. Exemple : tous les octets passés par un InputStream ou un OutputStream.
    • source : relie des plages de contenu à des plages source d’autres trackers.
  • TrackerRepository : contient une map globale reliant les objets intéressants à leurs trackers.
  • TrackerPoint : pointe vers une position dans un tracker représentant une seule valeur primitive.

Instrumentation de base

Pour garder les trackers à jour, FlowTracker insère des appels à ses méthodes hook lors de certains appels de méthodes du JDK. Par exemple, un appel à System.arraycopy est remplacé par un appel à com.coekie.flowtracker.hook.SystemHook.arraycopy.

Valeurs primitives, analyse de flux de données

Le suivi des valeurs primitives est un défi plus important. Par exemple, pour suivre une valeur byte, le tracker est stocké dans une variable locale à l’intérieur de la méthode.

Appels de méthode

Il modélise la manière dont les valeurs primitives circulent vers d’autres méthodes comme arguments d’appel et valeurs de retour. Invocation est utilisé pour stocker les PointTracker des arguments et des valeurs de retour.

Utiliser le code lui-même comme origine

Il suit les valeurs provenant du code lui-même, comme les constantes primitives et les constantes String. Un tracker est créé pour chaque classe, et ce tracker est référencé lorsqu’une constante est utilisée.

Littéraux String

Les littéraux String sont recopiés, et le contenu de la chaîne est relié à ClassOriginTracker. Par exemple, String s = "abc"; est réécrit en String s = StringHook.constantString("abc", 1234, 81);.

Méthode de repli pour les valeurs non suivies

Toutes les valeurs du programme ne sont pas suivies. Lorsqu’une valeur non suivie atteint un emplacement qui doit être suivi, elle est traitée de manière similaire à une constante.

Résumé de GN⁺

  • FlowTracker suit le flux de données des programmes Java pour aider à comprendre la sortie du programme.
  • La démo Spring PetClinic permet de visualiser le traitement des requêtes HTTP, l’utilisation des modèles et l’intégration avec la base de données.
  • L’outil est actuellement au stade de preuve de concept, peut ne pas bien fonctionner sur tous les programmes et entraîne un overhead de performance important.
  • Il suit l’origine des valeurs primitives et des objets via l’analyse de flux de données et le suivi des appels de méthode.
  • Des outils proposant des fonctionnalités similaires incluent Dynatrace et New Relic.

1 commentaires

 
GN⁺ 2024-09-15
Commentaires sur Hacker News
  • Présentation d’un outil appelé FlowStorm pour Clojure

    • fork du compilateur Clojure officiel afin d’insérer du bytecode supplémentaire
    • comme la plupart des valeurs sont immuables, il est possible de conserver les pointeurs pour prendre des instantanés
    • lien vers une démo de débogage d’application web : démo FlowStorm
  • Éloge de l’excellente qualité des outils de l’écosystème Java/JVM

    • impressionné à un niveau comparable à jitwatch
    • FlowTracker rappelle l’analyse de taint
    • mots-clés associés : "dynamic taint tracking/analysis"
    • liens vers des projets liés :
  • Impressionné par la démo qui suit un élément HTML jusqu’à une requête SQL

    • ce type d’outil pourrait devenir la première ligne de défense pour résoudre des bugs
  • Cela rappelle l’environnement Smalltalk

    • il est possible de suivre et d’interagir avec tous les objets et messages
  • Insiste sur le fait que la vidéo de démo est très utile

    • cela serait utile pour explorer une base de code inconnue
  • Partage une expérience d’expérimentation d’un concept similaire aux source maps HTML

    • les outils de développement web bénéficieraient énormément de ce type de propriété full-stack
    • l’intégration dans des frameworks existants constitue un défi majeur
    • lien vers un projet lié : HTML Source Maps
  • Mentionne une similarité avec la démo Eve-lang

  • Se souvient d’un article similaire sur un outil permettant de détecter dynamiquement les injections SQL

  • Partage avoir eu une vision consistant à tracer les données sur Internet

    • c’est une étape vers la possibilité de retracer l’origine d’une image ou le parcours d’une chaîne de caractères
  • Remercie pour l’idée d’essayer cet outil avec VSCode et dans un projet

    • l’essai est actuellement interrompu, mais il prévoit de réessayer