SlideShare a Scribd company logo
1 of 55
J9, OMR and beyond
Serviceable Runtimes
• Bjørn Vårdal
• IBM Runtimes Developer
• J9 JVM
• @bvaardal
• MethodHandles
• Lambdas
• VarHandles
• Project Valhalla
Bjørn Vårdal IBM Runtime Technologies 2
Introduction
Bjørn Vårdal IBM Runtime Technologies 3
Most die young_______runtimes
unless you service them.
The information contained in this presentation is provided for informational purposes only.
Whilst efforts were made to verify the completeness and accuracy of the information contained in this
presentation, it is provided “as is”, without warranty of any kind, express or implied.
All performance data included in this presentation have been gathered in a controlled environment. Your own test
results may vary based on hardware, software or infrastructure differences.
All data included in this presentation are meant to be used only as a guide.
In addition, the information contained in this presentation is based on IBM’s current product plans and strategy,
which are subject to change by IBM, without notice.
IBM and its affiliated companies shall not be responsible for any damages arising out of the use of, or otherwise
related to, this presentation or any other documentation.
Nothing contained in this presentation is intended to, or shall have the effect of:
- creating any warrant or representation from IBM, its affiliated companies or its or their suppliers and/or licensors
Bjørn Vårdal IBM Runtime Technologies 4
Disclaimer
• Advanced core dump analysis for J9
• Used by the J9 service team
• Used by J9 developers
• Front-end: DDR Interactive
Bjørn Vårdal IBM Runtime Technologies 5
Direct Dump Reader
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345
Bjørn Vårdal IBM Runtime Technologies 6
DDR Interactive
Ships with J9
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345
Bjørn Vårdal IBM Runtime Technologies 7
DDR Interactive
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
>
Bjørn Vårdal IBM Runtime Technologies 8
DDR Interactive
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
>
Bjørn Vårdal IBM Runtime Technologies 9
DDR Interactive
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
> !j9help
Bjørn Vårdal IBM Runtime Technologies 10
DDR Interactive
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
> !j9help
threads Lists VM threads
stack Walks the Java stack for <thread>
stackslots Walks the Java stack (including objects) for <thread>
.
.
.
classforname Find the class corresponding to name (with wildcards)
dumpromclass Dump the specified J9ROMClass. Wild cards are allowed in class name.
findpattern Search memory for a specific pattern
whatis Determine the type of structure at a given address
Bjørn Vårdal IBM Runtime Technologies 11
DDR - !j9help
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
> !threads
Bjørn Vårdal IBM Runtime Technologies 12
DDR - !threads
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
> !threads
!stack 0x0228d70 !j9vmthread 0x0228d70 !j9thread 0x07f274807d70 tid 0x4b (75) // (main)
!stack 0x02294f0 !j9vmthread 0x02294f0 !j9thread 0x7f27480b0bf8 tid 0x4e (78) // (JIT Compilation Thread-1)
!stack 0x022af20 !j9vmthread 0x022af20 !j9thread 0x7f27480bfcb0 tid 0x55 (85) // (JIT-SamplerThread)
!stack 0x022b2e0 !j9vmthread 0x022b2e0 !j9thread 0x7f27480c0228 tid 0x56 (86) // (IProfiler)
!stack 0x0238620 !j9vmthread 0x0238620 !j9thread 0x7f2748238170 tid 0x57 (87) // (Common-Cleaner)
!stack 0x023f480 !j9vmthread 0x023f480 !j9thread 0x7f27482386e8 tid 0x58 (88) // (Signal Dispatcher)
!stack 0x023f840 !j9vmthread 0x023f840 !j9thread 0x7f27483d01f8 tid 0x5a (90) // (Concurrent Mark Helper)
!stack 0x0023fc0 !j9vmthread 0x0023fc0 !j9thread 0x7f27483d0c90 tid 0x5b (91) // (GC Slave)
!stack 0x0002420 !j9vmthread 0x0002420 !j9thread 0x007f26e084d0 tid 0x5f (95) // (Attach API wait loop)
!stack 0x0240730 !j9vmthread 0x0240730 !j9thread 0x7f27483d2218 tid 0x60 (96) // (Finalizer thread)
>
Bjørn Vårdal IBM Runtime Technologies 13
DDR - !threads
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
> !threads
!stack 0x0228d70 !j9vmthread 0x0228d70 !j9thread 0x07f274807d70 tid 0x4b (75) // (main)
!stack 0x02294f0 !j9vmthread 0x02294f0 !j9thread 0x7f27480b0bf8 tid 0x4e (78) // (JIT Compilation Thread-1)
!stack 0x022af20 !j9vmthread 0x022af20 !j9thread 0x7f27480bfcb0 tid 0x55 (85) // (JIT-SamplerThread)
!stack 0x022b2e0 !j9vmthread 0x022b2e0 !j9thread 0x7f27480c0228 tid 0x56 (86) // (IProfiler)
!stack 0x0238620 !j9vmthread 0x0238620 !j9thread 0x7f2748238170 tid 0x57 (87) // (Common-Cleaner)
!stack 0x023f480 !j9vmthread 0x023f480 !j9thread 0x7f27482386e8 tid 0x58 (88) // (Signal Dispatcher)
!stack 0x023f840 !j9vmthread 0x023f840 !j9thread 0x7f27483d01f8 tid 0x5a (90) // (Concurrent Mark Helper)
!stack 0x0023fc0 !j9vmthread 0x0023fc0 !j9thread 0x7f27483d0c90 tid 0x5b (91) // (GC Slave)
!stack 0x0002420 !j9vmthread 0x0002420 !j9thread 0x007f26e084d0 tid 0x5f (95) // (Attach API wait loop)
!stack 0x0240730 !j9vmthread 0x0240730 !j9thread 0x7f27483d2218 tid 0x60 (96) // (Finalizer thread)
>
Bjørn Vårdal IBM Runtime Technologies 14
DDR - !threads
$ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp
*0 : PID: 2824; !j9javavm 0x7f27480eef0
Run !j9help to see a list of commands
> !threads
!stack 0x0228d70 !j9vmthread 0x0228d70 !j9thread 0x07f274807d70 tid 0x4b (75) // (main)
!stack 0x02294f0 !j9vmthread 0x02294f0 !j9thread 0x7f27480b0bf8 tid 0x4e (78) // (JIT Compilation Thread-1)
!stack 0x022af20 !j9vmthread 0x022af20 !j9thread 0x7f27480bfcb0 tid 0x55 (85) // (JIT-SamplerThread)
!stack 0x022b2e0 !j9vmthread 0x022b2e0 !j9thread 0x7f27480c0228 tid 0x56 (86) // (IProfiler)
!stack 0x0238620 !j9vmthread 0x0238620 !j9thread 0x7f2748238170 tid 0x57 (87) // (Common-Cleaner)
!stack 0x023f480 !j9vmthread 0x023f480 !j9thread 0x7f27482386e8 tid 0x58 (88) // (Signal Dispatcher)
!stack 0x023f840 !j9vmthread 0x023f840 !j9thread 0x7f27483d01f8 tid 0x5a (90) // (Concurrent Mark Helper)
!stack 0x0023fc0 !j9vmthread 0x0023fc0 !j9thread 0x7f27483d0c90 tid 0x5b (91) // (GC Slave)
!stack 0x0002420 !j9vmthread 0x0002420 !j9thread 0x007f26e084d0 tid 0x5f (95) // (Attach API wait loop)
!stack 0x0240730 !j9vmthread 0x0240730 !j9thread 0x7f27483d2218 tid 0x60 (96) // (Finalizer thread)
>
Bjørn Vårdal IBM Runtime Technologies 15
DDR - !threads
> !stack 0x0228d70
<1a2970> Generic special frame
<1a2970> !j9method 0x01B9A718 X.print(Ljava/lang/String;)V
<1a2970> !j9method 0x01B9A6F8 X.m(I)V
<1a2970> !j9method 0x01B9A6D8 X.main([Ljava/lang/String;)V
<1a2970> JNI call-in frame
<1a2970> Native method frame
>
Bjørn Vårdal IBM Runtime Technologies 16
DDR - !stack
> !stack 0x0228d70
<1a2970> Generic special frame
<1a2970> !j9method 0x01B9A718 X.print(Ljava/lang/String;)V
<1a2970> !j9method 0x01B9A6F8 X.m(I)V
<1a2970> !j9method 0x01B9A6D8 X.main([Ljava/lang/String;)V
<1a2970> JNI call-in frame
<1a2970> Native method frame
>
Bjørn Vårdal IBM Runtime Technologies 17
DDR - !stack
> !stackslots 0x0228d70
<1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 ***
<1a2970> ITERATE_O_SLOTS
<1a2970> RECORD_BYTECODE_PC_OFFSET
<1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ...
<1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ...
<1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ...
<1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718
<1a2970> Bytecode index = 16
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6D98 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0
<1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ...
<1a2970> Method: X.m(I)V !j9method 0x01B9A6F8
<1a2970> Bytecode index = 6
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234
<1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ...
<1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8
<1a2970> Bytecode index = 3
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668
<1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ...
<1a2970> New ELS = 0x0
<1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ...
<1a2970> Object pushes starting at 0x01AE6E08 for 12 slots
Bjørn Vårdal IBM Runtime Technologies 18
DDR - !stackslots
> !stackslots 0x0228d70
<1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 ***
<1a2970> ITERATE_O_SLOTS
<1a2970> RECORD_BYTECODE_PC_OFFSET
<1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ...
<1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ...
<1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ...
<1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718
<1a2970> Bytecode index = 16
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6D98 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0
<1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ...
<1a2970> Method: X.m(I)V !j9method 0x01B9A6F8
<1a2970> Bytecode index = 6
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234
<1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ...
<1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8
<1a2970> Bytecode index = 3
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668
<1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ...
<1a2970> New ELS = 0x0
<1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ...
<1a2970> Object pushes starting at 0x01AE6E08 for 12 slots
Bjørn Vårdal IBM Runtime Technologies 19
DDR - !stackslots
> !stackslots 0x0228d70
<1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 ***
<1a2970> ITERATE_O_SLOTS
<1a2970> RECORD_BYTECODE_PC_OFFSET
<1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ...
<1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ...
<1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ...
<1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718
<1a2970> Bytecode index = 16
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6D98 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0
<1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ...
<1a2970> Method: X.m(I)V !j9method 0x01B9A6F8
<1a2970> Bytecode index = 6
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234
<1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ...
<1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8
<1a2970> Bytecode index = 3
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668
<1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ...
<1a2970> New ELS = 0x0
<1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ...
<1a2970> Object pushes starting at 0x01AE6E08 for 12 slots
Bjørn Vårdal IBM Runtime Technologies 20
DDR - !stackslots
> !stackslots 0x0228d70
<1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 ***
<1a2970> ITERATE_O_SLOTS
<1a2970> RECORD_BYTECODE_PC_OFFSET
<1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ...
<1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ...
<1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ...
<1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718
<1a2970> Bytecode index = 16
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6D98 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0
<1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ...
<1a2970> Method: X.m(I)V !j9method 0x01B9A6F8
<1a2970> Bytecode index = 6
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234
<1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ...
<1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8
<1a2970> Bytecode index = 3
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668
<1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ...
<1a2970> New ELS = 0x0
<1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ...
<1a2970> Object pushes starting at 0x01AE6E08 for 12 slots
Bjørn Vårdal IBM Runtime Technologies 21
DDR - !stackslots
> !j9object 0x0FFEF46D0
J9VMJavaLangString at 0x00000000FFEF46D0 {
struct J9Class* clazz = !j9class 0x1A5B500 // java/lang/String
Object flags = 0x00000000;
[B value = !fj9object 0x86f36828 (offset=0) (java/lang/String)
I count = 0x00000007 (offset=4) (java/lang/String)
I hashCode = 0x00000000 (offset=8) (java/lang/String)
"foo4660"
}
Bjørn Vårdal IBM Runtime Technologies 22
DDR - !j9object
> !j9object 0x0FFEF46D0
J9VMJavaLangString at 0x00000000FFEF46D0 {
struct J9Class* clazz = !j9class 0x1A5B500 // java/lang/String
Object flags = 0x00000000;
[B value = !fj9object 0x86f36828 (offset=0) (java/lang/String)
I count = 0x00000007 (offset=4) (java/lang/String)
I hashCode = 0x00000000 (offset=8) (java/lang/String)
"foo4660"
}
Bjørn Vårdal IBM Runtime Technologies 23
DDR - !j9object
GDB
• Requires intimate knowledge
about the JVM internal structures
• Requires debug symbols
• Source must match
• Platform specific
DDR
• Has intimate knowledge about
the JVM internal structures
• Doesn’t require debug symbols
• Cross JVM version
• Cross platform
Bjørn Vårdal IBM Runtime Technologies 24
GDB vs DDR
> !stackslots 0x0228d70
<1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 ***
<1a2970> ITERATE_O_SLOTS
<1a2970> RECORD_BYTECODE_PC_OFFSET
<1a2970> Initial values: walkSP = 0x01AE6D60, A0 = 0x01AE6D78,
<1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60,
<1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, arg0EA =
<1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718
<1a2970> Bytecode index = 16
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6D98 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0
<1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc =
<1a2970> Method: X.m(I)V !j9method 0x01B9A6F8
<1a2970> Bytecode index = 6
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234
<1a2970> Bytecode frame: bp = 0x01AE6DD0, arg0EA = 0x1AE6DD8
<1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8
<1a2970> Bytecode index = 3
<1a2970> Using local mapper
<1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots
<1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668
<1a2970> JNI call-in frame: sp = 0x01AE6DE0, pc = 0x07FDCB96DE314
<1a2970> JNI native method frame: cp = 0x0, arg0EA = 0x01AE6E88, ...
<1a2970> Object pushes starting at 0x01AE6E08 for 12 slots
(gdb) x/200 0x0000000001AE6D60
0x1ae6d60: 0x00000000 0x00000000 0x01b9a718 0x00000000
0x1ae6d70: 0xb43a6344 0x00007fdc 0x01ae6d9a 0x00000000
0x1ae6d80: 0x01b9a6f8 0x00000000 0xb43a630a 0x00007fdc
0x1ae6d90: 0x01ae6db8 0x00000000 0xffef46d0 0x00000000
0x1ae6da0: 0x01b9a6d8 0x00000000 0xb43a62db 0x00007fdc
0x1ae6db0: 0x01ae6dd8 0x00000000 0x00001234 0x00000000
0x1ae6dc0: 0x00000000 0x00000000 0xb96de314 0x00007fdc
0x1ae6dd0: 0x01ae6e00 0x00000000 0xffee5668 0x00000000
0x1ae6de0: 0x00000000 0x00000000 0x00020000 0x00000000
0x1ae6df0: 0x00000060 0x00000000 0x00000007 0x00000000
0x1ae6e00: 0x01ae6e8a 0x00000000 0xffee5668 0x00000000
0x1ae6e10: 0x86ef0828 0x00000000 0x86f317d0 0x00000000
0x1ae6e20: 0x86f317d0 0x00000000 0x00000000 0x00000000
0x1ae6e30: 0x00000000 0x00000000 0x86f2ed50 0x00000000
0x1ae6e40: 0x86ef3548 0x00000000 0x86ef34b8 0x00000000
0x1ae6e50: 0x86ef0240 0x00000000 0x86ef0fb0 0x00000000
DDR
Bjørn Vårdal IBM Runtime Technologies 25
GDB vs DDR
GDB
Bjørn Vårdal IBM Runtime Technologies 26
DDR Interactive
”The tool that I use the most and that saves me the most time.”
J9 Service Team Lead
“We can implement commands to look for known symptoms,
which drastically reduces our triage work.”
J9 Service Team Member
• We are open-sourcing the J9 JVM
• DDR coming along for the ride 
• http://openj9.org
Bjørn Vårdal IBM Runtime Technologies 27
OpenJ9
Reliable Shared Components for High Performance Language Runtimes
http://www.eclipse.org/omr
https://github.com/eclipse/omr
https://developer.ibm.com/open/omr
Bjørn Vårdal IBM Runtime Technologies 28
Eclipse OMR
Bjørn Vårdal IBM Runtime Technologies 29
Agenda
• DDR in J9
• Capabilities
• How DDR is implemented
• OMR ddrgen
• Generating the DDR resources
• DDR in a new runtime
• Adding DDR capabilities to Base9
• Loading a Base9 core into DDR Interactive
• Print structure at address
!j9object 0x12345678
!j9method 0xABCDEF00
• Other printing commands
!stackslots 0xABCDEF0
• Utility functions
!classforname
!findpattern
!whatis
• Data analysis
gccheck
deadlock
Bjørn Vårdal IBM Runtime Technologies 30
What can DDR do?
>
• Print structure at address
!j9object 0x12345678
!j9method 0xABCDEF00
• Other printing commands
!stackslots 0xABCDEF0
• Utility functions
!classforname
!findpattern
!whatis
• Data analysis
gccheck
deadlock
Bjørn Vårdal IBM Runtime Technologies 31
What can DDR do?
> gccheck
Starting GC Check
Checking HEAP...done (919 ms).
Checking CLASS HEAP...done (296 ms).
Checking REMEMBERED SET...done (54 ms).
Checking UNFINALIZED...done (3 ms).
Checking FINALIZABLE...done (3 ms).
Checking OWNABLE_SYNCHRONIZER...done (1 ms).
Checking STRING TABLE...done (516 ms).
Checking CLASS LOADERS...done (4 ms).
Checking JNI GLOBAL REFS...done (1 ms).
Checking JNI WEAK GLOBAL REFS...done (1 ms).
Checking JVMTI OBJECT TAG TABLES...done (3 ms).
Checking VM CLASS SLOTS...done (1 ms).
Checking MONITOR TABLE...done (7 ms).
Checking VM THREAD SLOTS...done (208 ms).
Checking THREAD STACKS...done (25 ms).
Done (2058ms)
• Structure layout information in
the process memory
• DDR data generator generates
blob and code
• Detectable RAS structure in
memory at runtime
Bjørn Vårdal IBM Runtime Technologies 32
How does DDR work?
Runtime
DDR InteractiveDDR data
generator
DDR
blob
Core dump
DDR
blob
Generated
code
RAS RAS
Bjørn Vårdal IBM Runtime Technologies 33
DDR Components
OpenJ9Eclipse OMR
J9 JVM
DDR data
generator
DDR Interactive
RAS
Bjørn Vårdal IBM Runtime Technologies 34
RAS Structure
Runtime memory
VM structure
Threads
Port library
etc.
Bjørn Vårdal IBM Runtime Technologies 35
RAS Structure
Runtime memory
RAS Structure
Eye catcher: “J9VMRAS”
Bit pattern: 0xAA55AA55
...
DDR Structure blob
…
VM
…
VM structure
Threads
Port library
etc.
Bjørn Vårdal IBM Runtime Technologies 36
RAS Structure
Runtime memory
DDR blob
Structure layouts
Field offsets
Build flags
RAS Structure
Eye catcher: “J9VMRAS”
Bit pattern: 0xAA55AA55
...
DDR Structure blob
…
VM
…
VM structure
Threads
Port library
etc.
Bjørn Vårdal IBM Runtime Technologies 37
DDR Structure Blob
Runtime memory
DDR blob
Structure layouts
Field offsets
Build flags
RAS Structure
Eye catcher: “J9VMRAS”
Bit pattern: 0xAA55AA55
...
DDR Structure blob
…
VM
…
VM structure
Threads
Port library
etc.
Bjørn Vårdal IBM Runtime Technologies 38
OMR ddrgen
Compile
with debug
symbols
ddrgen
blob.dat
Load into
memory at
runtime
Scan source
files for
build flags
./getMacros.sh .
libdwarf
Bjørn Vårdal IBM Runtime Technologies 39
DDR Class Generation
superset.out
DDR Interactive
(j9ddr.jar)
Generate Java
structure classes
superset.out
Generate Java
pointer classes
Bjørn Vårdal IBM Runtime Technologies 40
DDR Interactive startup
Generated
Java classes
DDR Interactive
DDR blob
from core file
DDR
ClassLoader
Template Field offsets
Load structure
classes
• DDR capabilities – Analyzing the JVM in a core file
• RAS structure – A detectable starting point
• OMR ddrgen – Creating the DDR blob and superset
• DDR Interactive – Using the blob and superset
Bjørn Vårdal IBM Runtime Technologies 41
Summary
Bjørn Vårdal IBM Runtime Technologies 42
DDR in a new Runtime
• Small tutorial runtime with ~10 opcodes
• For illustrating basic OMR JITBuilder functionality
• For demonstrating basic DDR functionality?
• My fork: https://github.com/bjornvar/Base9/tree/ddr
Bjørn Vårdal IBM Runtime Technologies 43
Base9
• Quick prototype
• ~1 hour of hacking
• Mostly copied from J9 JVM
Bjørn Vårdal IBM Runtime Technologies 44
DDR in Base9
Bjørn Vårdal IBM Runtime Technologies 45
RAS Structure in J9
JVM runtime memory
DDR blob
Structure layouts
Build flags
RAS Structure
Eye catcher: “J9VMRAS”
Bit pattern: 0xAA55AA55
...
DDR Structure blob
…
JavaVM
…
JavaVM structure
Threads
Port library
etc.
Bjørn Vårdal IBM Runtime Technologies 46
RAS Structure in Base9
Base9 runtime memory
DDR blob
Structure layouts
Build flags
Generated by running
ddrgen on Base9
RAS Structure
Eye catcher: “J9VMRAS”
Bit pattern: 0xAA55AA55
...
DDR Structure blob
…
ExecutionContext
Copied the structure
from the J9 source
ExecutionContext
Stack
String table
etc.
Bjørn Vårdal IBM Runtime Technologies 47
Base9 Code Changes
Bjørn Vårdal IBM Runtime Technologies 48
Base9 Code Changes
Bjørn Vårdal IBM Runtime Technologies 49
Base9 Code Changes
Bjørn Vårdal IBM Runtime Technologies 50
RAS Structure in Base9
Base9 runtime memory
DDR blob
Structure layouts
Build flags
RAS Structure
Eye catcher: “J9VMRAS”
Bit pattern: 0xAA55AA55
...
DDR Structure blob
…
ExecutionContext
ExecutionContext
Stack
String table
etc.
Bjørn Vårdal IBM Runtime Technologies 51
DDR Interactive
Some changes were required:
• Disabled all J9 specific functionality (!stackslots, etc.)
• Told it to look for B9RAS instead of J9RAS
• Added build flags constants
$
Bjørn Vårdal IBM Runtimes 52
DDR Interactive
Bjørn Vårdal IBM Runtime Technologies 53
What’s next?
• Make DDR Interactive plug-and-play
• Always support structure commands on DDR enabled core files
• Easy DDR generation process
• Release DDR Interactive and DDR generators
• OMR
• OpenJ9
Bjørn Vårdal IBM Runtime Technologies 54
Conclusion
• DDR in J9
• Capabilities
• How DDR is implemented
• OMR ddrgen
• Turning debug symbols into blob and superset
• DDR in Base9
• Adding DDR capabilities to a new runtime
• Loading a Base9 core into DDR Interactive
Bjørn Vårdal IBM Runtime Technologies 55
Q & A

More Related Content

What's hot

FSEC 2014 - I can haz your board with JTAG
FSEC 2014 - I can haz your board with JTAGFSEC 2014 - I can haz your board with JTAG
FSEC 2014 - I can haz your board with JTAGDobrica Pavlinušić
 
W8_2: Inside the UoS Educational Processor
W8_2: Inside the UoS Educational ProcessorW8_2: Inside the UoS Educational Processor
W8_2: Inside the UoS Educational ProcessorDaniel Roggen
 
Ak12 upgrade
Ak12 upgradeAk12 upgrade
Ak12 upgradeAccenture
 
Acer aspire 4252_4552_4552g_quanta_zqa_rev_1a_sch
Acer aspire 4252_4552_4552g_quanta_zqa_rev_1a_schAcer aspire 4252_4552_4552g_quanta_zqa_rev_1a_sch
Acer aspire 4252_4552_4552g_quanta_zqa_rev_1a_schjuan carlos pintos
 
[ODI] chapter2 what is "undo record chaining"?
[ODI] chapter2 what is "undo record chaining"?[ODI] chapter2 what is "undo record chaining"?
[ODI] chapter2 what is "undo record chaining"?EXEM
 
Raspberry Pi - best friend for all your GPIO needs
Raspberry Pi - best friend for all your GPIO needsRaspberry Pi - best friend for all your GPIO needs
Raspberry Pi - best friend for all your GPIO needsDobrica Pavlinušić
 
NTM quotaion dell server oct, 2014
NTM quotaion dell server oct, 2014NTM quotaion dell server oct, 2014
NTM quotaion dell server oct, 2014Anh Tuan
 
TC74LCX244FW PSpice Model (Free SPICE Model)
TC74LCX244FW PSpice Model (Free SPICE Model)TC74LCX244FW PSpice Model (Free SPICE Model)
TC74LCX244FW PSpice Model (Free SPICE Model)Tsuyoshi Horigome
 
Ks 50-1-ks-52-1-manual-english
Ks 50-1-ks-52-1-manual-englishKs 50-1-ks-52-1-manual-english
Ks 50-1-ks-52-1-manual-englishjeferson tadeu
 
First meet with Android Auto
First meet with Android AutoFirst meet with Android Auto
First meet with Android AutoJohnny Sung
 
Unit Testing: Special Cases
Unit Testing: Special CasesUnit Testing: Special Cases
Unit Testing: Special CasesCiklum Ukraine
 
TC74LCX244FT PSpice Model (Free SPICE Model)
TC74LCX244FT PSpice Model (Free SPICE Model)TC74LCX244FT PSpice Model (Free SPICE Model)
TC74LCX244FT PSpice Model (Free SPICE Model)Tsuyoshi Horigome
 
[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...
[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...
[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...EXEM
 
TC74LCX244F PSpice Model (Free SPICE Model)
TC74LCX244F PSpice Model (Free SPICE Model)TC74LCX244F PSpice Model (Free SPICE Model)
TC74LCX244F PSpice Model (Free SPICE Model)Tsuyoshi Horigome
 
Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz
Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz
Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz Ehsan Izadi
 
OCP 2015 summit_honey badger_and_panther+_update
OCP 2015 summit_honey badger_and_panther+_updateOCP 2015 summit_honey badger_and_panther+_update
OCP 2015 summit_honey badger_and_panther+_updateMike Yan
 

What's hot (20)

FSEC 2014 - I can haz your board with JTAG
FSEC 2014 - I can haz your board with JTAGFSEC 2014 - I can haz your board with JTAG
FSEC 2014 - I can haz your board with JTAG
 
Pesq psytechnics
Pesq psytechnicsPesq psytechnics
Pesq psytechnics
 
W8_2: Inside the UoS Educational Processor
W8_2: Inside the UoS Educational ProcessorW8_2: Inside the UoS Educational Processor
W8_2: Inside the UoS Educational Processor
 
Ak12 upgrade
Ak12 upgradeAk12 upgrade
Ak12 upgrade
 
Acer aspire 4252_4552_4552g_quanta_zqa_rev_1a_sch
Acer aspire 4252_4552_4552g_quanta_zqa_rev_1a_schAcer aspire 4252_4552_4552g_quanta_zqa_rev_1a_sch
Acer aspire 4252_4552_4552g_quanta_zqa_rev_1a_sch
 
Sql2
Sql2Sql2
Sql2
 
[ODI] chapter2 what is "undo record chaining"?
[ODI] chapter2 what is "undo record chaining"?[ODI] chapter2 what is "undo record chaining"?
[ODI] chapter2 what is "undo record chaining"?
 
Raspberry Pi - best friend for all your GPIO needs
Raspberry Pi - best friend for all your GPIO needsRaspberry Pi - best friend for all your GPIO needs
Raspberry Pi - best friend for all your GPIO needs
 
NTM quotaion dell server oct, 2014
NTM quotaion dell server oct, 2014NTM quotaion dell server oct, 2014
NTM quotaion dell server oct, 2014
 
TC74LCX244FW PSpice Model (Free SPICE Model)
TC74LCX244FW PSpice Model (Free SPICE Model)TC74LCX244FW PSpice Model (Free SPICE Model)
TC74LCX244FW PSpice Model (Free SPICE Model)
 
Ks 50-1-ks-52-1-manual-english
Ks 50-1-ks-52-1-manual-englishKs 50-1-ks-52-1-manual-english
Ks 50-1-ks-52-1-manual-english
 
First meet with Android Auto
First meet with Android AutoFirst meet with Android Auto
First meet with Android Auto
 
Unit Testing: Special Cases
Unit Testing: Special CasesUnit Testing: Special Cases
Unit Testing: Special Cases
 
TC74LCX244FT PSpice Model (Free SPICE Model)
TC74LCX244FT PSpice Model (Free SPICE Model)TC74LCX244FT PSpice Model (Free SPICE Model)
TC74LCX244FT PSpice Model (Free SPICE Model)
 
[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...
[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...
[KOR] ODI no.004 analysis of oracle performance degradation caused by ineffic...
 
TC74LCX244F PSpice Model (Free SPICE Model)
TC74LCX244F PSpice Model (Free SPICE Model)TC74LCX244F PSpice Model (Free SPICE Model)
TC74LCX244F PSpice Model (Free SPICE Model)
 
Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz
Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz
Design and build a wireless transceiver using nrf24l01p single chip 2.4g hz
 
Modul dasa rq
Modul dasa rqModul dasa rq
Modul dasa rq
 
OCP 2015 summit_honey badger_and_panther+_update
OCP 2015 summit_honey badger_and_panther+_updateOCP 2015 summit_honey badger_and_panther+_update
OCP 2015 summit_honey badger_and_panther+_update
 
Cha
ChaCha
Cha
 

Viewers also liked

Tools in Action: Transforming everyday objects with the power of deeplearning...
Tools in Action: Transforming everyday objects with the power of deeplearning...Tools in Action: Transforming everyday objects with the power of deeplearning...
Tools in Action: Transforming everyday objects with the power of deeplearning...Dev_Events
 
Being serverless and Swift... Is that allowed?
Being serverless and Swift... Is that allowed? Being serverless and Swift... Is that allowed?
Being serverless and Swift... Is that allowed? Dev_Events
 
Swift on the Server
Swift on the Server Swift on the Server
Swift on the Server Dev_Events
 
Анализа на оддалечена експлоатациjа во Linux кернел
Анализа на оддалечена експлоатациjа во Linux кернелАнализа на оддалечена експлоатациjа во Linux кернел
Анализа на оддалечена експлоатациjа во Linux кернелZero Science Lab
 
Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...
Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...
Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...Kento Aoyama
 
Exascale Computing Project - Driving a HUGE Change in a Changing World
Exascale Computing Project - Driving a HUGE Change in a Changing WorldExascale Computing Project - Driving a HUGE Change in a Changing World
Exascale Computing Project - Driving a HUGE Change in a Changing Worldinside-BigData.com
 
TMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java Programs
TMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java ProgramsTMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java Programs
TMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java ProgramsIosif Itkin
 
Disaster Recovery and Ceph Block Storage: Introducing Multi-Site Mirroring
Disaster Recovery and Ceph Block Storage: Introducing Multi-Site MirroringDisaster Recovery and Ceph Block Storage: Introducing Multi-Site Mirroring
Disaster Recovery and Ceph Block Storage: Introducing Multi-Site MirroringJason Dillaman
 
1. numPYNQ - Project Presentation
1. numPYNQ - Project Presentation1. numPYNQ - Project Presentation
1. numPYNQ - Project PresentationnumPYNQ
 
Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...
Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...
Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...Spark Summit
 
A tour of (advanced) Akka features in 40 minutes
A tour of (advanced) Akka features in 40 minutesA tour of (advanced) Akka features in 40 minutes
A tour of (advanced) Akka features in 40 minutesJohan Janssen
 
Welcome alexa, your personal assistant
Welcome alexa, your personal assistantWelcome alexa, your personal assistant
Welcome alexa, your personal assistantJohan Janssen
 
Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...
Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...
Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...Patrick Chanezon
 
Modularization
ModularizationModularization
Modularizationgusgon
 
Operating Systems: Linux in Detail
Operating Systems: Linux in DetailOperating Systems: Linux in Detail
Operating Systems: Linux in DetailDamian T. Gordon
 

Viewers also liked (20)

Tools in Action: Transforming everyday objects with the power of deeplearning...
Tools in Action: Transforming everyday objects with the power of deeplearning...Tools in Action: Transforming everyday objects with the power of deeplearning...
Tools in Action: Transforming everyday objects with the power of deeplearning...
 
Being serverless and Swift... Is that allowed?
Being serverless and Swift... Is that allowed? Being serverless and Swift... Is that allowed?
Being serverless and Swift... Is that allowed?
 
Swift on the Server
Swift on the Server Swift on the Server
Swift on the Server
 
Анализа на оддалечена експлоатациjа во Linux кернел
Анализа на оддалечена експлоатациjа во Linux кернелАнализа на оддалечена експлоатациjа во Linux кернел
Анализа на оддалечена експлоатациjа во Linux кернел
 
Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...
Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...
Evaluation of Container Virtualized MEGADOCK System in Distributed Computing ...
 
RDMA on ARM
RDMA on ARMRDMA on ARM
RDMA on ARM
 
Linux device drivers
Linux device driversLinux device drivers
Linux device drivers
 
Exascale Computing Project - Driving a HUGE Change in a Changing World
Exascale Computing Project - Driving a HUGE Change in a Changing WorldExascale Computing Project - Driving a HUGE Change in a Changing World
Exascale Computing Project - Driving a HUGE Change in a Changing World
 
Ceph Object Store
Ceph Object StoreCeph Object Store
Ceph Object Store
 
TMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java Programs
TMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java ProgramsTMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java Programs
TMPA-2017: Dl-Check: Dynamic Potential Deadlock Detection Tool for Java Programs
 
Disaster Recovery and Ceph Block Storage: Introducing Multi-Site Mirroring
Disaster Recovery and Ceph Block Storage: Introducing Multi-Site MirroringDisaster Recovery and Ceph Block Storage: Introducing Multi-Site Mirroring
Disaster Recovery and Ceph Block Storage: Introducing Multi-Site Mirroring
 
1. numPYNQ - Project Presentation
1. numPYNQ - Project Presentation1. numPYNQ - Project Presentation
1. numPYNQ - Project Presentation
 
Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...
Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...
Building Real-Time BI Systems with Kafka, Spark, and Kudu: Spark Summit East ...
 
Unit Testing in Kotlin
Unit Testing in KotlinUnit Testing in Kotlin
Unit Testing in Kotlin
 
A tour of (advanced) Akka features in 40 minutes
A tour of (advanced) Akka features in 40 minutesA tour of (advanced) Akka features in 40 minutes
A tour of (advanced) Akka features in 40 minutes
 
Migrating to Java 9 Modules
Migrating to Java 9 ModulesMigrating to Java 9 Modules
Migrating to Java 9 Modules
 
Welcome alexa, your personal assistant
Welcome alexa, your personal assistantWelcome alexa, your personal assistant
Welcome alexa, your personal assistant
 
Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...
Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...
Docker Azure Friday OSS March 2017 - Developing and deploying Java & Linux on...
 
Modularization
ModularizationModularization
Modularization
 
Operating Systems: Linux in Detail
Operating Systems: Linux in DetailOperating Systems: Linux in Detail
Operating Systems: Linux in Detail
 

Similar to Secrets of building a debuggable runtime: Learn how language implementors solve your runtime issues

Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)yang firo
 
Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)yang firo
 
44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick
44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick
44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick44CON
 
The forgotten art of assembly
The forgotten art of assemblyThe forgotten art of assembly
The forgotten art of assemblyMarian Marinov
 
BlueHat v18 || A mitigation for kernel toctou vulnerabilities
BlueHat v18 || A mitigation for kernel toctou vulnerabilitiesBlueHat v18 || A mitigation for kernel toctou vulnerabilities
BlueHat v18 || A mitigation for kernel toctou vulnerabilitiesBlueHat Security Conference
 
Crash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_TizenCrash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_TizenLex Yu
 
Linux Kernel Crashdump
Linux Kernel CrashdumpLinux Kernel Crashdump
Linux Kernel CrashdumpMarian Marinov
 
Introduction to Debuggers
Introduction to DebuggersIntroduction to Debuggers
Introduction to DebuggersSaumil Shah
 
Vectorization on x86: all you need to know
Vectorization on x86: all you need to knowVectorization on x86: all you need to know
Vectorization on x86: all you need to knowRoberto Agostino Vitillo
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기Ji Hun Kim
 
HKG18-TR14 - Postmortem Debugging with Coresight
HKG18-TR14 - Postmortem Debugging with CoresightHKG18-TR14 - Postmortem Debugging with Coresight
HKG18-TR14 - Postmortem Debugging with CoresightLinaro
 
NetApp ontap simulator
NetApp ontap simulatorNetApp ontap simulator
NetApp ontap simulatorAshwin Pawar
 
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...Positive Hack Days
 
2020-ntn-vsphere_performance_principles_bondzio.pdf
2020-ntn-vsphere_performance_principles_bondzio.pdf2020-ntn-vsphere_performance_principles_bondzio.pdf
2020-ntn-vsphere_performance_principles_bondzio.pdfPhmNgcTr3
 
Embedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingEmbedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingAnne Nicolas
 
Finding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated DisassemblyFinding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated DisassemblyPriyanka Aash
 
OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...
OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...
OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...Chanwoo Choi
 
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docxmetadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docxARIV4
 

Similar to Secrets of building a debuggable runtime: Learn how language implementors solve your runtime issues (20)

Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)
 
Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)
 
44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick
44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick
44CON 2014 - Stupid PCIe Tricks, Joe Fitzpatrick
 
The forgotten art of assembly
The forgotten art of assemblyThe forgotten art of assembly
The forgotten art of assembly
 
BlueHat v18 || A mitigation for kernel toctou vulnerabilities
BlueHat v18 || A mitigation for kernel toctou vulnerabilitiesBlueHat v18 || A mitigation for kernel toctou vulnerabilities
BlueHat v18 || A mitigation for kernel toctou vulnerabilities
 
Crash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_TizenCrash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_Tizen
 
Linux Kernel Crashdump
Linux Kernel CrashdumpLinux Kernel Crashdump
Linux Kernel Crashdump
 
Introduction to Debuggers
Introduction to DebuggersIntroduction to Debuggers
Introduction to Debuggers
 
Debugging 2013- Jesper Brouer
Debugging 2013- Jesper BrouerDebugging 2013- Jesper Brouer
Debugging 2013- Jesper Brouer
 
Vectorization on x86: all you need to know
Vectorization on x86: all you need to knowVectorization on x86: all you need to know
Vectorization on x86: all you need to know
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
HKG18-TR14 - Postmortem Debugging with Coresight
HKG18-TR14 - Postmortem Debugging with CoresightHKG18-TR14 - Postmortem Debugging with Coresight
HKG18-TR14 - Postmortem Debugging with Coresight
 
Pclr syllabus 1 month
Pclr syllabus  1 monthPclr syllabus  1 month
Pclr syllabus 1 month
 
NetApp ontap simulator
NetApp ontap simulatorNetApp ontap simulator
NetApp ontap simulator
 
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
The System of Automatic Searching for Vulnerabilities or how to use Taint Ana...
 
2020-ntn-vsphere_performance_principles_bondzio.pdf
2020-ntn-vsphere_performance_principles_bondzio.pdf2020-ntn-vsphere_performance_principles_bondzio.pdf
2020-ntn-vsphere_performance_principles_bondzio.pdf
 
Embedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingEmbedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debugging
 
Finding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated DisassemblyFinding Xori: Malware Analysis Triage with Automated Disassembly
Finding Xori: Malware Analysis Triage with Automated Disassembly
 
OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...
OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...
OpenIot & ELC Europe 2016 Berlin - How to develop the ARM 64bit board, Samsun...
 
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docxmetadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
 

More from Dev_Events

Eclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimesEclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimesDev_Events
 
Eclipse MicroProfile: Accelerating the adoption of Java Microservices
Eclipse MicroProfile: Accelerating the adoption of Java MicroservicesEclipse MicroProfile: Accelerating the adoption of Java Microservices
Eclipse MicroProfile: Accelerating the adoption of Java MicroservicesDev_Events
 
From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...
From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...
From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...Dev_Events
 
Blockchain Hyperledger Lab
Blockchain Hyperledger LabBlockchain Hyperledger Lab
Blockchain Hyperledger LabDev_Events
 
Introduction to Blockchain and Hyperledger
Introduction to Blockchain and HyperledgerIntroduction to Blockchain and Hyperledger
Introduction to Blockchain and HyperledgerDev_Events
 
Using GPUs to Achieve Massive Parallelism in Java 8
Using GPUs to Achieve Massive Parallelism in Java 8Using GPUs to Achieve Massive Parallelism in Java 8
Using GPUs to Achieve Massive Parallelism in Java 8Dev_Events
 
Lean and Easy IoT Applications with OSGi and Eclipse Concierge
Lean and Easy IoT Applications with OSGi and Eclipse ConciergeLean and Easy IoT Applications with OSGi and Eclipse Concierge
Lean and Easy IoT Applications with OSGi and Eclipse ConciergeDev_Events
 
Eclipse JDT Embraces Java 9 – An Insider’s View
Eclipse JDT Embraces Java 9 – An Insider’s ViewEclipse JDT Embraces Java 9 – An Insider’s View
Eclipse JDT Embraces Java 9 – An Insider’s ViewDev_Events
 
Node.js – ask us anything!
Node.js – ask us anything! Node.js – ask us anything!
Node.js – ask us anything! Dev_Events
 
Microservices without Servers
Microservices without ServersMicroservices without Servers
Microservices without ServersDev_Events
 
The App Evolution
The App EvolutionThe App Evolution
The App EvolutionDev_Events
 
Building Next Generation Applications and Microservices
Building Next Generation Applications and Microservices Building Next Generation Applications and Microservices
Building Next Generation Applications and Microservices Dev_Events
 
Create and Manage APIs with API Connect, Swagger and Bluemix
Create and Manage APIs with API Connect, Swagger and BluemixCreate and Manage APIs with API Connect, Swagger and Bluemix
Create and Manage APIs with API Connect, Swagger and BluemixDev_Events
 
OpenWhisk - Serverless Architecture
OpenWhisk - Serverless Architecture OpenWhisk - Serverless Architecture
OpenWhisk - Serverless Architecture Dev_Events
 
Add Custom Model and ORM to Node.js
Add Custom Model and ORM to Node.jsAdd Custom Model and ORM to Node.js
Add Custom Model and ORM to Node.jsDev_Events
 
Adding User Management to Node.js
Adding User Management to Node.jsAdding User Management to Node.js
Adding User Management to Node.jsDev_Events
 
Creating Sentiment Line Chart with Watson
Creating Sentiment Line Chart with Watson Creating Sentiment Line Chart with Watson
Creating Sentiment Line Chart with Watson Dev_Events
 
Containers Lab
Containers Lab Containers Lab
Containers Lab Dev_Events
 
OpenWhisk Lab
OpenWhisk Lab OpenWhisk Lab
OpenWhisk Lab Dev_Events
 
The App Evolution
The App Evolution The App Evolution
The App Evolution Dev_Events
 

More from Dev_Events (20)

Eclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimesEclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimes
 
Eclipse MicroProfile: Accelerating the adoption of Java Microservices
Eclipse MicroProfile: Accelerating the adoption of Java MicroservicesEclipse MicroProfile: Accelerating the adoption of Java Microservices
Eclipse MicroProfile: Accelerating the adoption of Java Microservices
 
From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...
From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...
From Science Fiction to Science Fact: How AI Will Change Our Approach to Buil...
 
Blockchain Hyperledger Lab
Blockchain Hyperledger LabBlockchain Hyperledger Lab
Blockchain Hyperledger Lab
 
Introduction to Blockchain and Hyperledger
Introduction to Blockchain and HyperledgerIntroduction to Blockchain and Hyperledger
Introduction to Blockchain and Hyperledger
 
Using GPUs to Achieve Massive Parallelism in Java 8
Using GPUs to Achieve Massive Parallelism in Java 8Using GPUs to Achieve Massive Parallelism in Java 8
Using GPUs to Achieve Massive Parallelism in Java 8
 
Lean and Easy IoT Applications with OSGi and Eclipse Concierge
Lean and Easy IoT Applications with OSGi and Eclipse ConciergeLean and Easy IoT Applications with OSGi and Eclipse Concierge
Lean and Easy IoT Applications with OSGi and Eclipse Concierge
 
Eclipse JDT Embraces Java 9 – An Insider’s View
Eclipse JDT Embraces Java 9 – An Insider’s ViewEclipse JDT Embraces Java 9 – An Insider’s View
Eclipse JDT Embraces Java 9 – An Insider’s View
 
Node.js – ask us anything!
Node.js – ask us anything! Node.js – ask us anything!
Node.js – ask us anything!
 
Microservices without Servers
Microservices without ServersMicroservices without Servers
Microservices without Servers
 
The App Evolution
The App EvolutionThe App Evolution
The App Evolution
 
Building Next Generation Applications and Microservices
Building Next Generation Applications and Microservices Building Next Generation Applications and Microservices
Building Next Generation Applications and Microservices
 
Create and Manage APIs with API Connect, Swagger and Bluemix
Create and Manage APIs with API Connect, Swagger and BluemixCreate and Manage APIs with API Connect, Swagger and Bluemix
Create and Manage APIs with API Connect, Swagger and Bluemix
 
OpenWhisk - Serverless Architecture
OpenWhisk - Serverless Architecture OpenWhisk - Serverless Architecture
OpenWhisk - Serverless Architecture
 
Add Custom Model and ORM to Node.js
Add Custom Model and ORM to Node.jsAdd Custom Model and ORM to Node.js
Add Custom Model and ORM to Node.js
 
Adding User Management to Node.js
Adding User Management to Node.jsAdding User Management to Node.js
Adding User Management to Node.js
 
Creating Sentiment Line Chart with Watson
Creating Sentiment Line Chart with Watson Creating Sentiment Line Chart with Watson
Creating Sentiment Line Chart with Watson
 
Containers Lab
Containers Lab Containers Lab
Containers Lab
 
OpenWhisk Lab
OpenWhisk Lab OpenWhisk Lab
OpenWhisk Lab
 
The App Evolution
The App Evolution The App Evolution
The App Evolution
 

Recently uploaded

Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 

Recently uploaded (20)

Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 

Secrets of building a debuggable runtime: Learn how language implementors solve your runtime issues

  • 1. J9, OMR and beyond Serviceable Runtimes
  • 2. • Bjørn Vårdal • IBM Runtimes Developer • J9 JVM • @bvaardal • MethodHandles • Lambdas • VarHandles • Project Valhalla Bjørn Vårdal IBM Runtime Technologies 2 Introduction
  • 3. Bjørn Vårdal IBM Runtime Technologies 3 Most die young_______runtimes unless you service them.
  • 4. The information contained in this presentation is provided for informational purposes only. Whilst efforts were made to verify the completeness and accuracy of the information contained in this presentation, it is provided “as is”, without warranty of any kind, express or implied. All performance data included in this presentation have been gathered in a controlled environment. Your own test results may vary based on hardware, software or infrastructure differences. All data included in this presentation are meant to be used only as a guide. In addition, the information contained in this presentation is based on IBM’s current product plans and strategy, which are subject to change by IBM, without notice. IBM and its affiliated companies shall not be responsible for any damages arising out of the use of, or otherwise related to, this presentation or any other documentation. Nothing contained in this presentation is intended to, or shall have the effect of: - creating any warrant or representation from IBM, its affiliated companies or its or their suppliers and/or licensors Bjørn Vårdal IBM Runtime Technologies 4 Disclaimer
  • 5. • Advanced core dump analysis for J9 • Used by the J9 service team • Used by J9 developers • Front-end: DDR Interactive Bjørn Vårdal IBM Runtime Technologies 5 Direct Dump Reader
  • 6. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345 Bjørn Vårdal IBM Runtime Technologies 6 DDR Interactive Ships with J9
  • 7. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345 Bjørn Vårdal IBM Runtime Technologies 7 DDR Interactive
  • 8. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345 *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > Bjørn Vårdal IBM Runtime Technologies 8 DDR Interactive
  • 9. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345 *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > Bjørn Vårdal IBM Runtime Technologies 9 DDR Interactive
  • 10. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345 *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > !j9help Bjørn Vårdal IBM Runtime Technologies 10 DDR Interactive
  • 11. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.12345 *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > !j9help threads Lists VM threads stack Walks the Java stack for <thread> stackslots Walks the Java stack (including objects) for <thread> . . . classforname Find the class corresponding to name (with wildcards) dumpromclass Dump the specified J9ROMClass. Wild cards are allowed in class name. findpattern Search memory for a specific pattern whatis Determine the type of structure at a given address Bjørn Vårdal IBM Runtime Technologies 11 DDR - !j9help
  • 12. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > !threads Bjørn Vårdal IBM Runtime Technologies 12 DDR - !threads
  • 13. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > !threads !stack 0x0228d70 !j9vmthread 0x0228d70 !j9thread 0x07f274807d70 tid 0x4b (75) // (main) !stack 0x02294f0 !j9vmthread 0x02294f0 !j9thread 0x7f27480b0bf8 tid 0x4e (78) // (JIT Compilation Thread-1) !stack 0x022af20 !j9vmthread 0x022af20 !j9thread 0x7f27480bfcb0 tid 0x55 (85) // (JIT-SamplerThread) !stack 0x022b2e0 !j9vmthread 0x022b2e0 !j9thread 0x7f27480c0228 tid 0x56 (86) // (IProfiler) !stack 0x0238620 !j9vmthread 0x0238620 !j9thread 0x7f2748238170 tid 0x57 (87) // (Common-Cleaner) !stack 0x023f480 !j9vmthread 0x023f480 !j9thread 0x7f27482386e8 tid 0x58 (88) // (Signal Dispatcher) !stack 0x023f840 !j9vmthread 0x023f840 !j9thread 0x7f27483d01f8 tid 0x5a (90) // (Concurrent Mark Helper) !stack 0x0023fc0 !j9vmthread 0x0023fc0 !j9thread 0x7f27483d0c90 tid 0x5b (91) // (GC Slave) !stack 0x0002420 !j9vmthread 0x0002420 !j9thread 0x007f26e084d0 tid 0x5f (95) // (Attach API wait loop) !stack 0x0240730 !j9vmthread 0x0240730 !j9thread 0x7f27483d2218 tid 0x60 (96) // (Finalizer thread) > Bjørn Vårdal IBM Runtime Technologies 13 DDR - !threads
  • 14. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > !threads !stack 0x0228d70 !j9vmthread 0x0228d70 !j9thread 0x07f274807d70 tid 0x4b (75) // (main) !stack 0x02294f0 !j9vmthread 0x02294f0 !j9thread 0x7f27480b0bf8 tid 0x4e (78) // (JIT Compilation Thread-1) !stack 0x022af20 !j9vmthread 0x022af20 !j9thread 0x7f27480bfcb0 tid 0x55 (85) // (JIT-SamplerThread) !stack 0x022b2e0 !j9vmthread 0x022b2e0 !j9thread 0x7f27480c0228 tid 0x56 (86) // (IProfiler) !stack 0x0238620 !j9vmthread 0x0238620 !j9thread 0x7f2748238170 tid 0x57 (87) // (Common-Cleaner) !stack 0x023f480 !j9vmthread 0x023f480 !j9thread 0x7f27482386e8 tid 0x58 (88) // (Signal Dispatcher) !stack 0x023f840 !j9vmthread 0x023f840 !j9thread 0x7f27483d01f8 tid 0x5a (90) // (Concurrent Mark Helper) !stack 0x0023fc0 !j9vmthread 0x0023fc0 !j9thread 0x7f27483d0c90 tid 0x5b (91) // (GC Slave) !stack 0x0002420 !j9vmthread 0x0002420 !j9thread 0x007f26e084d0 tid 0x5f (95) // (Attach API wait loop) !stack 0x0240730 !j9vmthread 0x0240730 !j9thread 0x7f27483d2218 tid 0x60 (96) // (Finalizer thread) > Bjørn Vårdal IBM Runtime Technologies 14 DDR - !threads
  • 15. $ java -cp j9ddr.jar com.ibm.j9ddr.tools.ddrinteractive.DDRInteractive core.20170315.010552.2824.01.dmp *0 : PID: 2824; !j9javavm 0x7f27480eef0 Run !j9help to see a list of commands > !threads !stack 0x0228d70 !j9vmthread 0x0228d70 !j9thread 0x07f274807d70 tid 0x4b (75) // (main) !stack 0x02294f0 !j9vmthread 0x02294f0 !j9thread 0x7f27480b0bf8 tid 0x4e (78) // (JIT Compilation Thread-1) !stack 0x022af20 !j9vmthread 0x022af20 !j9thread 0x7f27480bfcb0 tid 0x55 (85) // (JIT-SamplerThread) !stack 0x022b2e0 !j9vmthread 0x022b2e0 !j9thread 0x7f27480c0228 tid 0x56 (86) // (IProfiler) !stack 0x0238620 !j9vmthread 0x0238620 !j9thread 0x7f2748238170 tid 0x57 (87) // (Common-Cleaner) !stack 0x023f480 !j9vmthread 0x023f480 !j9thread 0x7f27482386e8 tid 0x58 (88) // (Signal Dispatcher) !stack 0x023f840 !j9vmthread 0x023f840 !j9thread 0x7f27483d01f8 tid 0x5a (90) // (Concurrent Mark Helper) !stack 0x0023fc0 !j9vmthread 0x0023fc0 !j9thread 0x7f27483d0c90 tid 0x5b (91) // (GC Slave) !stack 0x0002420 !j9vmthread 0x0002420 !j9thread 0x007f26e084d0 tid 0x5f (95) // (Attach API wait loop) !stack 0x0240730 !j9vmthread 0x0240730 !j9thread 0x7f27483d2218 tid 0x60 (96) // (Finalizer thread) > Bjørn Vårdal IBM Runtime Technologies 15 DDR - !threads
  • 16. > !stack 0x0228d70 <1a2970> Generic special frame <1a2970> !j9method 0x01B9A718 X.print(Ljava/lang/String;)V <1a2970> !j9method 0x01B9A6F8 X.m(I)V <1a2970> !j9method 0x01B9A6D8 X.main([Ljava/lang/String;)V <1a2970> JNI call-in frame <1a2970> Native method frame > Bjørn Vårdal IBM Runtime Technologies 16 DDR - !stack
  • 17. > !stack 0x0228d70 <1a2970> Generic special frame <1a2970> !j9method 0x01B9A718 X.print(Ljava/lang/String;)V <1a2970> !j9method 0x01B9A6F8 X.m(I)V <1a2970> !j9method 0x01B9A6D8 X.main([Ljava/lang/String;)V <1a2970> JNI call-in frame <1a2970> Native method frame > Bjørn Vårdal IBM Runtime Technologies 17 DDR - !stack
  • 18. > !stackslots 0x0228d70 <1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 *** <1a2970> ITERATE_O_SLOTS <1a2970> RECORD_BYTECODE_PC_OFFSET <1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ... <1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ... <1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ... <1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718 <1a2970> Bytecode index = 16 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6D98 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0 <1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ... <1a2970> Method: X.m(I)V !j9method 0x01B9A6F8 <1a2970> Bytecode index = 6 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234 <1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ... <1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8 <1a2970> Bytecode index = 3 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668 <1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ... <1a2970> New ELS = 0x0 <1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ... <1a2970> Object pushes starting at 0x01AE6E08 for 12 slots Bjørn Vårdal IBM Runtime Technologies 18 DDR - !stackslots
  • 19. > !stackslots 0x0228d70 <1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 *** <1a2970> ITERATE_O_SLOTS <1a2970> RECORD_BYTECODE_PC_OFFSET <1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ... <1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ... <1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ... <1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718 <1a2970> Bytecode index = 16 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6D98 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0 <1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ... <1a2970> Method: X.m(I)V !j9method 0x01B9A6F8 <1a2970> Bytecode index = 6 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234 <1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ... <1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8 <1a2970> Bytecode index = 3 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668 <1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ... <1a2970> New ELS = 0x0 <1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ... <1a2970> Object pushes starting at 0x01AE6E08 for 12 slots Bjørn Vårdal IBM Runtime Technologies 19 DDR - !stackslots
  • 20. > !stackslots 0x0228d70 <1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 *** <1a2970> ITERATE_O_SLOTS <1a2970> RECORD_BYTECODE_PC_OFFSET <1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ... <1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ... <1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ... <1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718 <1a2970> Bytecode index = 16 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6D98 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0 <1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ... <1a2970> Method: X.m(I)V !j9method 0x01B9A6F8 <1a2970> Bytecode index = 6 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234 <1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ... <1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8 <1a2970> Bytecode index = 3 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668 <1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ... <1a2970> New ELS = 0x0 <1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ... <1a2970> Object pushes starting at 0x01AE6E08 for 12 slots Bjørn Vårdal IBM Runtime Technologies 20 DDR - !stackslots
  • 21. > !stackslots 0x0228d70 <1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 *** <1a2970> ITERATE_O_SLOTS <1a2970> RECORD_BYTECODE_PC_OFFSET <1a2970> Initial values: walkSP = 0x01AE6D60, PC = 0x01, literals = 0x0, A0 = 0x01AE6D78, j2iFrame = 0x0, ... <1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, pc = 0x01, cp = 0x0, arg0EA = 0x01AE ... <1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, pc = 0x07FDCB43A6344, cp = 0x01B9A580, arg0EA = 0x01AE6D98, ... <1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718 <1a2970> Bytecode index = 16 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6D98 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0 <1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = 0x07FDCB43A630A, cp = 0x01B9A580, arg0EA = 0x01AE6DB8, ... <1a2970> Method: X.m(I)V !j9method 0x01B9A6F8 <1a2970> Bytecode index = 6 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234 <1a2970> Bytecode frame: bp = 0x01AE6DD0, sp = 0x01AE6DC0, pc = 0x07FDCB43A62DB, cp = 0x1B9A580, arg0EA = 0x1AE6DD8, ... <1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8 <1a2970> Bytecode index = 3 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668 <1a2970> JNI call-in frame: bp = 0x01AE6E0, sp = 0x01AE6DE0, pc = 0x07FDCB96DE314, cp = 0x0, arg0EA = 0x01AE6E0, ... <1a2970> New ELS = 0x0 <1a2970> JNI native method frame: bp = 0x01AE6E88, sp = 0x01AE6E08, pc = 0x07, cp = 0x0, arg0EA = 0x01AE6E88, ... <1a2970> Object pushes starting at 0x01AE6E08 for 12 slots Bjørn Vårdal IBM Runtime Technologies 21 DDR - !stackslots
  • 22. > !j9object 0x0FFEF46D0 J9VMJavaLangString at 0x00000000FFEF46D0 { struct J9Class* clazz = !j9class 0x1A5B500 // java/lang/String Object flags = 0x00000000; [B value = !fj9object 0x86f36828 (offset=0) (java/lang/String) I count = 0x00000007 (offset=4) (java/lang/String) I hashCode = 0x00000000 (offset=8) (java/lang/String) "foo4660" } Bjørn Vårdal IBM Runtime Technologies 22 DDR - !j9object
  • 23. > !j9object 0x0FFEF46D0 J9VMJavaLangString at 0x00000000FFEF46D0 { struct J9Class* clazz = !j9class 0x1A5B500 // java/lang/String Object flags = 0x00000000; [B value = !fj9object 0x86f36828 (offset=0) (java/lang/String) I count = 0x00000007 (offset=4) (java/lang/String) I hashCode = 0x00000000 (offset=8) (java/lang/String) "foo4660" } Bjørn Vårdal IBM Runtime Technologies 23 DDR - !j9object
  • 24. GDB • Requires intimate knowledge about the JVM internal structures • Requires debug symbols • Source must match • Platform specific DDR • Has intimate knowledge about the JVM internal structures • Doesn’t require debug symbols • Cross JVM version • Cross platform Bjørn Vårdal IBM Runtime Technologies 24 GDB vs DDR
  • 25. > !stackslots 0x0228d70 <1a2970> *** BEGIN STACK WALK, flags = 0401 walkThread = 0x01A2970 *** <1a2970> ITERATE_O_SLOTS <1a2970> RECORD_BYTECODE_PC_OFFSET <1a2970> Initial values: walkSP = 0x01AE6D60, A0 = 0x01AE6D78, <1a2970> Generic special frame: bp = 0x01AE6D78, sp = 0x01AE6D60, <1a2970> Bytecode frame: bp = 0x01AE6D90, sp = 0x01AE6D80, arg0EA = <1a2970> Method: X.print(Ljava/lang/String;)V !j9method 0x01B9A718 <1a2970> Bytecode index = 16 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6D98 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6D98] = 0x0FFEF46D0 <1a2970> Bytecode frame: bp = 0x01AE6DB0, sp = 0x01AE6DA0, pc = <1a2970> Method: X.m(I)V !j9method 0x01B9A6F8 <1a2970> Bytecode index = 6 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DB8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DB8] = 0x01234 <1a2970> Bytecode frame: bp = 0x01AE6DD0, arg0EA = 0x1AE6DD8 <1a2970> Method: X.main([Ljava/lang/String;)V !j9method 0x01B9A6D8 <1a2970> Bytecode index = 3 <1a2970> Using local mapper <1a2970> Locals starting at 0x01AE6DD8 for 0x01 slots <1a2970> I-Slot: a0[0x01AE6DD8] = 0x0FFEE5668 <1a2970> JNI call-in frame: sp = 0x01AE6DE0, pc = 0x07FDCB96DE314 <1a2970> JNI native method frame: cp = 0x0, arg0EA = 0x01AE6E88, ... <1a2970> Object pushes starting at 0x01AE6E08 for 12 slots (gdb) x/200 0x0000000001AE6D60 0x1ae6d60: 0x00000000 0x00000000 0x01b9a718 0x00000000 0x1ae6d70: 0xb43a6344 0x00007fdc 0x01ae6d9a 0x00000000 0x1ae6d80: 0x01b9a6f8 0x00000000 0xb43a630a 0x00007fdc 0x1ae6d90: 0x01ae6db8 0x00000000 0xffef46d0 0x00000000 0x1ae6da0: 0x01b9a6d8 0x00000000 0xb43a62db 0x00007fdc 0x1ae6db0: 0x01ae6dd8 0x00000000 0x00001234 0x00000000 0x1ae6dc0: 0x00000000 0x00000000 0xb96de314 0x00007fdc 0x1ae6dd0: 0x01ae6e00 0x00000000 0xffee5668 0x00000000 0x1ae6de0: 0x00000000 0x00000000 0x00020000 0x00000000 0x1ae6df0: 0x00000060 0x00000000 0x00000007 0x00000000 0x1ae6e00: 0x01ae6e8a 0x00000000 0xffee5668 0x00000000 0x1ae6e10: 0x86ef0828 0x00000000 0x86f317d0 0x00000000 0x1ae6e20: 0x86f317d0 0x00000000 0x00000000 0x00000000 0x1ae6e30: 0x00000000 0x00000000 0x86f2ed50 0x00000000 0x1ae6e40: 0x86ef3548 0x00000000 0x86ef34b8 0x00000000 0x1ae6e50: 0x86ef0240 0x00000000 0x86ef0fb0 0x00000000 DDR Bjørn Vårdal IBM Runtime Technologies 25 GDB vs DDR GDB
  • 26. Bjørn Vårdal IBM Runtime Technologies 26 DDR Interactive ”The tool that I use the most and that saves me the most time.” J9 Service Team Lead “We can implement commands to look for known symptoms, which drastically reduces our triage work.” J9 Service Team Member
  • 27. • We are open-sourcing the J9 JVM • DDR coming along for the ride  • http://openj9.org Bjørn Vårdal IBM Runtime Technologies 27 OpenJ9
  • 28. Reliable Shared Components for High Performance Language Runtimes http://www.eclipse.org/omr https://github.com/eclipse/omr https://developer.ibm.com/open/omr Bjørn Vårdal IBM Runtime Technologies 28 Eclipse OMR
  • 29. Bjørn Vårdal IBM Runtime Technologies 29 Agenda • DDR in J9 • Capabilities • How DDR is implemented • OMR ddrgen • Generating the DDR resources • DDR in a new runtime • Adding DDR capabilities to Base9 • Loading a Base9 core into DDR Interactive
  • 30. • Print structure at address !j9object 0x12345678 !j9method 0xABCDEF00 • Other printing commands !stackslots 0xABCDEF0 • Utility functions !classforname !findpattern !whatis • Data analysis gccheck deadlock Bjørn Vårdal IBM Runtime Technologies 30 What can DDR do? >
  • 31. • Print structure at address !j9object 0x12345678 !j9method 0xABCDEF00 • Other printing commands !stackslots 0xABCDEF0 • Utility functions !classforname !findpattern !whatis • Data analysis gccheck deadlock Bjørn Vårdal IBM Runtime Technologies 31 What can DDR do? > gccheck Starting GC Check Checking HEAP...done (919 ms). Checking CLASS HEAP...done (296 ms). Checking REMEMBERED SET...done (54 ms). Checking UNFINALIZED...done (3 ms). Checking FINALIZABLE...done (3 ms). Checking OWNABLE_SYNCHRONIZER...done (1 ms). Checking STRING TABLE...done (516 ms). Checking CLASS LOADERS...done (4 ms). Checking JNI GLOBAL REFS...done (1 ms). Checking JNI WEAK GLOBAL REFS...done (1 ms). Checking JVMTI OBJECT TAG TABLES...done (3 ms). Checking VM CLASS SLOTS...done (1 ms). Checking MONITOR TABLE...done (7 ms). Checking VM THREAD SLOTS...done (208 ms). Checking THREAD STACKS...done (25 ms). Done (2058ms)
  • 32. • Structure layout information in the process memory • DDR data generator generates blob and code • Detectable RAS structure in memory at runtime Bjørn Vårdal IBM Runtime Technologies 32 How does DDR work? Runtime DDR InteractiveDDR data generator DDR blob Core dump DDR blob Generated code RAS RAS
  • 33. Bjørn Vårdal IBM Runtime Technologies 33 DDR Components OpenJ9Eclipse OMR J9 JVM DDR data generator DDR Interactive RAS
  • 34. Bjørn Vårdal IBM Runtime Technologies 34 RAS Structure Runtime memory VM structure Threads Port library etc.
  • 35. Bjørn Vårdal IBM Runtime Technologies 35 RAS Structure Runtime memory RAS Structure Eye catcher: “J9VMRAS” Bit pattern: 0xAA55AA55 ... DDR Structure blob … VM … VM structure Threads Port library etc.
  • 36. Bjørn Vårdal IBM Runtime Technologies 36 RAS Structure Runtime memory DDR blob Structure layouts Field offsets Build flags RAS Structure Eye catcher: “J9VMRAS” Bit pattern: 0xAA55AA55 ... DDR Structure blob … VM … VM structure Threads Port library etc.
  • 37. Bjørn Vårdal IBM Runtime Technologies 37 DDR Structure Blob Runtime memory DDR blob Structure layouts Field offsets Build flags RAS Structure Eye catcher: “J9VMRAS” Bit pattern: 0xAA55AA55 ... DDR Structure blob … VM … VM structure Threads Port library etc.
  • 38. Bjørn Vårdal IBM Runtime Technologies 38 OMR ddrgen Compile with debug symbols ddrgen blob.dat Load into memory at runtime Scan source files for build flags ./getMacros.sh . libdwarf
  • 39. Bjørn Vårdal IBM Runtime Technologies 39 DDR Class Generation superset.out DDR Interactive (j9ddr.jar) Generate Java structure classes superset.out Generate Java pointer classes
  • 40. Bjørn Vårdal IBM Runtime Technologies 40 DDR Interactive startup Generated Java classes DDR Interactive DDR blob from core file DDR ClassLoader Template Field offsets Load structure classes
  • 41. • DDR capabilities – Analyzing the JVM in a core file • RAS structure – A detectable starting point • OMR ddrgen – Creating the DDR blob and superset • DDR Interactive – Using the blob and superset Bjørn Vårdal IBM Runtime Technologies 41 Summary
  • 42. Bjørn Vårdal IBM Runtime Technologies 42 DDR in a new Runtime
  • 43. • Small tutorial runtime with ~10 opcodes • For illustrating basic OMR JITBuilder functionality • For demonstrating basic DDR functionality? • My fork: https://github.com/bjornvar/Base9/tree/ddr Bjørn Vårdal IBM Runtime Technologies 43 Base9
  • 44. • Quick prototype • ~1 hour of hacking • Mostly copied from J9 JVM Bjørn Vårdal IBM Runtime Technologies 44 DDR in Base9
  • 45. Bjørn Vårdal IBM Runtime Technologies 45 RAS Structure in J9 JVM runtime memory DDR blob Structure layouts Build flags RAS Structure Eye catcher: “J9VMRAS” Bit pattern: 0xAA55AA55 ... DDR Structure blob … JavaVM … JavaVM structure Threads Port library etc.
  • 46. Bjørn Vårdal IBM Runtime Technologies 46 RAS Structure in Base9 Base9 runtime memory DDR blob Structure layouts Build flags Generated by running ddrgen on Base9 RAS Structure Eye catcher: “J9VMRAS” Bit pattern: 0xAA55AA55 ... DDR Structure blob … ExecutionContext Copied the structure from the J9 source ExecutionContext Stack String table etc.
  • 47. Bjørn Vårdal IBM Runtime Technologies 47 Base9 Code Changes
  • 48. Bjørn Vårdal IBM Runtime Technologies 48 Base9 Code Changes
  • 49. Bjørn Vårdal IBM Runtime Technologies 49 Base9 Code Changes
  • 50. Bjørn Vårdal IBM Runtime Technologies 50 RAS Structure in Base9 Base9 runtime memory DDR blob Structure layouts Build flags RAS Structure Eye catcher: “J9VMRAS” Bit pattern: 0xAA55AA55 ... DDR Structure blob … ExecutionContext ExecutionContext Stack String table etc.
  • 51. Bjørn Vårdal IBM Runtime Technologies 51 DDR Interactive Some changes were required: • Disabled all J9 specific functionality (!stackslots, etc.) • Told it to look for B9RAS instead of J9RAS • Added build flags constants
  • 52. $ Bjørn Vårdal IBM Runtimes 52 DDR Interactive
  • 53. Bjørn Vårdal IBM Runtime Technologies 53 What’s next? • Make DDR Interactive plug-and-play • Always support structure commands on DDR enabled core files • Easy DDR generation process • Release DDR Interactive and DDR generators • OMR • OpenJ9
  • 54. Bjørn Vårdal IBM Runtime Technologies 54 Conclusion • DDR in J9 • Capabilities • How DDR is implemented • OMR ddrgen • Turning debug symbols into blob and superset • DDR in Base9 • Adding DDR capabilities to a new runtime • Loading a Base9 core into DDR Interactive
  • 55. Bjørn Vårdal IBM Runtime Technologies 55 Q & A