J'aime vraiment les fonctionnalités de débogage à distance de la JVM. Mais je me demande comment cela fonctionne en interne.
Mon hypothèse: cela se fait via une fonctionnalité JVM où le processus en cours télécharge/utilise le code source à partir du débogueur distant attaché (comme IDE) Il connaît la ligne de la trace de pile actuelle et peut ensuite passer au respectif = IDE point d'arrêt. La communication de la trace de pile et de l'introspection de l'état de l'application se fait alors soit via des sockets soit en mémoire partagée (paramétrage du débogueur distant).
Quelqu'un at-il des liens/ressources intéressants à ce sujet?
Les fonctionnalités de débogage de la JVM sont fournies via Java Platform Debugger Architecture (JPDA) .
Le JPDA lui-même est composé des éléments suivants:
Le diagramme répertorié dans structure d'architecture JPDA est un bon point de départ. Les autres endroits à rechercher seraient les guides répertoriés dans la page JPDA .
Le débogage Eclipse commence par ce que l'on appelle des agents.
La JVM, qui exécute les sources ".class" conformes, a une fonctionnalité qui permet aux bibliothèques externes (écrites en Java ou C++) d'être injectées dans la JVM, pendant l'exécution. Ces bibliothèques externes sont référencées en tant qu'agents et ils ont la possibilité de modifier le contenu des fichiers .class exécutés. Ces agents ont accès à des fonctionnalités de la machine virtuelle Java qui ne sont pas accessibles à partir d'un code Java Java s'exécutant à l'intérieur). la JVM et ils peuvent être utilisés pour faire des choses intéressantes comme injecter et modifier le code source en cours d'exécution, le profilage, etc. Certains outils comme JRebel (utilisé pour le remplacement à chaud du code) utilisent cette fonctionnalité pour réaliser leur magie.
Et pour passer un Agent Lib à une JVM, vous le faites via des arguments de démarrage, en utilisant le -
agentlib:libname[=options]
Nous transmettions en fait un agent Lib nommé jdwp à la machine virtuelle Java exécutant Tomcat. Le jdwp est une implémentation optionnelle spécifique à la JVM du JDWP (Java Debug Wire Protocol) qui est utilisée pour définir la communication entre un débogueur et une JVM en cours d'exécution. Son implémentation, si elle est présente, est fournie en tant que bibliothèque native de la machine virtuelle Java sous la forme jdwp.so ou jdwp.dll
Alors qu'est-ce que ça fait? En termes simples, l'agent jdwp que nous transmettons sert essentiellement de lien entre l'instance JVM exécutant une application et un débogueur (qui peut être situé à distance ou local). Puisqu'il s'agit d'une bibliothèque d'agents, elle a la capacité d'intercepter le code en cours d'exécution, de créer un pont entre la JVM et un débogueur et de disposer des fonctionnalités d'un débogueur appliquées sur la JVM. Étant donné que dans l'architecture JVM, la fonctionnalité de débogage ne se trouve pas dans la JVM elle-même, mais est abstraite dans des outils externes (appelés à juste titre débogueurs), ces outils peuvent résider sur la machine locale exécutant la JVM en cours de débogage ou être exécutés depuis une machine externe. C'est cette architecture modulaire découplée qui nous permet d'avoir une machine virtuelle Java fonctionnant sur une machine distante et en utilisant le JDWP, d'avoir un débogueur distant capable de communiquer avec elle.
Voilà comment le débogueur Eclipse fonctionne en bref.
L'architecture de débogage de Java est appelée JPDA. Vous voulez probablement lire le JPDA documentation . En particulier, la section Walk-through donne un exemple d'interface IDE avec le JDI pour obtenir une valeur sur la pile).