RFR: 8292699: Improve printing of classes in native debugger [v3]

Ioi Lam iklam at openjdk.org
Sun Aug 21 21:23:58 UTC 2022


On Sun, 21 Aug 2022 15:59:50 GMT, Ioi Lam <iklam at openjdk.org> wrote:

>> Current in gdb, you can print information about a class or method with something like
>> 
>> 
>> call ((InstanceKlass*)0x00000008000411b8)->print_on(tty)
>> call ((Method*)0x00007fffb4000d08)->print_codes_on(tty)
>> 
>> 
>> However, it's difficult to find a class or method by its name and print out its contents.
>> 
>> This RFE adds 3 new functions in debug.cpp so you can easily find classes/methods and print out their contents. They all have a `flags` argument that controls the verbosity.
>> 
>> - `findclass()`: class name only
>> - `findmethod()`: class name and method name
>> - `findmethod2()`: class name and method name/signature
>> 
>> I also cleaned up `BytecodeTracer` to remove unnecessary complexity.
>> 
>> Here are some examples:
>> 
>> 
>> (gdb) call findclass("java/lang/Object", 0)
>> [0] 0x00000008000411b8 java.lang.Object, loader data: 0x00007ffff0130d10 of 'bootstrap'
>> 
>> (gdb) call findclass("java/lang/Object", 1)
>> [0] 0x00000008000411b8 java.lang.Object, loader data: 0x00007ffff0130d10 of 'bootstrap'
>> 0x00007fffb4000658 <init> : ()V
>> 0x00007fffb40010f0 finalize : ()V
>> 0x00007fffb4000f00 wait0 : (J)V
>> 0x00007fffb40008e8 equals : (Ljava/lang/Object;)Z
>> 0x00007fffb4000aa0 toString : ()Ljava/lang/String;
>> 0x00007fffb40007f0 hashCode : ()I
>> 0x00007fffb4000720 getClass : ()Ljava/lang/Class;
>> 0x00007fffb40009a0 clone : ()Ljava/lang/Object;
>> 0x00007fffb4000b50 notify : ()V
>> 0x00007fffb4000c20 notifyAll : ()V
>> 0x00007fffb4000e50 wait : (J)V
>> 0x00007fffb4001028 wait : (JI)V
>> 0x00007fffb4000d08 wait : ()V
>> 
>> (gdb) call findclass("*ClassLoader", 0)
>> [0] 0x000000080007de40 jdk.internal.loader.ClassLoaders$BootClassLoader, loader data: 0x00007ffff0130d10 of 'bootstrap'
>> [1] 0x0000000800053c58 jdk.internal.loader.ClassLoaders$PlatformClassLoader, loader data: 0x00007ffff0130d10 of 'bootstrap'
>> [2] 0x0000000800053918 jdk.internal.loader.ClassLoaders$AppClassLoader, loader data: 0x00007ffff0130d10 of 'bootstrap'
>> [....]
>> 
>> (gdb) call findmethod2("*ang/Object*", "wait", "()V", 0x7)
>> [0] 0x00000008000411b8 java.lang.Object, loader data: 0x00007ffff0130d10 of 'bootstrap'
>> 0x00007fffb4000d08 wait : ()V
>> 0x00007fffb4000ce8 0 fast_aload_0
>> 0x00007fffb4000ce9 1 lconst_0
>> 0x00007fffb4000cea 2 invokevirtual 38 <java/lang/Object.wait(J)V>
>> 0x00007fffb4000ced 5 return
>
> Ioi Lam has updated the pull request incrementally with one additional commit since the last revision:
> 
>   fixed windows build

I added the ability to print out details for `invokedynamic` bytecodes.


0x00007fffb4500708 main : ([Ljava/lang/String;)V
0x00007fffb45006b8    0 invokedynamic bsm=104 7 <run()Ljava/lang/Runnable;>
  BSM: REF_invokeStatic 105 <java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;> 
  arguments[3] = {
     <MethodType> 6 Symbol: '()V' count 65535
     <MethodHandle of kind 6 index at 113> 113 <HelloLambda.lambda$main$0()V> 
     <MethodType> 6 Symbol: '()V' count 65535
  }
  ConstantPoolCacheEntry:  19  (0x00007fffb4500f80)  [00|ba|    7]
                 [   0x00007fffb4427268]
                 [   0x000000000000000b]
                 [   0xffffffff83400001]
                 -------------
  Method: java/lang/invoke/Invokers$Holder.linkToTargetMethod(Ljava/lang/Object;)Ljava/lang/Object;
  appendix: java.lang.invoke.BoundMethodHandle$Species_L 
{0x000000062da8ab68} - klass: 'java/lang/invoke/BoundMethodHandle$Species_L'
 - ---- fields (total size 5 words):
 - private 'customizationCount' 'B' @12  0
 - private volatile 'updateInProgress' 'Z' @13  false
 - private final 'type' 'Ljava/lang/invoke/MethodType;' @16  a 'java/lang/invoke/MethodType'{0x000000062da831f8} = ()Ljava/lang/Runnable; (c5b5063f)
 - final 'form' 'Ljava/lang/invoke/LambdaForm;' @20  a 'java/lang/invoke/LambdaForm'{0x000000062da8aa48} => a 'java/lang/invoke/MemberName'{0x000000062da8d948} = {method} {0x00007fffb4502278} 'invoke' '(Ljava/lang/Object;)Ljava/lang/Object;' in 'java/lang/invoke/LambdaForm$MH+0x0000000800000400' (c5b51549)
 - private 'asTypeCache' 'Ljava/lang/invoke/MethodHandle;' @24  NULL (0)
 - private 'asTypeSoftCache' 'Ljava/lang/ref/SoftReference;' @28  NULL (0)
 - final 'argL0' 'Ljava/lang/Object;' @32  a 'HelloLambda$$Lambda$2+0x0000000800000a18'{0x000000062da86120} (c5b50c24)
0x00007fffb45006bd    5 invokestatic 11 <HelloLambda.doit(Ljava/lang/Runnable;)V>

-------------

PR: https://git.openjdk.org/jdk/pull/9957


More information about the hotspot-dev mailing list