(九)Intellij 远程调试

题问

    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配置:

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


    linux中的配置

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

    默认的监听端口为8000,可以自行修改端口。


    在这种情况下,我们只需要执行以下命令来启动tomcat即可。catalina jpda start (./catalina.sh jpda start)linux环境下命令.

(九)Intellij 远程调试_第1张图片


二、第二部分配置Intellij

    在inellij中可以通过两种配置方式

    选择Edit Configurations 然后选择更多中的Remote。

(九)Intellij 远程调试_第2张图片


    在host中配置远程tomcat的机器地址(我这里是在本地测试的,所以写的是localhost),port配置默认的8000端口,然后一点ok,shift+F9 debug模式连接远程tomat,连接成功打印如下日志。

    Connected to the target VM, address: 'localhost:8000', transport: 'socket'


    之后我们访问项目或者访问远程tomcat加载的项目接口,打断点,在访问到对应的业务逻辑时,会自动的进入断点,这样就实现了远程调试,虽然是远程tomcat中的war包,但是源代码则可以在本地进行调试,只要本机能ping通的远程服务器,都可以进行远程调试。


intellij第二种远程调试方式

    对于使用tomcat服务器的还可以这样进行远程连接tomcat,如下图所示。

(九)Intellij 远程调试_第3张图片

(九)Intellij 远程调试_第4张图片


    使用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"


    或者直接在catalina.sh中CATALINA_OPTS中添加配置-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1043 直接重启tomcat即可.



    然后启动tomcat,在intellij中的配置和上述一致,不再赘述。这次使用的端口号为1043,也就是把上面的8000改成1043,这样也可以实现远程调试。

    怎么样,是不是很轻松的就get 技能了呢?


总结

    解决问题一定要细心,耐心。还有一点很重要,很多时候,我们之所有有灵感,之所以很快的解决了问题,之所以能把问题分析透彻的原因是,你的周围有这样一群和你一样积极爱思考的程序猿们。





你可能感兴趣的:(【intellij】,Intellij,快速上手)