相关疑难解决方法(0)

使用 GDB 更改 JVM 中的变量值

目前我有一个简单的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");
  }
}
Run Code Online (Sandbox Code Playgroud)

它每秒打印“Hello World”。我想使用 gdb 附加到进程并制作一个内存补丁来停止它并打印“Bye-bye”。

我知道 GDB 可以从它的控制台获取创建的 VM (JNI_GetCreatedVMs),env 对象也可以通过 GetEnv 的 API 获得。如何test在JVM中找到变量地址并将其设置为false(这是可选的)以使程序正常退出?不确定像 AttachCurrentThread 这样的 API、像 HotSpotVirtualMachine 这样的类、像 jmap 或 jstack 这样的工具是否可以提供帮助?

并且没有调试选项,假设在生产中运行的简单程序使用java -cp . Test.

在此先感谢您的任何指导。:)


附加信息(跟踪状态)

  • jmap -dump:file=hex <pid> && jhat hex并浏览http://localhost:7000;找不到对test(它不是一个对象,只是一个实例class …

java gdb jvm inject

4
推荐指数
1
解决办法
968
查看次数

Linux平台中Java代码的调用约定是什么?

我们知道调用约定"前六个整数或指针参数在寄存器RDI,RSI,RDX,RCX(Linux内核接口中的R10:124),R8和R9"中传递给c/c ++代码Linux平台基于以下文章. https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions

然而,Linux平台中Java代码的调用约定是什么(假设JVM是热点)?以下是示例,什么寄存器存储这四个参数?

protected void caller( ) {
callee(1,"123", 123,1)
}

protected void callee(int a,String b, Integer c,Object d) {

}
Run Code Online (Sandbox Code Playgroud)

java jvm

4
推荐指数
1
解决办法
1129
查看次数

跟踪java字节码流

我想看到它正在执行的JVM的当前(字节码)指令流.经过一些googleing,我发现jvm debug build提供了-XX:+TraceBytecodes选项(见这里).但是,提到的热点JVM调试版本的链接已经死了,我无法在线找到调试版本:/

有没有其他方法来跟踪jvm字节码流或有人指出我正确的方向?我正在运行64位ubuntu 16.04.

PS:我知道,打印出完整的指令流会很痛苦.但是,我很好奇

java jvm

1
推荐指数
1
解决办法
667
查看次数

标签 统计

java ×3

jvm ×3

gdb ×1

inject ×1