用GDB调试java程序与修改Integer源码

gdb是c语言的调试工具,与java的jdb是同类工具。
我准备调试下hotspot,从java可执行文件开始调试,并执行下面的Test.java。

package test;

public class Test {

    public static void main(String[] args) {
        Integer n=3;
        System.out.println(n);
        n=10;
        System.out.println(n);

    }

}

一、gdb调试
调试步骤:
1.进入java项目的运行目录,我的是/home/chengzhong/eclipse_workspace/test/bin文件夹
cd bin

2.gdb可调试的java文件,比如:
gdb /home/chengzhong/openjdk/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java

3.现在进入了gdb环境,再执行
set args test.Test
加了这行命令,相当于我们在命令行执行java test.Test

4.执行
run

是不是就能看到了Test.java的运行结果了?


二、两种Eclipse下调试修改Integer

我尝试给Test.java打断点,在这之前先得解决一个问题,希望gdb能进入java的断点。哈,这是不行的,java的断点用jdb命令才行。这就比较尴尬了。本来我想调试IntegerCache的初始化过程,看来现在是gdb不行,jdb也不行。

那我再试试再Integer.java中加入System.out.println("")这样的信息,来观察IntegerChache的初始化过程。
进入Integer.java源码,再IntegerChache的static方法块里加入:System.out.println("in IntegerCache static");再编译make一下jdk.
再进入c语言eclipse,调试Test.java ,控制台打出来了。


那我再进入java的eclipse,使用刚编译的jdk,运行jdk,看是否能出来。
但不行,因为debug模式编译的jdk没有生成jar,无法在eclipse里配置jdk.
那我就编译一个release版的吧。
./configure --with-target-bits=64 --with-boot-jdk=/home/chengzhong/openjdk/jdk-10
make
机器配置不高的同学可能会遇到和我一样的问题,编译途中,机器自动断电了。这是温度太高引起的,旁边放个风扇,风开大点就能解决问题。
错了,release的也不行,生成的文件一样。
我尝试了下make install,是可以生成,但不但会生成文件还会改变本地环境变量。最后我发现可以使用:make images来生成。
生成之后,再让java eclipse配置到images文件夹下的jdk。可以从控制台看到我们加的System.out.println的内容。
文/中中 浏览次数:0次   2020-04-01 18:50:57

相关阅读

微信扫描-捐赠支持
加入QQ群-技术交流

评论: