首页
社区
课程
招聘
[求助][讨论]使用GDB控制JVM的运行
发表于: 2016-8-14 14:38 4571

[求助][讨论]使用GDB控制JVM的运行

2016-8-14 14:38
4571
现在有一段Java程序:
public class Test {
  public static void main(String[] args) {
    boolean test = true;
    while (test) {
      System.out.println("Hello World");
      try { Thread.sleep(1000); } catch (Exception e) {}
    }
    System.out.println("Bye-bye");
  }
}


任务是:
在不使用debug选项的情况下正常启动Java程序(production模式),让程序可以顺利退出死循环,输出Bye-bye然后正常结束。


正常启动:
vi Test.java; javac Test.java; javap -c Test.class; java -cp . Test


不知道大家有什么思路没有?谢谢。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 240
活跃值: (26)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
先写下我目前尝试的进展,作抛砖引玉。
如果将test变量从函数局部变成Test类的static,就比较简单:

public class Test {
  private static boolean test = true;
  public static void main(String[] args) {
    while (test) {
      System.out.println("Hello World");
      try { Thread.sleep(1000); } catch (Exception e) {}
    }
    System.out.println("Bye-bye");
  }
}


我们直接使用
ps -ef | grep java
然后
gdb -p <pid>

基本原理是执行JNI的API,使用
JNI_GetCreatedJavaVMs
可以得到JVM的指针,再
AttachCurrentThread
可以得到env指针。通过env的
FindClass, GetStaticFieldID, SetStaticBooleanField
就可以将test的值从true变为false了。
2016-8-14 14:43
0
雪    币: 240
活跃值: (26)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
被某原sun公司的jvm expert给解决了,使用Hotspot Serviceability Agent可以打印出具体的stack frame并有机会得到local variable的内存地址,然后gdb patch就可以了。
2016-8-15 15:28
0
游客
登录 | 注册 方可回帖
返回
//