JDWP features hidden under JDI
David Holmes
david.holmes at oracle.com
Tue Nov 23 10:18:37 UTC 2021
Hi Anton,
There may be someone who recalls this detail of ancient history but it
is ancient. :) As a low-level protocol JDWP exposes a lot of things. But
then the higher-level API's, like the original JVM DI, and its
replacement JVM TI, provide a different level of abstraction and need
not expose as much low-level detail (but may need that lower-level
information to implement their own APIs). Then JDI is a higher-level API
again. Answering "why" 20+ years later is not an easy thing. :)
Cheers,
David
On 23/11/2021 7:25 pm, Anton W. Haubner wrote:
> Hello!
>
> I am working on a new kind of debugger which extracts information about the
> state of Java programs through the JDI to build RDF knowledge graphs.
>
> While working on the project, I noticed that there is certain
> information about
> the program state that is accessible through JDWP, but which is hidden
> by the
> JDI interfaces (see below for examples).
>
> I am curious, whether this was done to simplify the interface, or if
> there is
> a deeper reason behind this, e.g. because the information in question is
> unreliable etc.
> If there is no such reason, I might try to modify the JDI reference
> implementation to provide this information to me.
>
> *First Example: Retrieving Objects by ID*
>
> The ObjectReference JDI interface does allow to retrieve the unique id
> assigned to
> an object by the JDWP agent.
>
> However, it seems it is not possible to construct an ObjectReference
> from such
> an id. That is, one can not quickly look up an object by its id, but has to
> search through all objects to find it again.
>
> Looking at the JDWP specification, it seems that the underlying JDWP
> protocol
> does support looking up objects using just their id:
> https://docs.oracle.com/en/java/javase/17/docs/specs/jdwp/jdwp-protocol.html#JDWP_ObjectReference
>
> The reference implementation of the `ObjectReference` interface also
> seems to
> only require this id to retrieve all required information:
> https://github.com/openjdk/jdk/blob/dfacda488bfbe2e11e8d607a6d08527710286982/src/jdk.jdi/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java#L109
>
> /My question now is:/
> Is there a specific reason that there is no public factory method to
> construct
> an ObjectReference from an object id?
> Or would it be "safe" to create a custom `ObjectReference`
> implementation that
> allows this, as long as it deals with the `INVALID_OBJECT` error case of
> JDWP?
>
> *Second Example: Variable Locations*
>
> The JDWP `VariableTable` command reply does contain the code index of
> variables.
> Nevertheless, it is neither possible to retrieve the code index of a
> variable
> through the `LocalVariable` JDI interface, nor through the `Method`
> interface.
>
> Meanwhile, internally, the `LocalVariable` reference implementation does
> seem
> to store the scope of a variable:
> https://github.com/openjdk/jdk/blob/dfacda488bfbe2e11e8d607a6d08527710286982/src/jdk.jdi/share/classes/com/sun/tools/jdi/LocalVariableImpl.java#L56
>
> The Eclipse JDI implementation also stores the plain code index value:
> https://git.eclipse.org/c/jdt/eclipse.jdt.debug.git/tree/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/LocalVariableImpl.java#n63
>
> Is there a specific reason, why this location information is not exposed
> in the
> public interface?
>
>
>
>
> Thank you very much for reading my questions.
> Can you help me to answer them?
>
> Best regards,
>
> Anton Haubner
>
More information about the serviceability-dev
mailing list