Как использовать GDB для отслеживания скомпилированной горячей точки JDK9?

Некоторые люди используют NetBeans для отслеживания и отладки JDK9. Тем не менее, я должен использовать GDB для отслеживания исходного кода и просмотра потока управления кода JDK / Hotspot, так как я использую ssh для доступа к исходному коду на сервере, и я не могу использовать GUI / IDE.

Я следую Buildme.md из официального документа JDK, чтобы настроить JDK9,

bash ./configure --with-debug-level=slowdebug --with-target-bits=64 --disable-warnings-as-errors

Затем,

make all

Я получаю свой заказ debug версия:

/images/jdk/bin/java -version
openjdk version "9-internal"OpenJDK Runtime Environment (build 9-internal+0-adhoc.xfwu.9dev)
OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.xfwu.9dev, mixed mode)

В каталоге: 9jdk/hotspot:

.
├── make
│   ├── copy
│   ├── gensrc
│   ├── ide
│   ├── lib
│   ├── mapfiles
│   │   ├── libjsig
│   │   ├── libjvm_db
│   │   ├── libjvm_dtrace
│   │   └── libsaproc
│   ├── src
│   │   └── classes
│   ├── symbols
│   └── test
├── src
│   ├── cpu
│   │   ├── aarch64
│   │   ├── arm
│   │   ├── ppc
│   │   ├── s390
│   │   ├── sparc
│   │   ├── x86
│   │   └── zero
│   ├── jdk.aot
│   │   ├── share
│   │   └── unix
│   ├── jdk.hotspot.agent
│   │   ├── doc
│   │   ├── linux
│   │   ├── macosx
│   │   ├── scripts
│   │   ├── share
│   │   ├── solaris
│   │   ├── test
│   │   └── windows
│   ├── jdk.internal.vm.ci
│   │   └── share
│   ├── jdk.internal.vm.compiler
│   │   └── share
│   ├── os
│   │   ├── aix
│   │   ├── bsd
│   │   ├── linux
│   │   ├── posix
│   │   ├── solaris
│   │   └── windows
│   ├── os_cpu
│   │   ├── aix_ppc
│   │   ├── bsd_x86
│   │   ├── bsd_zero
│   │   ├── linux_aarch64
│   │   ├── linux_arm
│   │   ├── linux_ppc
│   │   ├── linux_s390
│   │   ├── linux_sparc
│   │   ├── linux_x86
│   │   ├── linux_zero
│   │   ├── solaris_sparc
│   │   ├── solaris_x86
│   │   └── windows_x86
│   └── share
│       ├── tools
│       └── vm
└── test
├── compiler
│   ├── aot
│   ├── arguments
│   ├── arraycopy
│   ├── c1
│   ├── c2
│   ├── calls
│   ├── ciReplay
│   ├── classUnloading
│   ├── codecache
│   ├── codegen
│   ├── compilercontrol
│   ├── controldependency
│   ├── cpuflags
│   ├── debug
│   ├── dependencies
│   ├── eliminateAutobox
│   ├── escapeAnalysis
│   ├── exceptions
│   ├── floatingpoint
│   ├── gcbarriers
│   ├── inlining
│   ├── integerArithmetic
│   ├── interpreter
│   ├── intrinsics
│   ├── jsr292
│   ├── jvmci
│   ├── linkage
│   ├── loopopts
│   ├── macronodes
│   ├── membars
│   ├── memoryinitialization
│   ├── onSpinWait
│   ├── oracle
│   ├── osr
│   ├── patches
│   ├── print
│   ├── profiling
│   ├── rangechecks
│   ├── reflection
│   ├── regalloc
│   ├── relocations
│   ├── rtm
│   ├── runtime
│   ├── stable
│   ├── startup
│   ├── stringopts
│   ├── testlibrary
│   ├── tiered
│   ├── types
│   ├── uncommontrap
│   ├── unsafe
│   ├── vectorization
│   └── whitebox
├── gc
│   ├── arguments
│   ├── class_unloading
│   ├── cms
│   ├── CondCardMark
│   ├── ergonomics
│   ├── g1
│   ├── logging
│   ├── metaspace
│   ├── parallel
│   ├── serial
│   ├── startup_warnings
│   ├── stress
│   ├── survivorAlignment
│   ├── testlibrary
│   └── whitebox
├── native
│   ├── classfile
│   ├── code
│   ├── gc
│   ├── logging
│   ├── memory
│   ├── oops
│   ├── runtime
│   └── utilities
├── native_sanity
├── runtime
│   ├── 6294277
│   ├── 6626217
│   ├── 6819213
│   ├── 6981737
│   ├── 7100935
│   ├── 7116786
│   ├── 7158988
│   ├── 7160757
│   ├── 7162488
│   ├── 7167069
│   ├── 8007320
│   ├── 8007475
│   ├── 8010389
│   ├── 8024804
│   ├── 8026365
│   ├── 8026394
│   ├── Annotations
│   ├── BadObjectClass
│   ├── BoolReturn
│   ├── BootClassAppendProp
│   ├── CDSCompressedKPtrs
│   ├── ClassFile
│   ├── classFileParserBug
│   ├── ClassResolutionFail
│   ├── ClassUnload
│   ├── CommandLine
│   ├── CompactStrings
│   ├── CompressedOops
│   ├── constantPool
│   ├── ConstantPool
│   ├── contended
│   ├── defineAnonClass
│   ├── duplAttributes
│   ├── EnclosingMethodAttr
│   ├── ErrorHandling
│   ├── execstack
│   ├── Final
│   ├── finalStatic
│   ├── getSysPackage
│   ├── handlerInTry
│   ├── InternalApi
│   ├── interned
│   ├── invokedynamic
│   ├── jni
│   ├── jsig
│   ├── lambda-features
│   ├── libadimalloc.solaris.sparc
│   ├── LoadClass
│   ├── LocalLong
│   ├── LocalVariableTable
│   ├── logging
│   ├── memory
│   ├── Metaspace
│   ├── MinimalVM
│   ├── MirrorFrame
│   ├── modules
│   ├── NMT
│   ├── os
│   ├── PerfMemDestroy
│   ├── RedefineObject
│   ├── RedefineTests
│   ├── reflect
│   ├── ReservedStack
│   ├── Safepoint
│   ├── SameObject
│   ├── SelectionResolution
│   ├── SharedArchiveFile
│   ├── StackGuardPages
│   ├── stackMapCheck
│   ├── testlibrary
│   ├── Thread
│   ├── ThreadSignalMask
│   ├── Throwable
│   ├── TransitiveOverrideCFV50
│   ├── Unsafe
│   ├── verifier
│   ├── whitebox
│   └── XCheckJniJsig
├── sanity
│   └── MismatchedWhiteBox
├── serviceability
│   ├── 7170638
│   ├── attach
│   ├── dcmd
│   ├── jdwp
│   ├── jvmti
│   ├── logging
│   ├── sa
│   ├── threads
│   └── tmtools
├── testlibrary
│   ├── ctw
│   ├── jittester
│   └── jvmti
└── testlibrary_tests
├── ctw
└── whitebox

Я не знаю, как использовать GDB для отслеживания кода горячей точки JDK9.

Например, как отследить простой код HelloWorld.java и пройти весь код Hotspot.

public class HelloWorld {
public static void main(String[] args) {
// Prints "Hello, World" in the terminal window.
System.out.println("Hello, World");
}
}

Я хочу изучить поток кода Hotspot, основанный на способе STEP BY STEP.

Хотя я могу прочитать static Исходный код и генерировать граф потока управления для меня, чтобы понять, но этого недостаточно для разработки.

/9dev/jdk/test/sun/management/jmxremote/bootstrap/launcher.c

введите описание изображения здесь


Я знаю основную команду GDB

start
start gcc

list
enter to show 10 more lines

step
step into and go through

print [var]
variable name
p = print

next
step over

x [var]
addr: raw var
examine abbr.

watch  [var]
rwatch
info watch
info break

cont
continue until break point

break #line

bt
backtrace
frame #
change context and subrounte and rounte

set var sum=23
set a varible inside and change the variable instantly

quit
exit gdb

2

Решение

Вы можете запустить сеанс отладки в gdb, используя удаленную отладку gdbserver.
Для справки:

Замечания: Вам нужно будет запустить два отдельных экземпляра удаленных сессий ssh, где в одном из них вы запустите gdbserver, а из другого сеанса вы будете запускать клиент gdb для отладки кода JVM.

1

Другие решения

настроить и сделать

настроить параметры

bash ./configure --with-target-bits=64 --with-debug-level=slowdebug --disable-warnings-as-errors --with-native-debug-symbols=internal

make clean

make all

версия


xfwu:~/sandboxJDK/9jdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$./java -version
openjdk version "9-internal"OpenJDK Runtime Environment (slowdebug build 9-internal+0-adhoc.xfwu.9jdk)
OpenJDK 64-Bit Server VM (slowdebug build 9-internal+0-adhoc.xfwu.9jdk, mixed mode)

GDB

xfwu:~/sandboxJDK/9jdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin$gdb --args java ~/sanboxJDK/9jdk/javaPrj/HelloWorld

0

По вопросам рекламы [email protected]