项目开发必备技能养成!详细说明使用远程Debug调试部署的项目

188 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

基本概念

  • 由于部署环境的不同,经常会出现开发环境测试正常.但是在测试环境,甚至生产环境会出现异常的问题
  • 生产环境中处理异常问题的方式比较单一,通常是通过生产环境中的项目运行日志获取运行中环境上下文,分析日志并尝试重现Bug. 但是这回引起以下的问题:
    • 日志分析工作非常耗时
    • 日志记录有时不一定能反映出问题,可能需要多次重复分析日志,猜测问题,添加日志,部署项目,获取日志这样的过程来逼近问题
  • 为了解决上述问题,需要进行远程Debug调试:
    • 将程序在测试环境中使用Debug模式启动
    • 在本地环境中使用IDEA在工程中设置断点进行项目调试

远程调试

配置jvmArguments参数

  • Maven项目的pom.xml文件中配置jvmArguments参数 : -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n</jvmArguments>
			</configuration>
		</plugin>
	</plugins>
</build>
  • 添加jvmArguments参数配置后的Maven项目部署后就可以支持远程Debug调试了
  • jvmArguments中的参数说明:
    • -Xdebug: 通知JVM在Debug模式下工作
    • -Xrunjdwp: 通知JVM使用Java debug wire protocol运行调试环境,这个参数中包含以下的Debug调试选项
      • transport: 指定调试数据的传输方式
        • dt_socket: 使用Socket模式传输数据
        • dt_shmem: 使用共享内存方式传输数据.这个方式只适用于Windows平台
      • address: 进行调试的服务器的端口号,也就是客户端用来连接服务器的端口号
      • server: JVM是否作为调试调试服务器执行.值为y或者n
      • suspend: 是否在调试客户端建立连接之后启动JVM.值为y或n

打包调试项目

  • 使用IDEA工具对需要调试的项目进行打包,获取到项目的jar

启动参数部署项目

  • 使用支持远程调试Debug的启动参数对项目进行部署
java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n -jar com.oxford-v1.0.jar
  • 启动成功后,就会监听5005端口

配置IDEA的远程Debug

  • 在启动项中,选择Edit Configuration进行配置的编辑
  • 选择 +Add New Configuration, 选择Remote, 然后添加远程Debug配置
  • Remote的配置中,添加远程Debug配置,包括HostPort. 配置完成后,点击ApplyOK按钮

使用远程Debug调试

  • 在启动项中选择远程启动项Remote启动,通过Debug启动项目
  • 在项目中添加断点即可进行项目的远程调试