题问
how to tackle and debug issues in scenarios where they only occur in production (or other remote environment) but not in development environment . as anybody who has been in this kind of situation would acknowledge.
当一些问题只在生产环境下出现,或者其他远程环境下出现,但是在本地上调试并没有出现,几乎每个开发人员都会面临的问题。一般我们的做法是查看系统的日志报错,然后根据报错进行猜测是哪里的原因,可是有时候是很难定位到原因的所在,而远程调试能帮我们快速的定位问题的所在。
什么是远程调试?
在计算机中远程调试是在本地上进行代码调试,而调试的并不是本地启动的服务器,而是测试环境或staging或者线上的某个生产环境,就像在本地启动服务调试一样。
配置过程
分为两部分进行,一部分是配置远程的tomcat可以进行远程调试,另一个部分就是配置我们的Intellij IDEA了。
一、第一部分设置JVM为可以远程调试
设置JVM可以远程调试有几种方式,JPDA_OPTS,CATALIN_OPTS ,JAVA_OPTS,我们一般不使用JAVA_OPTS,因为它会暴露所有的JVM应用,CATALIN_OPTS这种方式仅限在tomcat中使用。下面就一一介绍。
使用JPDA_OPTS
在我们的批处理文件中,catalina.bat 中已经有相关默认配置,我们不需要手动配置,配置如下。
windows配置:
<span style="font-family:SimSun;font-size:14px;">if not ""%1"" == ""jpda"" goto noJpda set JPDA=jpda if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport set JPDA_TRANSPORT=dt_socket :gotJpdaTransport if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress set JPDA_ADDRESS=8000 :gotJpdaAddress if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend set JPDA_SUSPEND=n :gotJpdaSuspend if not "%JPDA_OPTS%" == "" goto gotJpdaOpts set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% :gotJpdaOpts shift :noJpda</span>
linux中的配置
<span style="font-family:SimSun;font-size:14px;">if [ "$1" = "jpda" ] ; then if [ -z "$JPDA_TRANSPORT" ]; then JPDA_TRANSPORT="dt_socket" fi if [ -z "$JPDA_ADDRESS" ]; then JPDA_ADDRESS="8000" fi if [ -z "$JPDA_SUSPEND" ]; then JPDA_SUSPEND="n" fi if [ -z "$JPDA_OPTS" ]; then JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND" fi CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS" shift fi</span>
在这种情况下,我们只需要执行以下命令来启动tomcat即可。catalina jpda start
二、第二部分配置Intellij
在inellij中可以通过两种配置方式
选择Edit Configurations 然后选择更多中的Remote。
在host中配置远程tomcat的机器地址(我这里是在本地测试的,所以写的是localhost),port配置默认的8000端口,然后一点ok,shift+F9 debug模式连接远程tomat,连接成功打印如下日志。
Connected to the target VM, address: 'localhost:8000', transport: 'socket'
之后我们访问项目或者访问远程tomcat加载的项目接口,打断点,在访问到对应的业务逻辑时,会自动的进入断点,这样就实现了远程调试,虽然是远程tomcat中的war包,但是源代码则可以在本地进行调试,只要本机能ping通的远程服务器,都可以进行远程调试。
对于使用tomcat服务器的还可以这样进行远程连接tomcat,如下图所示。
使用tomcat服务器不用JPDA_OPTS还可以使用另一种配置
三、第一部分补充:使用JAVA_OPTS 或CATALINA_OPTS
JAVA_POTS选项不安全,对于远程连接的是tomcat服务器的话,可以使用CATALINA_OPTS,需要我们的tomcat的bin文件夹中建立文件名为setenv.bat,然后添加配置
windows添加
set CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"
linux添加
export CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"
然后启动tomcat,在intellij中的配置和上述一致,不再赘述。这次使用的端口号为1043,也就是把上面的8000改成1043,这样也可以实现远程调试。
怎么样,是不是很轻松的就get 技能了呢?
总结
解决问题一定要细心,耐心。还有一点很重要,很多时候,我们之所有有灵感,之所以很快的解决了问题,之所以能把问题分析透彻的原因是,你的周围有这样一群和你一样积极爱思考的程序猿们。