在Eclipse中如何调试已编译的Java代码

37
我想知道在Eclipse IDE中有没有解决方案,能够调试我没有源代码的Java代码,即调试动态反编译代码、逐步调试等。我尝试使用 JD-EclipseJadClipse插件,如果我只是查看某些类文件,这些插件效果很好,但是在我调试时,会出现“找不到源代码”的提示 - 我如何“附加”这些插件以“提供”源代码呢?
我的环境:
  • Eclipse 3.5
  • Windows XP(如果可能的话,我要寻找跨平台的解决方案)
谢谢。

如果你反编译了代码,你就不能用-g重新编译它并像自己的源代码一样进行调试。 - Murali VP
重新编译反编译的源代码会生成完全相同的类文件吗?我认为不会。但是如果操作者可以用自己的类文件替换原有的文件,那么这应该是可行的。 - Francis Upton IV
请注意,IntelliJ 14+内置了反编译器。 - Thorbjørn Ravn Andersen
8个回答

15

我有同样的问题。目前没有有效的反编译器可以调试编译后的Java代码。我正在使用JD-Eclipse工具。在未来3到6个月内,JD-Eclipse的界面应该会得到很大改善。我们将开始调试没有源代码的类,并解决一些棘手的问题。


@Emmanuel Dupuy:关于“无源代码调试类”的进展有什么消息吗? - rafalmag
1
@rafalmag 实现了重新对齐算法。您可以在此处进行测试:http://java.decompiler.free.fr/?q=preview。将其集成到JD-Eclipse中需要几个月的时间。可以合理地说,它将在12月份准备就绪。目前,JD可以使用Eclipse + Alex Kosinsky的扩展程序:http://sourceforge.net/projects/realignmentjd。 - Emmanuel Dupuy
1
此外,https://github.com/mchr3k/jdeclipse-realign是Alex工作的分支,提供了一种方便的方法在反编译的类文件和附加的源码之间进行切换。在Eclipse 3.7和Java 6中使用效果很好,可以让没有源码的调试变得更加容易! - Caspar
JD-Eclipse 有进展了吗? - user626528

13

我对Jadclipse - http://jadclipse.sourceforge.net/wiki/index.php/Main_Page - 有丰富的经验,这里提供一个更新站点http://jadclipse.sf.net/update

为了获得最佳结果,请使用jad并将其配置为在代码中作为注释列出行号,以便输出正确行的代码。这是用于调试会话的最佳方式。

然后将其设置为类的默认视图。请参阅文档以获取详细信息。我使用它表现良好。


这种方法最合适 - 它似乎可以工作(即时反编译Java类,调试时显示源代码)。看来我走在了正确的道路上,但是错过了几次重启Eclipse。如果反编译文件的所有行都匹配,那就太完美了,因为现在我得到了许多MISALIGNED。 - NSPKUWCExi2pr8wVoGNk
同意,但Jad不是开源的,而且作者似乎已经放弃了它。希望由jadclipse支持的新反编译器最终会比jad更好。 - Thorbjørn Ravn Andersen
MISALIGNED是由jad创建反编译源代码的方式引起的。我相信它是串行写入的,无法前后移动以更好地放置内容。 - Thorbjørn Ravn Andersen
@tori,注意到如果将{和}放在同一行而不是下一行,就会减少对齐问题。请检查jadclipse配置面板。 - Thorbjørn Ravn Andersen

6

JD-Eclipse宿主插件的重定向片段。这个Eclipse插件可以使反编译代码行号与Java类文件中的行号实际上对应起来。因此,即使没有源代码也可以进行调试。

https://sourceforge.net/projects/realignmentjd/

4
您可以使用JD-GUI来反编译jar文件,并将所有内容保存到源代码zip文件中,然后将其添加到源代码搜索列表中(通过配置构建路径)。
JD-GUI的问题在于行号不正确,这使得调试非常困难,因此您需要:
1.从反编译的源代码zip文件中提取源代码文件
2.运行在https://bushlife.com.au/groups/python/wiki/7539a/Adjust_line_numbers_in_file.html找到的脚本
3.将生成的源代码重新压缩
4.右键单击Java项目中的jar文件,在“配置构建路径”中将其作为源路径添加。

这是我看到的第一个关于行号解决方案的提及!谢谢。不幸的是主页已经无法访问了! - sandos
刚刚查看了该网站。如果您仍然有问题,可以将具体细节发送给该网站的 spider。他会全面解决问题。 - sweetfa
我成功下载并使用了这个脚本,非常好。它有一个很烦人的处理方式,即无序行号的处理,但可以找到解决方法。 - sandos

3

这个插件希望能够帮到您。 JD-Eclipse

在Eclipse中打开“Window” -> “Preferences” -> “General” -> “Editors” -> “File Associations”,选择*.class文件类型,将其关联到JD-Eclipse,并将其设置为默认值。

祝好运!


3
对我来说,调试时这个没用。 - NSPKUWCExi2pr8wVoGNk
它没有起作用。 - Lova Chittumuri

2
反编译所有的类,将所有的Java文件按正确的层次结构(包目录等)排序,并通过右键单击jar文件 -> Java源代码附件 -> 外部文件夹将它们添加为原始jar的源代码。您还可以将它们放在项目中的文件夹中(在这种情况下,单击工作区)。

你会推荐哪个反编译器? - Thorbjørn Ravn Andersen
我最近没有进行反编译(开源的好处...),但我记得 JAD 和 JODE 可以产生良好的结果。更多信息请参见 http://stackoverflow.com/questions/31353/ 和 https://dev59.com/HHM_5IYBdhLWcg3waiiJ。 - David Rabinowitz
是的,我曾考虑过这种方法,但如果有很多库,这会变得非常烦人,因此我正在寻找一种“自动方式”,没有任何额外负担。 - NSPKUWCExi2pr8wVoGNk
使用命令行反编译器,编写Ant(甚至是Shell)脚本,遍历文件并生成Java文件。 - David Rabinowitz

2
对我有效的解决方案是在应用补丁后使用JD-Eclipse:http://java.decompiler.free.fr/?q=node/464。这是jd-eclipse的扩展,可以在反编译后重新排列代码。
当您使用eclipse进行调试时,只需将jar文件放入类路径中即可!不需要反编译整个jar文件,也不需要重新排列等操作...只需进行调试并快乐地工作即可 :-)
以下是操作步骤:http://gauchoacomecable.wordpress.com/2011/10/14/eclipse-debug-java-without-source-code-jd-eclipse-and-realignment/

0

你是否使用了与另一个项目相同的补丁?遗憾的是,这个功能还没有进入主代码,否则我们就不会有两个代码分支了。 - dma_k
不行。根据http://mchr3k.github.com/jdeclipse-realign/,我分叉了一个不同的项目。 - mchr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接