最近想看看weblogic,但是环境比较难搭建和调试,趁着这个机会,看一下java的各种代码远程调试的方法,很基础的东西了,一直没看。(顺便水一篇博客)

远程调试Jar包

主要在只有jar包无源码的情况下进行调试。

这里以冰蝎的jar包为例子

随便开一个java项目,然后我们创建一个lib目录然后放入jar包

image-20250207232603675

右键选择Add as Library,将lib文件夹添加进项目依赖

image-20250207232743226

然后就可以看到jar包中反编译的源代码了

image-20250207232819108

然后我们添加一个Remote JVM Debug的Configuration

image-20250207233704447

然后默认配置Apply提交并保存即可,其中-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005将作为运行时的启动参数

image-20250207233914498

然后将-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005作为启动参数运行jar包

image-20250207234243331

suspend表示是否暂停程序等待调试器连接,”y”表示暂停,”n”表示不暂停,这里还是要选择暂停,上面默认的是不暂停导致我调试进入不到断点,因为容易程序执行过快断点拦截不到

呃呃但是还是不成功,我也不知道为什么,后来找到一篇看雪的文章:https://bbs.kanxue.com/thread-282397.htm,说是符号表的原因,因为在编译的时候去掉了调试符号,在没有符号的情况下,对业务代码函数体内的地方下断点失效,只有对系统函数的代码下断点是可以的。

那这里再重新写一个简单的循环打印的demo来试一下

image-20250209164358801

去掉调试符号

要去掉调试符号的话编译时加上-g:none即可

jar打包

这里还有一个小插曲,我一开始打包完之后运行会说没有主属性清单,我一看mf文件,根本没有指定Main-Class,然后这里需要用到一个打包插件来生成,记录一下

<build>
<finalName>${project.artifactId}</finalName><!--修改编译出来的jar包名,仅为{artifactId}.jar-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.clown.Main</mainClass> <!-- 此处为主入口-->
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

然后再打包就行了

然后再按前面的方式启动就可以打到断点了

image-20250209165226194

那看来前面失败的原因就是因为没有符号表的问题了

然后前面业务代码断不了点,但是可以在函数名的地方断点,这里随便拿了一个简单的web应用来尝试

image-20250209165724961

然后他就会进到系统函数里面了,所以没有源码还是比较不方便

有源码的情况下远程调试

操作和前面的一样,区别就是本地用的是源码。

总之有源码尽量用源码调试。

远程调试Docker

这里可以看看p神的视频:https://www.bilibili.com/video/BV1bb421n7M2/?vd_source=f056182291458f597ae69cee19ecf116

其实原理也一样,只要映射端口出来,然后本地放一个版本一样的jar包或者源码即可,就不再记录了。

Weblogic环境搭建

因为准备看Weblogic,所以环境搭建也在这里写了吧

这里推荐这个环境搭建工具:https://github.com/QAX-A-Team/WeblogicEnvironment