TLDR我想对linux机器上的java程序进行实时调试,并且不希望将调试器附加到JVM的方式/方式是什么。
解决了问题,但经过几个小时的搜索后,我却缺乏术语来找到解决方案:

我有一个要观察的Java程序(存储在jar文件中)(反向工程师?)它在运行时。我看到了很多对Java的反编译支持-这根本不是我感兴趣的内容,因此请不要解释如何做到这一点。我在搜索中遇到的一个主要问题就是遇到了这类答案。

理想情况下,我想: PID。
以某种方式将调试器附加到JVM(这显然是我不知道的方法,并且缺乏搜索语言)
使用调试器设置断点,读取/写入JVM的任意内存,请参阅JVM的寄存器和堆栈。
使用简单的开源命令行工具执行此操作,例如Radare2或GDB。

我希望阅读Java字节码(为JVM设置的指令集),而不是Java源代码,而我这样做。我也看到他们在技术上都支持Java,但是我很难弄清楚该怎么做。

我需要两件事的帮助:使用什么软件以及如何连接该程序的过程。

要清楚一点,有问题的Java在Linux PC上运行,而不是在Android手机等上运行。

我还阅读了有关JDB的内容,但似乎代码需要使用调试标志进行编译,这对于我的情况是不可能的-似乎也与我所寻找的不符。

评论

这不是一个轻量级的解决方案,但是您会考虑将jar添加到像IntelliJ这样的IDE并从那里使用调试器吗?我在一个小型应用程序上进行了测试,效果很好。

#1 楼

您可以使用jdb附加到正在运行的程序,而无需使用调试标志对其进行编译。

在我的机器上,jdb位于/usr/local/jdk/jdk1.8.0_202/bin/jdb
我运行的Java进程的pid = 14476

有关更多信息,请参见此参考资料。

1)从命令行启动jvisualvm。它位于jdk bin文件夹中。

sudo /usr/local/jdk/jdk1.8.0_202/bin/jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=14476


2)在屏幕右侧,您可以看到计算机上正在运行的Java进程。然后,您可以执行堆转储(右键单击进程)并查看您感兴趣的类的变量的值。