1. 前言

今天线上出现了个 Bug ,而且比较坑的是涉及到微信相关的东西不能线下调试。传统方式是在代码中各种的日志 log 埋点然后重新部署进行调试,再根据 log 中的信息进行分析。如果你的 log 埋点不合理,就要不停的修改代码、不停的打包部署。有没有什么骚操作避免上面的问题呢?

2. 远程调试

当然有解决方案,这就是远程调试(Remote debugging)。远程调试使开发人员能够直接诊断服务器或其它线上进程上的问题,它提供了跟踪线上运行时错误并确定性能瓶颈和问题根源的方法,让你能够像在本地调试一样 Debug 远程服务器。接下来我们将使用流行的 Java IDE,由 JetBrains 出品的 IntelliJ IDEA 来进行远程调试。要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的 JVM 参数,这些参数是:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}

其中 debug_port 是服务端开放的调试端口,后续本地配置会用到。

3. 使用 IDEA 进行远程调试

IntelliJ IDEA 进行远程调试并不复杂经过下面几个步骤就可以很方便的配置。

3.1 本地参数配置

按照上面图的位置打开配置面板新建一个 Remote 调试面板如下:

按照上图所示的顺序结合你自己服务器和本地环境依次进行配置,然后点击确定就行了。其中步骤 2 和 4 端口就是我们远端指定的 debug_port 端口号。

3.2 JDWP 协议

这里有一个小小的知识点就是 参数中的 jdwp 。那么什么是 jdwp?

JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和目标虚拟机(target vm)之间的通信协议。Target vm 中运行着我们要调试的 Java 程序,它与一般运行的 JVM 没有什么区别,只是在启动时加载了 JDWP Agent 从而具备了调试功能。而 debugger 就是我们本地的调试器,它向运行中的 target vm 发送指令来获取 target vm 运行时的状态和控制远程 Java 程序的执行。Debugger 和 target vm 分别在各自的进程中运行,他们之间通过 JDWP 通信协议进行通信。

3.3 开启远程调试

点击箭头所示的 绿色甲虫按钮 (快捷键 Shift + F9) 就启动调试了,然后设置好本地代码的断点,让远程的逻辑触发断点逻辑就可以进行打断点调试了。

请务必保证本地 debug 的代码与远程部署的代码完全一致,不能发生任何的修改!否则断点将无法命中!

4. 一些要点

除了需要保证代码一致外,这里还有一些需要我们注意的地方。调试完毕远程的 JDWP Agent 应该被禁用,也就是将远端的相关参数去掉。另外在调试中远端的日志并不会映射到本地,当然你可以借助一些工具将远程的日志映射到本地以提供更强大的调试功能。

还要记住,虽然远程调试是一个非常强大的工具,但是它并非银弹!生产环境不是调试的合适目标,请勿滥用!

5. 总结

正如我在本文中介绍的那样,使用 IntelliJ IDEA 进行远程调试非常简单,只需几个步骤即可使用。有些情况下它很方便地解决了我们的问题。但是它不应该被滥用,应该被合理地使用。

图文并茂教你学会使用 IntelliJ IDEA 进行远程调试的更多相关文章

  1. 使用 intellij idea 进行远程调试

    转自:http://yiminghe.iteye.com/blog/1027707 以前都是很土得打 log ,发现一篇关于 java 调试器架构 ,以及 eclipse 上使用 的文章,在常用的 i ...

  2. 10分钟 教你学会Linux/Unix下的vi文本编辑器

    10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...

  3. 【转】一篇文章,教你学会Git

    一篇文章,教你学会Git 在日常工作中,经常会用到Git操作.但是对于新人来讲,刚上来对Git很陌生,操作起来也很懵逼.本篇文章主要针对刚开始接触Git的新人,理解Git的基本原理,掌握常用的一些命令 ...

  4. 一篇文章教你学会ASP.Net Core LINQ基本操作

    一篇文章教你学会ASP.Net Core LINQ基本操作 为什么要使用LINQ LINQ中提供了很多集合的扩展方法,配合lambda能简化数据处理. 例如我们想要找出一个IEnumerable< ...

  5. eclipse/intellij idea 远程调试hadoop 2.6.0

    很多hadoop初学者估计都我一样,由于没有足够的机器资源,只能在虚拟机里弄一个linux安装hadoop的伪分布,然后在host机上win7里使用eclipse或Intellj idea来写代码测试 ...

  6. IntelliJ IDEA 远程调试

    远程调试服务器是一个比较实用的技巧,以便我们能够迅速定位线上问题.本文会介绍如何在IntelliJ IDEA中进行远程调试. 配置IntelliJ IDEA 选择Edit Configurations ...

  7. IntelliJ远程调试教程

    概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的 ...

  8. IntelliJ IDEA远程调试(Debug)Tomcat

    为什么需要这么做? 解决 在我本地是好的啊 这个世界性难题- 测试环境碰到问题,直接连上debug,不用再测试本地,再查看测试环境日志 遇到一些诡异的问题,日志是看不出端倪的 调试一些只能在测试环境执 ...

  9. Intellij IDEA 配置Tomcat远程调试

    一.前言 在服务器端开发过程中,由于服务器环境差异导致运行结果不符合预期. 所以就需要到IDEA Debug 服务器代码.看起来貌似很高大上的事情. 今天就说说使用Intellij IDEA 配置的方 ...

随机推荐

  1. Spring Security 入门(基本使用)

    Spring Security 入门(基本使用) 这几天看了下b站关于 spring security 的学习视频,不得不说 spring security 有点复杂,脑袋有点懵懵的,在此整理下学习内 ...

  2. char值不能直接用作数组下标

    #include <stdio.h> //用 char 的值作为数组下标(例如,统计字符串中每个字符出现的次数),要考虑到 //char 可能是负数.有的人考虑到了,先强制转型为 unsi ...

  3. ALPHA任务拆解

    项目 内容 这个作业属于哪个课程 BUAA2020软件工程 这个作业的要求在哪里 作业要求 我们在这个课程的目标是 学会团队合作,共同开发一个完整的项目 这个作业在哪个具体方面帮助我们实现目标 团队任 ...

  4. welcome实现首页路由的重定向效果

    welcome实现首页路由的重定向效果 1.创建welcome组件 2.在路由中引入组件并配置子组件 3.在home.vue中添加路由占位符 4.测试

  5. [刷题] 237 Delete Nodes in a Linked List

    要求 给定链表中的一个节点,删除该节点 思路 通过改变节点的值实现  实现 1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(in ...

  6. 用python输出未来时间,递增

    输入当前时间,之前与之后的365天时间日期 按格式化输出 #!/usr/bin/evn python # -*- coding: UTF-8 -*- # import time import date ...

  7. sosreport命令 然后diff 正常的操作系统例如centos

    nux学习笔记:有用的linux命令  发表于 2018-06-25 |  分类于 linux|  字数统计: 1,269 |  阅读时长 ≈ 6 写在前面 这着笔记,整理一些网上搜集到有用的linu ...

  8. Docker——Jenkins + Git + Registry构建自动化持续集成环境(CI/CD)

    前言 在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD). 本文基于Jenkins+Docker+G ...

  9. shell应用之cobbler批量部署

    如果使用的是原始源,可直接使用该脚本,如果是用的其它源且有cobbler安装包的可删除脚本中的配置yum源步骤.批量部署使用的软件有:cobbler dhcp httpd tftp-server xi ...

  10. Lua _G

    1.全局变量的原形 在Lua中,要声明全局变量很简单,那就是定义变量的时候,前面不要加上local. 这个神秘的全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了 ...