浅析几种不同的DEBUG方法,欢迎大家补充

远程DEBUG

当本地的代码因为各种原因无法正常启动的时候,可以选择使用远程DEBUG,这种方法要求和线上的代码一致,具体方法如下,

remote_debug

Step1: 新建一个remote jvm debug,填入需要线上服务所在服务器ip,复制Command line arguments for remote JVM,选择需要debug的module。

Step2: 服务器中启动脚本修改添加Step1中复制的arguments

1
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 remote-debug-1.0-SNAPSHOT.jar

公司的jsvc启动的话,要放在mainclass前面,注意JDK的版本,查看JAVA_HOME的版本,jdk8就配在jdk8的启动命令处,jdk11同理。配置好启动脚本后,重启服务。

1
    $_JSVC -D${_ServerName} -home $JAVA_HOME -cwd ${_HOME_DIR}/config -umask 0011 -Djava.security.egd=file:/dev/./urandom -Djava.net.preferIPv4Stack=true -Dcom.sun.jndi.ldap.connect.pool.protocol="plain ssl" -XX:MetaspaceSize=${_MetaspaceSize} -XX:MaxMetaspaceSize=${_MaxMetaspaceSize} -Xms${_Xms} -Xmx${_Xmx} -Xmn${_Xmn} -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:${_HOME_DIR}/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=8M -Djava.io.tmpdir=${_HOME_DIR}/temp  *-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005* -Dloader.main=${_MainClass}  -wait 60 -pidfile $_Pid -outfile ${_LogOut} -errfile ${_LogErr} -cp ${_Classpath_jdk8} -procname ${_SystemctlName} $1 ${_StarCLASS}

Step3: 重启好服务后,IDEA启动远程debug。显示连接正常即可,如果连接time out查询服务5005端口是否起来,如果没有起来则查看服务启动问题。

Step4: 打断点,线上服务页面操作即可进入断点。

Nginx代理DEBUG

在进行某次问题的排查的时候,需要debug单点登录(外部依赖)的流程,线上和线下的组件代码不一致,但是依赖的单点登录jar包一致,测试发现IDEA远程DEBUG并不能debug外部依赖的jar包。

由于线上服务使用的频率不高,所以直接启动本地的代码作为线上服务,使用nginx反向代理线上服务到本地,此时就可以愉快的进行外部jar包的debug,具体方法如下。

Step1: 启动本地服务

Step2: 找到集群代理组件所在的服务器,进入代理组件内部/opt/opsmgr/web/components/cluster.1/data/proxy_section,修改proxy_https.conf文件,找到需要反向代理的组件location,以iface为例,修改proxy_pass的参数为本地启动服务的地址。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
location /iface-web/ {
        proxy_set_header   Host             $http_host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto  $scheme;
        proxy_cookie_path /iface-web "/iface-web;httponly; secure";

        #proxy_pass http://10.195.185.23:8037/iface-web/;
        proxy_pass http://10.195.169.165:8037/iface-web/;
}

Step3: 重启nginx

/usr/local/cluster/nginx/sbin/nginx -t 检查脚本是否存在问题
/usr/local/cluster/nginx/sbin/nginx -s reload 重启nginx

重启完成后,则可以在线上的页面进行操作debug了。