修改hotspot源码,使用GDB调试

编程

在学习《JAVA虚拟机精讲》的过程中,根据书中的实战案例,自己动手修改了Launcher的源码,即java.c,现做一记录。

在launcher的源码中添加一些自定义的模块,满足特定的业务场景。

第一步:修改java.c

文件位置:/hotspot/src/share/tools/launcher/java.c;
在java.c中定义自己的函数:
/*添加自定义函数*/

void getParameters(jstring mainClassName,JNIEnv *env,jclass mainClass,jmethodID mainID,jobjectArray mainArgs){

    printf("成功接收到变量参数...");

}

调用函数
/*在调用CallStaticVoidMethod()函数之前,引用其变量参数*/

    getParameters(mainClassName, env, mainClass, mainID, mainArgs);

    /* Invoke main method. */

    (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

第二步:编译hotspot

在/hotspot/make目录下执行make jvmg命令,编译后文件存放于/hotspot/build/linux/linux_amd64_compiler2/jvmg目录下,初次编译比较耗时,后面若只修改java.c文件,因为采用增量编译,可很快完成编译。

第三步:修改env.sh和jdkpath.sh

. ./env.sh

./gamma -version

执行此命令,可以启动虚拟机,输出版本号。

在hotspot调试脚本中,通过jdkpath.sh获取运行时jdk环境,此处修改为和openJDK编译后的版本。

如果编译版本和运行版本不一致,运行时会报错,JVM允许向下兼容。

第四步:调试

命令:./hotspot -gdb -classpath /application/ Hello

修改hotspot调试脚本,添加断点,进行debug。

# Get us to a point where we can set breakpoints in libjvm.so

break InitializeJVM

run

break getParameters

run

# Stop in InitializeJVM

delete 1

执行至第一个breakpoint,执行continue命令,放过,至第二个breakpoint,执行info args命令,输出参数信息。

(gdb) info args

mainClassName = 0x7ffff000cde0

env = 0x7ffff000b210

mainClass = 0x7ffff000cde8

mainID = 0x7ffff0074af8

mainArgs = 0x7ffff000ce08

至此,调试完毕。


————————————————
版权声明:本文为CSDN博主「潭影空人心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zlk252620068/article/details/79564097

以上是 修改hotspot源码,使用GDB调试 的全部内容, 来源链接: utcz.com/z/512772.html

回到顶部