写点什么

这样 Debug,排查问题效率大大提升...

作者:程序知音
  • 2022 年 9 月 23 日
    湖南
  • 本文字数:1913 字

    阅读完需:约 6 分钟

Debug 是开发人员必备的基础技能,伴随着开发生涯,只要需要写代码,就一定有 debug 的诉求... 因为大部分开发同学都是用 Debug 来确认程序是不是预期进行(单元测试也可以)。

Debug 一个非常常见的我们以为自己已经熟练掌握的技能,有点像说话一样,每个人都可以把话说出来,但不是每个人都能表达出影响力...

大家都会 Debug,不过有些 Debug 的方式可能确实会效率更高一些,还是直接进入主题吧;

开始 Debug

相信大家都知道如何开始 Debug: 1、在 Idea 的某个程序文件的目标行旁边,点击一下,设置个小红点。 即断点 


2、使用 Debug 按钮运行程序,如果程序可以走到断点这里,就开始进入 Debug 模式。 


3、基本操作就是:

  • step in 进入方法内部

  • step over 直接执行到下一行

  • step out 跳出当前的方法

重复 1,2,3 步骤,刚开始调试的时候主要就是这几个步骤;

下面分享一下一些稍微隐藏一点的调试方法。

断点相关经验

只有满足某些条件才会进入断点

如果说 Debug 的位置是网关入口,那么流量会很大,各种类型的请求都会走到这个断点里面,如果不能按照条件进入断点,会非常影响我们的效率。

因为进入断点的请求,都不是我们想要的;这个时候可以对断点设置条件,当前请求中必须有满足什么条件才会进入 Debug 模式。

1、点击程序的目标行旁边,生成一个小红点; 2、右键小红点,可以在 condition 那里设置程序中的条件; 


举个例子,如下当用 Debug 运行的时候,是不会走到断点的。 


而且在设置完成断点条件后,断点旁边会多出一个?和普通的断点不同。 


Debug 断点只生效一次,同时不阻塞系统

如果说 Debug 某个正在运行的系统,默认情况下会挂起所有的后续请求,很多人都以为系统死机了... 其实最后发现是你在调试。

有什么办法,可以在调试的时候不阻塞剩余的请求吗?1、默认只断点一次; 2、断点的时候不挂起整个系统;

如下,通过断点管理器器,进入进来,或者右键断点,然后点击 more 可以进入进来 设置挂起选项,只挂起当前正在调试的线程,然后再下面勾选一旦命中移除断点。




静态断点,只是想看程序会不会运行到这里来(类似于动态日志)

想确定请求能不能走到某个位置,但是又不想进入 debug 模式,感觉太重了,能不能如果经过这一行就直接打个日志呢?

这对于有时候程序的一些方法没有打日志,但是又想确认是不是能执行到这里有帮助。

在断点配置里面勾选,命中后打日志,也可以自己加一些其他的输出:

  • 不要挂起程序

  • 命中处打日志


 


分组管理断点(系统不同链路的断点)

系统常用的链路主要就几条,而常调试问题的地方也只有几处,可以把这几处位置的断点管理起来,在遇到问题的时候直接把断点分组管理拿出来就可以了。



远程服务器 Debug

这里主要是一个配置问题,和本地 Debug 区别不大,学会配置就好了。 启动程序的时候:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar 待发布的程序 jar 包名称.jar

在 Idea 里面: 


调试相关经验

程序已经进入断点了,这个时候要查问题了,有一些需要了解的吗。

快速执行到某个位置

有时候我们的断点没有设置在某个位置,但是也不想设置在哪个位置; 在 Debug 的时候想让程序直接运行到那个位置,怎么处理?

第一种方式: 鼠标移动到对应的行数,然后按下 run to cursor 按钮 


第二种方式:直接点击文件旁边的数字即可,运行到对应的行哪里 


回退重新开始执行

在一些复杂的链路中,方法调用很长,手一抖结果代码又运行了几行,这个时候想去重新开始执行这个断点怎么办?

常规操作是再模拟发出个请求,重新进入断点; 但其实 Idea 已经提供了对应的方式,直接撤回当前的帧即可,断点会重新进入方法开始执行。

在 Frame 的位置点击撤回按钮,就会重新进入这个方法开始运行



中断后续执行链路

如果说 debug 到一半发现可能会往数据库写入脏数据,想直接停止当前的调试,怎么做?

同样在帧的位置,右键,可以提前返回不继续运行,这个提前返回是针对当前的方法的,也可以直接抛出异常; 


调试 Strem 流

Java8 之后的 labmda 表达式里面一般流程会多一点,也不是很好调试,Idea 也有对应的工具,可以直接查看 Strem 流中的数据,在 Debug Window 下发,如果识别到 labmda 表达式后会展示出来。


 


断点的时候运行一些额外代码

在 Debug 模式下,Idea 提供了一个类似于解释器的工具,可以输入一些额外的程序在运行,哪怕和本次 debug 无关;

当然有个店是这个表达式执行只会返回最后 y 一行语句的结果。


 


总结

  1. debug 代码是一个常用而且很常见的技能,但是不是每个人都能很有效率的 debug 代码...

  2. 有一些 idea 隐藏的 debug 方式,虽然一些人不关注,但是有用并且能极大提升效率

  3. 文章主要介绍一些一些在实际项目中相对有用的可以提升 debug 能力的一些经验。最后如果说实在是有问题,但是又没办法进入调试模式,可以考虑 arthas 的 trace 和 watch。

希望能对大家有所帮助.

用户头像

程序知音

关注

还未添加个人签名 2022.06.25 加入

还未添加个人简介

评论

发布
暂无评论
这样Debug,排查问题效率大大提升..._程序知音_InfoQ写作社区