当前位置: 首页 > news >正文

idea debug

在调试代码的过程中,为了更好的定位及解决问题,有时候需要我们使用远程调试的方法。在本文中,就让我们一起来看看,如何利用 IntelliJ IDEA 进行远程 Tomcat 的调试。

首先,配置remote:

1

如上图所示,点击Edit Configurations,进入如下界面:

2

如上图所示,我们进入了Run/Debug Configurations界面,然后点击左上角的+,选择Remote:

3

  1. 标注 1:运行远程 JVM 的命令行参数;
  2. 标注 2:传输方式,默认为Socket;
  3. 标注 3:调试模式,默认为Attach;
  4. 标注 4:服务器 IP 地址,默认为localhost,需要修改为目标服务器的真实 IP 地址;
  5. 标注 5:服务器端口号,默认为5005,需要修改为目标服务器的真实端口号;
  6. 标注 6:搜索资源是使用的环境变量,默认为<whole project>,即整个项目。

如上图所示,其中 标注 2 和 标注 3 又分别有两种分类,对于 标注 2,

标注 2:传输方式,默认为Socket;

  1. Socket:macOS 及 Linux 系统使用此种传输方式;
  2. Shared memory: Windows 系统使用此种传输方式。

对于 标注 3,

标注 3:调试模式,默认为Attach;

  1. Attach:此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;
  2. Listen: 此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。

然后,复制 标注 1,即 IntelliJ IDEA 自动生产的命令行参数,然后导入到 Tomcat 的配置文件中。以 Linux 系统为例,导入语句为:

 

复制代码代码如下:

export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

 

 

如果是 Windows 系统,则导入语句为:

 

复制代码代码如下:

set JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

 

 

两者的区别在于导入语句的关键字不同以及有无引号,Linux 系统的导入关键字为export,Windows 为set;Linux 的导入值需要用单引号''括起来,而 Windows 则不用。

接下来,修改 Tomcat 的 bin 目录下的catalina.sh文件(如果是 Windows 系统则修改catalina.bat文件),将上述的导入语句添加到此文件中即可:

4

至此,IntelliJ IDEA 远程调试 Tomcat 的配置已经完成了,调试的后续步骤按正常的调试技巧进行就可以啦!

+++++ 题外话:我是一个大彩蛋 +++++

在这里,我们假设服务器的 IP 地址为10.11.12.39,端口号为16203,设置完成后,进入Debug模式,如果连接成功,则会出现如下提示:

5

此外,如果我们是跨多个系统进行调试,则只需要在想要调试的系统中配置Remote,打上断点,启动Debug模式,然后在服务开始的地方执行程序即可进入到我们设置的断点。而且,如果我们在本地配置Remote并关联到某个 Tomcat,在Debug模式下,所有涉及到断点所在代码的功能,都会进入我们设置的断点。

例如,对于服务器上的 Tomcat A,多个系统都用到了这个 Tomcat,如订单子系统、账户子系统、路由子系统等,并且多个系统间互相调用,如订单子系统调了账户子系统,账户子系统又调了路由子系统,则当我们在这三个子系统中配置Remote并在对应的代码(如在订单子系统中查询商户的账户信息,则调到账户子系统;在账户子系统中又通过路由子系统调到其他底层服务查询商户的账户余额等)上打上断点,启动Debug模式之后,通过单元测试或者页面操作触发订单子系统中的查询商户的账户信息功能,则会依次进入到在上述三个子系统中设置的断点。

此外,在我们配置完远程调试之后,就算别人启动相关服务,也会进入到我们的断点,而且会受到我们设置的断点的影响,只有在我们执行完测试之后,服务才会继续执行下去。最后,远程调试的功能真的很强大,善用远程调试,远离 Bug!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

转载于:https://www.cnblogs.com/albert-think/p/10147730.html

相关文章:

  • 关于XML文件
  • SQL自动流水号函数
  • NOI2018屠龙勇士(扩展CRT + splay(multiset))
  • 4 Redis 配置文件介绍
  • 定时任务Cron常用表达式与在线生成器
  • str()函数
  • Codeforces 1087C Connect Three (思维+模拟)
  • 网络图片转换到本地并转换成base64位
  • 最新最全 中文版Pycharm 2017安装教程 Python编译器安装(小白教程)
  • Spring事务管理要点总结
  • flask实现基于elasticsearch的关键词搜索建议
  • MySQL binlog group commit--commit stage
  • 返回多个值的摘要函数
  • 解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题
  • 网络流-一江春水向东流
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • angular2 简述
  • angular学习第一篇-----环境搭建
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • vue 个人积累(使用工具,组件)
  • Windows Containers 大冒险: 容器网络
  • yii2中session跨域名的问题
  • 仿天猫超市收藏抛物线动画工具库
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 你真的知道 == 和 equals 的区别吗?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 为视图添加丝滑的水波纹
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在Docker Swarm上部署Apache Storm:第1部分
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​【已解决】npm install​卡主不动的情况
  • # Apache SeaTunnel 究竟是什么?
  • #include<初见C语言之指针(5)>
  • #pragam once 和 #ifndef 预编译头
  • #pragma once与条件编译
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (LeetCode C++)盛最多水的容器
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (转) Face-Resources
  • (转)四层和七层负载均衡的区别
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • **CI中自动类加载的用法总结
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Redis的秒杀Dome和异步执行
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET处理HTTP请求
  • .NET命令行(CLI)常用命令
  • .Net中ListT 泛型转成DataTable、DataSet
  • .net中的Queue和Stack
  • .pyc文件是什么?
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序