最近需要对于一个上了年纪的项目进行维护,但是由于历史悠久,没有办法找到该项目对应的比较完整的源码,
因此经过了一番挣扎之后,最终利用tomcat的远程调试来解决问题。(前提是有人对于该项目有一定的熟悉程度)
1.通过分析问题,找到可能出现该问题的class文件,暂时无法打开在这些文件。
2.对这些文件进行反编译,从而得到我们熟悉的Java文件。(反编译的工具挺多的,具体哪一种比较稳定实用还待考证。反编译工具使用的是jadx)
3.在eclipse中新建一个Java项目,只需要加入之前得到的Java文件,目录结构必须保持对应。(引入这几个类所依赖的class文件,这些Java文件编译报错好像也并没有影响调试,但是看到标红会有强迫症)
4.关闭web服务器,修改tomcat根目录下的bin文件夹中的startup.bat,在其中加上(其中的端口号8000,这个值自己设定,只要确认该端口没有被占用)
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
加入的具体位置 如下
5.启动项目,tomcat的命令行窗口第一行会看到 Listening for transport dt_socket at address: 8000,表示该端口正在被监听,等待连接。
6.在Debug Configurations增加远程调试配置,Port与上面的端口保持一致。
project 就是刚才创建的新项目,点击Browser可以进行选择。
Host就是启动的tomcat 所在服务器的IP,
Port就是刚才设定的等待连接的端口。
7.点击debug,在需要调试的地方打上断点,在浏览器访问tomcat中的项目,等待结果的到来。
备注:刚开始使用的方式是将class文件拷贝出来,然后进行反编译得到Java文件,
在其中加上打印语句,然后在进行编译成class文件放到原来的位置,
这样调试不仅比较麻烦(需要不断的重启服务),有时候报错没有在控制台输出信息(比较郁闷,还没找到原因)
小发现就是在使用eclipse进行Java文件编译的时候,可以加入一些外部的class文件进行构建,有点爽。