2009-08-31 7 views
8

Existe-t-il un moyen d'obtenir une carte ou une autre structure de données des variables locales dans la portée actuelle sur la machine virtuelle Java sans utiliser de débogueur? Autrement dit, pour obtenir les locaux de la trame de la pile actuelle?Obtention de variables locales à partir d'une image de pile sur la machine virtuelle Java

Je sais qu'il existe des objets stacktrace, mais StackTraceElement n'a aucun moyen d'accéder à n'importe quel état. Il vous dit juste quelle méthode a été appelée où, mais pas ce qui était dedans.

Répondre

4

Les noms de variables peuvent être inclus dans les fichiers de classe pour aider les débogueurs, mais javac ne le fait pas par défaut. Il nécessite l'option .

S'il est présent, un programme peut utiliser une bibliothèque d'ingénierie de code octet telle que ASM pour accéder aux noms et à la portée des variables locales.

Alors que this question est mal formulé, je pense que c'est un doublon, et ses réponses peuvent être pertinentes à votre problème. J'ajouterai que si vous ne vous souciez pas des noms, le type et la portée de la variable locale sont toujours inclus dans la table attributaire de chaque méthode.

1

Je ne pense pas qu'il existe un moyen de le faire. Le compilateur est toujours libre d'optimiser les variables locales, et fournir une telle méthode empêcherait le compilateur de tirer parti de ce type d'optimisation. Lors de la compilation d'une méthode, le compilateur ne serait pas en mesure de dire si vous avez appelé un getLocalVariables() hypothétique ailleurs dans le programme, donc il devrait toujours mettre toutes les variables locales déclarées dans une telle carte.

+0

Les variables locales sont disponibles dans une carte dans le StackFrame. Vous pouvez jeter un oeil ici https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html –

Questions connexes