如何在不访问源代码的情况下调试Java应用程序?

时间:2013-11-07 17:51:29

标签: java debugging decompiling

我需要调试我没有源代码的Java应用程序。它在Jetty服务器上本地运行。使用JD-GUI进行反编译工作正常。通过套接字连接或共享内存附加JDB也可以正常工作。

我失败的地方是将各个部分连在一起。我主要使用JD-Eclipse插件和远程调试来尝试Eclipse。我找不到将调试器成功附加到正在运行的进程的方法。一切似乎都假设我至少有部分应用程序可用作项目中的源代码,但我没有。它是一个相当大的应用程序(200多个MiB的JAR文件和500多个MiB的其他东西)所以试图从所有反编译的类构建一个项目并让它运行不是一个选项,除非它很容易自动化。 / p>

我真正需要的是能够将调试器附加到正在运行的进程,查看和导航反编译代码,设置断点并检查变量和对象。是否可以重新编译代码并不重要。有条件的断点和表达式评估会很好。

2 个答案:

答案 0 :(得分:2)

你可以借助jd-eclipse及其扩展jd-eclipse重新调整片段的组合来做到这一点。

JD-Eclipse

Realignment fragment

安装过程非常简单:

  • 按照提供的步骤安装JD-Eclipse JD-Eclipse站点(过程非常简单)
  • 重启Eclipse
  • Download重新调整realignment.jd.ide.eclipse_1.0.2.jar
  • 将文件复制到\ dropins
  • 重启Eclipse
  • 转到Windows - >首
  • 导航至常规 - >编辑 - >文件关联
  • 在“文件类型”部分中选择* .class,选择“JD的重新对齐” “关联的编辑器”部分中的“类文件编辑器”,然后单击 默认按钮。
  • 按“确定”开始调试!

答案 1 :(得分:0)

这是一个可能的解决方案:

  1. 使用以下参数运行jar:

java -agentlib:jdwp=transport=dt_shmem,address=XXXXX,server=y,suspend=n -jar YourJar

  1. 使用“运行”->“外部工具”在Eclipse中运行jdb以连接到正在运行的jvm

jdb -attach XXXXX

  1. 使用jdb cmd设置断点,例如:

stop at <TheClassName>:<ThePosition>

我会在有空的时候尝试它,如果可以的话会更新

更新:

我已经弄清楚了:

  1. 解压缩jar文件

  2. jdb -sourcepath [未压缩的jar路径] -classpath [您的主类路径]

  3. jdb初始化后执行:

stop at <package>.<yourclass>:<linenunmber>
run <your main class, for example org.springframework.boot.loader.JarLauncher>
  1. 触发断点后,可以使用jdb命令逐步调试

jdb debug