Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不访问源代码的情况下调试Java应用程序?_Java_Debugging_Decompiling - Fatal编程技术网

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

如何在不访问源代码的情况下调试Java应用程序?,java,debugging,decompiling,Java,Debugging,Decompiling,我需要调试一个没有源代码的Java应用程序。它在Jetty服务器上本地运行。使用JD-GUI进行反编译效果良好。通过套接字连接或共享内存连接JDB也可以正常工作 我失败的地方是把各个部分连在一起。我主要使用JDEclipse插件和远程调试来尝试Eclipse。我未能找到将调试器成功附加到正在运行的进程的方法。一切似乎都假设我至少有部分应用程序可以作为项目中的源代码使用,但我没有。而且它是一个相当大的应用程序(200多个MiB的JAR文件和500多个MiB的其他东西),因此尝试从所有反编译类构建一

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

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


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

您可以借助jd eclipse及其扩展jd eclipse重新对齐片段的组合来完成这项工作

安装此软件的过程非常简单:

  • 按照中提供的步骤安装 JD Eclipse站点(过程非常简单)
  • 重新启动Eclipse
  • reallignment reallignment.jd.ide.eclipse_1.0.2.jar
  • 将文件复制到\dropins
  • 重新启动Eclipse
  • 转到Windows->Preferences
  • 导航到常规->编辑器->文件关联
  • 在文件类型部分选择*.class,然后选择JD的重新对齐 在“关联编辑器”部分中为文件编辑器初始化,然后单击 默认按钮
  • 按OK并开始调试
      以下是一个可能的解决方案:

    • 使用以下参数运行jar:
    • java-agentlib:jdwp=transport=dt\u shmem,address=XXXXX,server=y,suspend=n-jar-YourJar

    • 使用run->External工具在eclipse中运行jdb,以连接到正在运行的jvm
    • jdb-附加XXXXX

    • 使用jdb cmd设置断点,如:
    • 停在:

      我会在有空的时候试试,如果有用的话会更新

      更新: 我今天就想出来了:

    • 解压缩jar文件

    • jdb-sourcepath[解压jar路径]-classpath[您的主类路径]

    • jdb初始化后,执行以下操作:

    • 停在:
      跑
      
    • 触发断点后,可以使用jdb命令逐步调试

    • 查找“jad,Java反编译器”。结果并不总是完美的,但如果你真的需要源代码,它会给你提供源代码;使用反编译器调试正在运行的进程以获取源代码是我一直在努力的地方。因此,您已经反编译并获得了源代码的副本,但是您在将调试器同时连接到源代码和进程时遇到了问题?有200多兆的JAR文件和500多兆的其他内容-将其转换为可编译项目可能几乎是不可能的,并且不值得仅为跟踪一两个错误而付出努力。(注释逐字复制了matheszabi的答案)您真的需要整个可编译的代码库吗?或者您需要特定的可编译类吗?我已经按照您描述的做了。如何从那里开始调试?仅仅点击调试将不起作用,因为我没有源代码,也没有项目可供午餐。我尝试了远程调试,但要么什么也没发生,要么是连接错误。您使用什么JVM选项来启动远程调试过程?-Xrunjdwp:transport=dt_socket,address=8023,server=y,suspend=nOne更多的是为了找到源代码,如果项目中使用的jar文件属于不同的项目,它们需要作为“addexternaljars…”添加到构建路径中。否则,如果使用“addjar”,您将收到消息“sourcenotfound”更进一步——我成功地将Eclipse中的调试器连接到yEd上——我目前正在使用yEd进行测试——挂起所有线程并检查调用堆栈。我不确定我做错了什么或之前出了什么错,但这可能只是因为我对Eclipse非常陌生——3天。
      stop at <package>.<yourclass>:<linenunmber>
      run <your main class, for example org.springframework.boot.loader.JarLauncher>