Java安全之jar包调试技巧
调试程序
首先还是创建一个工程,将jar包导入进来
调试模式的参数
启动中需要加入特定参数才能使用debug模式,并且需要开放调试端口
JDK5-8:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
JDK9+:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
suspend=n
表示的是启动Java应用时是否立即进入调试模式,suspend=y
表示启动即暂停,suspend=n
则表示启动时不需要暂停。address=*:5005
表示的是Debug
监听的服务地址和端口,根据需求修改,上述配置会监听到0.0.0.0
。
参数说明
(1) transport
指定运行的被调试应用和调试者之间的通信协议,它由几个可选值:
dt_socket:主要的方式,采用 socket 方式连接 dt_shmem:采用共享内存方式连接,仅支持 Windows 平台(暂未验证) (2) server
当前应用作为调试服务端还是客户端,默认为 n。
如果你想将当前应用作为被调试应用,设置该值为 y;如果你想将当前应用作为客户端,作为调试的发起者,设置该值为 n。
(3) suspend
当前应用启动后,是否阻塞应用直到被连接,默认值为 y。
在大部分的应用场景,这个值为 n,即不需要应用阻塞等待连接。一个可能为 y 的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。
(3) address
暴露的调试连接端口,默认值为 8000。
(4) onthrow
当程序抛出设定异常时,中断调试。
(5) onuncaught
当程序抛出未捕获异常时,是否中断调试,默认值为 n。
(6) launch
当调试中断时,执行的程序。
(7) timeout
该参数限定为 java -agentlib:jdwp=… 可用,单位为毫秒ms。
当 suspend = y 时,该值表示等待连接的超时;当 suspend = n 时,该值表示连接后的使用超时。
IDEA配置远程调试
下断点后能直接停下来。
class文件夹调试
其实也比较简单,只需要将他打包成一个jar包或者是war包,然后执行如上操作就好了。
cd src
jar -cvf test.jar *
总的来说调试还是比较重要,其实不仅仅是jar包的调试,比如还有Spring Boot(Spring Boot以jar包启动调试与上面类似)、Tomcat、weblogic这些。假设条件允许情况下,做一些审计时候,比如war包,也可以采用远程调试的方式进行审计。会更简单快捷定位一些。