java实用小技巧(一)--远程debug

该系列介绍一些java开发中常用的一些小技巧,多小呢,从不会到会只需要一篇文章这么小。这一篇介绍如何使用jdk自带的扩展包配合Intellij IDEA实现远程debug。

项目中经常会有出现这样的问题,会令程序员抓狂:线上项目关键代码段没有打印日志,本地环境正常生产环境却又问题...这时候,远程debug可能会启动作用。

1 准备用于debug的代码

准备一个RestController用于接收请求,最后可以通过本地断点验证是否成功开启了远程debug

@RestController
public class TestController {

    @RequestMapping("/test")
    public Integer test() {
        int i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        return i;
    }

}

项目使用springboot和maven构建,依赖就省略了,使用springboot提供的maven打包插件,方便我们打包成可运行的jar。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

2 使用maven插件打包成jar

3 准备启动脚本

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=64057 remote-debug-1.0-SNAPSHOT.jar
  1. 使用java -jar的方式启动程序,并且添加了一串特殊的参数,这是我们能够开启远程debug的关键,以 -开头的参数是jvm的标准启动参数,关于jvm启动参数相关的知识可以先去其他博客了解。
  2. -agentlib:libname[=options], 用于装载本地lib包。在这条指令中便是加载了jdwp(Java Debug Wire Protocol)这个用于远程调试java的扩展包。而 transport=dt_socket,server=y,suspend=n,address=64057这些便是jdwp装载时的定制参数,详细的参数作用可以搜索jdwp进行了解。我们需要关心的只有address=64057这个参数选项,本地调试程序使用64057端口与其通信,从而远程调试。

4 配置IDEA

  1. 与脚本中的指令完全一致
  2. 远程jar包运行的host,由于我的jar运行在本地,所以使用的是localhost,一般线上环境自然是修改为线上的地址
  3. 与远程jar包进行交互的端口号,idea会根据指令自动帮我们输入
  4. 选择与远程jar包一致的本地代码

请务必保证远程jar包的代码与本地代码一致!!!

5 验证

保存第4步的配置后,先执行脚本让远程的jar包跑起来,再在IDEA中运行remote-debug

如上便代表连接运行成功了

在本地打上断点,访问 localhost:8080/test

可以在本地看到堆栈信息,大功告成。一行指令便完成了远程调试。

原文发布于微信公众号 - Kirito的技术分享(cnkirito)

原文发表时间:2017-10-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏源哥的专栏

把JSP放到WEB-INF后以保护JSP源代码

    本人在看《J2EE核心模式》(“Core J2ee Patterns”,刘天北、熊节译),里面提到了一种实现资源保护的方法,那就是把那些限制访问的资源(...

12630
来自专栏pangguoming

Linux下如何修改Apache根目录

创建自己需要更改的新目录,并更改宿主权限为apache用户 chown -R apache:apache /mnt/www ? 2 停止Apache...

52060
来自专栏醉生梦死

centos7服务器主网卡绑定多ip实践演示

3K90
来自专栏finleyMa

PM2 node进程管理工具 自动部署小结

PM2 的功能不多做介绍了,总之使用简单,功能强大。 今天实现了本地自动部署node项目到服务器的流程。简单总结下几个注意点。 建议先看 文档

25520
来自专栏WebDeveloper

使用Charles工具拦截app请求

如果已连接wifi则忘记,重新连接,下来连接时不止写入密码,还要选择“手动配置代理”、“电脑ipc”、“上面设置的端口号(默认8888)”, 点击确定连接

62220
来自专栏康怀帅的专栏

Laravel 环境变量

不同环境加载不同的 .env 文件。 开发: development 测试: testing 预上线: staging 正式环境: producti...

42940
来自专栏linux、Python学习

图解CentOS系统启动流程

当我们按下开机键后,系统背后的秘密我们是否了解呢?这里,我带大家探索一下linux系统开机背后的秘密。

10000
来自专栏云计算教程系列

如何使用Apache驱动Django

Django是一个功能强大的Web框架,可以帮助您快速启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码。但是其也需要...

32550
来自专栏Go 语言编程

aurora - 跨平台 Beanstalk 消息队列服务器管理工具

aurora 是一个基于 Web 的 Beanstalk 消息队列服务器管理工具,单文件无需依赖其他组件,支持管理本地和远程多个队列服务器。

60870
来自专栏运维前线

CentOS6.X/RedHat6.X yum安装jenkins

配置jenkins源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/red...

265100

扫码关注云+社区

领取腾讯云代金券