Java远程调试
最近想看看weblogic,但是环境比较难搭建和调试,趁着这个机会,看一下java的各种代码远程调试的方法,很基础的东西了,一直没看。(顺便水一篇博客)
远程调试Jar包
主要在只有jar包无源码的情况下进行调试。
这里以冰蝎的jar包为例子
随便开一个java项目,然后我们创建一个lib目录然后放入jar包
右键选择Add as Library,将lib文件夹添加进项目依赖
然后就可以看到jar包中反编译的源代码了
然后我们添加一个Remote JVM Debug的Configuration
然后默认配置Apply提交并保存即可,其中-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
将作为运行时的启动参数
然后将-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
作为启动参数运行jar包
suspend表示是否暂停程序等待调试器连接,”y”表示暂停,”n”表示不暂停,这里还是要选择暂停,上面默认的是不暂停导致我调试进入不到断点,因为容易程序执行过快断点拦截不到
呃呃但是还是不成功,我也不知道为什么,后来找到一篇看雪的文章:https://bbs.kanxue.com/thread-282397.htm,说是符号表的原因,因为在编译的时候去掉了调试符号,在没有符号的情况下,对业务代码函数体内的地方下断点失效,只有对系统函数的代码下断点是可以的。
那这里再重新写一个简单的循环打印的demo来试一下
去掉调试符号
要去掉调试符号的话编译时加上-g:none
即可
jar打包
这里还有一个小插曲,我一开始打包完之后运行会说没有主属性清单,我一看mf文件,根本没有指定Main-Class,然后这里需要用到一个打包插件来生成,记录一下
|
然后再打包就行了
然后再按前面的方式启动就可以打到断点了
那看来前面失败的原因就是因为没有符号表的问题了
然后前面业务代码断不了点,但是可以在函数名的地方断点,这里随便拿了一个简单的web应用来尝试
然后他就会进到系统函数里面了,所以没有源码还是比较不方便
有源码的情况下远程调试
操作和前面的一样,区别就是本地用的是源码。
总之有源码尽量用源码调试。
远程调试Docker
这里可以看看p神的视频:https://www.bilibili.com/video/BV1bb421n7M2/?vd_source=f056182291458f597ae69cee19ecf116
其实原理也一样,只要映射端口出来,然后本地放一个版本一样的jar包或者源码即可,就不再记录了。
Weblogic环境搭建
因为准备看Weblogic,所以环境搭建也在这里写了吧
这里推荐这个环境搭建工具:https://github.com/QAX-A-Team/WeblogicEnvironment