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

远程调试,以及Debug与info的区别

远程调试

远程调试:核心目的是将本地 IDE 连接到运行在远程服务器(或其他环境)上的 Java 进程,实时检查代码执行状态(如变量、调用栈、线程等)。

其中:

  1. IDEA 新增「Remote JVM Debug」配置

在 IDEA 中创建一个调试配置,用于连接到远程 ,使本地 IDE 能控制远程代码的执行流程(如设置断点、单步调试)。

  • Host:远程服务器地址(xx.com)。

  • Port:远程 JVM 的调试端口(如 10000,需与远程服务启动参数一致)。

  1. 远程连接

将本地 IDEA 调试器附加到远程 JVM,建立双向通信通道。

  • 确保远程服务已启动 Debug 模式

  • 在 IDEA 中启动调试

  1. Debug 模式改为「线程级别」

默认情况下,断点会挂起所有线程(All 模式)。

改为 线程级别(Thread) 后,仅挂起触发断点的线程,其他线程继续运行,避免阻塞整个应用。

如果本地代码与远程运行的代码版本不一致,调试时可能会出现:

  • 断点无法触发(行号不对应)。

  • 变量值显示错误(代码逻辑差异)。

断点模式:

全局断点(All):暂停所有线程(整个JVM卡住)

线程级断点(Thread):仅暂停当前触发断点的线程,其他线程正常执行

核心逻辑:

  1. 代码一致性

    1. 本地代码必须与远程服务运行的代码完全一致(相同分支、Commit ID、依赖版本)。

    2. 否则断点位置或变量状态可能对不上,导致调试失效。

  2. 运行状态分离

    1. 远程服务:实际运行的Java进程(承载真实流量或测试流量)。

    2. 本地IDE:仅作为调试控制器,通过Socket连接远程JVM,自身不运行服务。

  3. 调试能力

    1. 连接成功后,可以在本地IDE中:

✅ 设置断点(远程代码执行到对应位置时会暂停)。

✅ 查看远程服务的变量、调用栈、线程状态。

✅ 单步执行(Step Over/Into)、修改变量值(部分环境支持)。

  1. DEBUG(调试日志)

  • 用途:

    • 开发、测试阶段使用,用于详细追踪程序运行状态(如变量值、方法调用链、流程分支等)。

    • 帮助开发者快速定位问题。

  • 线上环境:

    • 通常关闭(不输出),因为会记录大量细节,影响性能且占用存储。

    • 只有在排查疑难问题时才会临时开启。

  • 示例:

logger.debug(); 

  1. INFO(信息日志)

  • 用途:

    • 记录程序关键运行节点(如服务启动、接口请求、业务操作完成等)。

    • 提供足够的信息用于监控和审计,但不会过于详细。

  • 线上环境:

    • 默认开启,长期保留,用于运维监控和问题回溯。

  • 示例:

 
logger.info("Order created, ID: {}", orderId); // 记录关键业务事件

区别

  1. 关键区别总结

特性DEBUGINFO
目的开发调试细节线上运维监控
日志量多(高频、详细)少(关键节点)
性能影响高(不推荐线上开启)低(适合线上)
保留策略非线上环境保留线上长期保留


  1. 实际开发中的建议

  • 遵循团队的日志规范,例如:

    • 开发时用 DEBUG 打印细节,但提交代码前检查是否误提交了敏感的 DEBUG 日志。

    • 线上环境通过日志框架(如 Logback、Log4j)配置只输出 INFO 及以上级别(如 WARN, ERROR)。

  • 避免滥用 INFO

    • 不要将调试信息打印到 INFO(如循环内的详细数据),否则会污染线上日志。


  1. 日志级别常见顺序

从低到高(详细 → 严重): DEBUGINFOWARNERRORFATAL

线上环境一般设置 INFOWARN 作为最低级别,过滤掉 DEBUG

近日总结:

哦,杭州,感觉这个城市有点克我,刚来第一天,两年没碎过的手机屏幕多了条缝。

本来还挺期待,杭州的饭菜应该得是偏清淡的,毕竟离嘉兴这么近,没想到,清淡不了一点。

口腹之欲大大降低......

这里的物价也挺高。

房东也挺坑,房价也高,还有这梅雨季,到底是谁在喜欢梅雨季啊,哦,是学长,应该只是来旅游摄影的,所以颇为喜爱吧。

但真的住在这里之后,喜欢不了一点,不喜欢这发霉的天气。

http://www.lryc.cn/news/572361.html

相关文章:

  • OpenCV——直方图与匹配
  • OpenGL ES 设置光效效果
  • 输入url之后发生了什么
  • c++ STL---vector使用
  • 为什么 C++ 11 引入了 `nullptr`
  • day037-openssh服务与http协议
  • 2025实时数据同步:多平台商品信息接口的高效更新技术解析
  • jquery 赋值时不触发change事件解决——仙盟创梦IDE
  • Python——PyQt5初体验
  • LVS 负载均衡群集
  • LeetCode | 二分法题型详解+图解
  • bos_token; eos_token; pad_token是什么
  • QSqlDatabase: QSQLITE driver not loaded
  • infinisynapse 使用清华源有问题的暂时解决方法:换回阿里云源并安装配置PPA
  • LoRA 浅析
  • Python Beautiful Soup 4【HTML/XML解析库】 简介
  • StableDiffusion实战-手机壁纸制作 第一篇:从零基础到生成艺术品的第一步!
  • Hexo 个人博客配置记录(GitHub Pages + Butterfly 主题 + Waline 评论 + 自动部署)
  • Kernel K-means:让K-means在非线性空间“大显身手”
  • 职坐标IT培训:嵌入式AI物联网开源项目精选
  • 基于大模型的急性结石性胆囊炎全流程预测与诊疗方案研究
  • 【图像处理入门】11. 深度学习初探:从CNN到GAN的视觉智能之旅
  • 跟着AI学习C# Day22
  • 实时输出subprocess.Popen运行程序的日志
  • 永磁同步电机无速度算法--基于正切函数锁相环的滑模观测器
  • 【鸿蒙HarmonyOS Next App实战开发】​​​​ArkUI纯色图生成器
  • VACM 详解:SNMPv3 的访问控制核心
  • 回溯----8.N皇后
  • C++ std::set的用法
  • 根据图片理解maven