0. 远程调试SpringMvc项目

  • idea中的 使用tomcat 加载项目启动的debug方式就是使用的远程调试
    • image.png
  • 可以不用在关注日志,直接debug查询线上错误
    • 调试 ≠ 改源码后能生效 (已线上代码为准)
      • image.png

1. Jar

1.1 启动jar时加入相关命令

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=80

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=80 -jar xxxx.jar &

1.1.1 命令相关

  1. 参数含义:
  2. -XDebug 启用调试
  3. -Xnoagent 禁用默认sun.tools.debug调试器
  4. -Djava.compiler=NONE 禁止 JIT 编译器的加载
  5. -Xrunjdwp 加载JDWPJPDA参考执行实例
  6. transport 用于在调试程序和 JVM 使用的进程之间通讯
  7. dt_socket 套接字传输
  8. server=y/n JVM是否需要作为调试服务器执行
  9. address=2345 调试服务器监听的端口号
  10. suspend=y/n 是否在调试客户端建立连接之后启动 JVM
  11. 注意:-jar参数不能写到-XDebug参数

1.2 启动jar

启动后会等待idea等工具的连接

image.png

2. tomcat

2.1 tomcat配置

// 非必要
在服务器上 tomcat 的 bin目录下找到并打开 catalina.sh or catalina.bat
大约282行

  1. if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
  2. # set JPDA_ADDRESS=localhost:8000 #默认
  3. set JPDA_ADDRESS=xx # 修改端口
  4. ##eg:set JPDA_ADDRESS=0.0.0.0:1524

2.2 重启tomcat

./shutdown.sh (windows用bat)

2.2.1 使用命令 sh catalina.sh jdpa start 进行启动服务(务必注意:此时不要再启动原来的服务,即 ./start.sh )

sh catalina.sh jpda start (windows用bat)

3. 配置idea

在idea中按顺序打开Run(运行) => Edit Configurations (编辑配置)=> Remote (远程/远程JVM调试)=> Configuration(配置),设置 远程调试的项目名字name、远程需要调试机器的IP地址host、对应的端口号port,且与上面保持一致。Transport、Debugger mode保持默认。
image.pngIDEA远程调试代码 - 图7image.png

3.1 配置完成后启动

image.png

3.1.2 启动(连接)成功

image.png
jar - console 先打印监听 - Listening for transport dt_socket at address: 1122 然后等待监听
如果idea没有启动监听 项目不会启动,证据:swagger页面不能访问
image.png
tomcat - 先启动项目 默认监听中 证据:swagger页面在idea没有监听的情况下能访问
当idea监听关闭时会打印 Listening for transport dt_socket at address: 1122 ,表示监听

4. 调试开始

4.1 在源码项目中打上断点

image.png

4.2 测试是否能进入断点

4.2.1 访问接口

image.png4.2.2 成功进入断点

image.png

5. 注意事项

5.1 注意:-jar参数不能写到-XDebug参数

5.2 使用命令 sh catalina.sh jdpa start 进行启动服务(务必注意:此时不要再启动原来的服务,即 ./start.sh )

5.3 java.net.ConnectException “Connection refused: connect”

5.3.1 线上端口是否开放

nmap工具检测开放端口 (参考

  • rpm -ivh nmap-4.11-1.1.x86_64.rpm
  • rpm -ivh nmap-frontend-4.11-1.1.x86_64.rpm
  • nmap 127.0.0.1
  • image.png

    5.3.2 端口是否冲突

    查看某个端口是否被占用: lsof lsof -i:端口号

    5.4 No executable code found at line

    5.4.1 被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题。