由于在某些情况下,源码不全,或者有部分源码,这种时候就可以运用远程调试去解决,比如在前段时间写了一个flume的intercept,在上线过程中发现了intercept并没有生效,这种时候就用到了远程调试,发现并解决了问题。
以下说明如何应用远程debug
– 在JAVA虚拟机启动时添加如下参数
-Xdebug
-Xnoagent
-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y
参数详解
–Xdebug 告诉jvm运行在debug模式下
–Xnoagent 禁用默认sun.tools.debug调试器。
–Xrunjdwp transport 指定连接方式(包括socket传输和内存传输两种,其中内存传输只支持windows,而且内存传输不支持远程调试)dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台。
–address 监听端口,以接收debug客户端发起的TCP连接。
–server =y 表示在remote debugging会话中作为服务端
–suspend =y 表示在客户端建立连接前,服务端被挂起;=n 则不会被挂起。 专门调试时建议设置成y
–onthrow指明,当产生该类型的Exception时,JVM就会中断下来,进行调式。该参数可选。
– -Djava.compiler=NONE 禁止 JIT 编译器的加载。
配置后并启动应用,这时候程序是在阻塞的,当有来自8787端口的请求时才会继续,这样是为了防止调试端与server端不一致,无法捕捉到问题。
采用eclipse进行debug
右键源码程序(确保本地代码与远程代码保持一致)—DebugAs—Debug Configurations—Remote JAVA Application(双击)—在弹出的选项卡中添加Host/Port,—点击Debug。
接下来程序如果执行到断点的位置,就回进入到eclipse中了。