RFR(M): 8236913: debug agent's jdwp command logging should include the command set name and command name

Chris Plummer chris.plummer at oracle.com
Fri Jan 10 19:27:36 UTC 2020


Hello,

Please review the following

https://bugs.openjdk.java.net/browse/JDK-8236913
http://cr.openjdk.java.net/~cjplummer/8236913/webrev.00/

The debug agent has logging support that will trace all jdwp commands 
coming in. Currently all it traces is the command set number and the 
command number within that command set. So you see something like:

[#|10.01.2020 06:27:24.366 
GMT|FINEST|J2SE1.5|jdwp|LOC=MISC:"debugLoop.c":240;;PID=12719;THR=t at 915490560|:Command 
set 1, command 9|#]

I've added support for including the name of the command set and 
command, so now you see:

[#|10.01.2020 06:27:24.366 
GMT|FINEST|J2SE1.5|jdwp|LOC=MISC:"debugLoop.c":240;;PID=12719;THR=t at 915490560|:Command 
set VirtualMachine(1), command Resume(9)|#]

So in this case command set 1 represents VirtualMachine and command 9 is 
the Resume command.

I was initially going to leverage jdwp.spec which is already processed 
by build.tools.jdwpgen.Main to produce JDWP.java and JDWPCommands.h. 
However, I could see it was more of a challenge than I initially hoped. 
Also, the main advantage would have been not having to hard code arrays 
of command names, but we already have harded coded arrays of function 
pointers to handle the various jdwp commands, so I just replaced these 
with a more specialized arrays that also include the names of the 
commands. As an example, we used to have:

void *ArrayReference_Cmds[] = { (void *)0x3
     ,(void *)length
     ,(void *)getValues
     ,(void *)setValues};

Now we have:

CommandSet ArrayReference_Cmds = {
     3, "ArrayReference",
     {
         {length, "Length"},
         {getValues, "GetValues"},
         {setValues, "SetValues"}
     }
};

So no worse w.r.t. hard coding things that could be generated off the 
spec, and it cleans up some ugly casts also. The CommandSet typedef can 
be found in debugDispatch.h.

All the header files except for debugDispatch.h have the same pattern 
for changes, so they are pretty easy to review

All .c files except debugDispatch.c and debugLoop.c also have the same 
pattern. Note some command handler function names are not the same as 
the command name. If you want to double check command set names and 
command names, you can find the spec here:

https://docs.oracle.com/javase/9/docs/specs/jdwp/jdwp-protocol.html

In ReferenceTypeImpl.c I fixed a typo in the method() prototype. It had 
an extra argument which I think was a very old copy-n-paste bug from the 
method1() prototype. This was caught because the command handler 
functions are now directly assigned to a CommandHandler type rather than 
cast. The cast was hiding this bug.

I tested by doing a test run where MISC logging was enabled by default. 
All jdwp, jdb, and jdi tests were run in this way and passed.

thanks,

Chris



More information about the serviceability-dev mailing list