先学会这些调试技巧,再写代码,效率提高十倍。吐血整理!

简介: 作为程序大家都知道,写代码和调试的时间是差不多9:1,也就是说90% 的时间大家都在调试代码,怎么样才能最快的发现bug?

作为程序大家都知道,写代码和调试的时间是差不多9:1,也就是说90% 的时间大家都在调试代码,怎么样才能最快的发现bug?


调试是开发中最重要的解决问题的方法,在开发中也看到很多同事只会简单的使用调试,因此写下这篇文章。正所谓 工欲善其事必先利其器,好的调试技巧让你在开发中如鱼得水。


调试从大的方面来讲主要是本地调试 和远程调试。本地调试就是在本地使用IDE的debug按钮启动项目,


远程调试一般是指调试其他机器上的程序。下面从这两个方面分开讲一下。因为我开发中使用的是idea,所以下面的实例和截图都来自idea。调试的技巧是一样的,用eclipse的同学可以自己迁移到eclipse上。


1、断点分类

8fc6d556a4554caba56974460c31a797~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

  1. 行断点


顾名思义,行断点就是在代码的左边单击,红色的圆点就代表断点成功,在代码运行到这一行的时候会触发。


  1. 方法断点


方法断点就是断点在方法签名上,在调用这个方法时会触发断点。如上图菱形红点


  1. field断点


字段断点就是在字段的定义的地方加断点,任何访问或者写入的地方都会触发断点。


  1. 异常断点


异常断点在debug视图下,点击两个小圆点,打开断点界面,然后点击“+”号,选择Java Exception Breakpoints,输入你想断点的异常名字。比如常用的NullPointerException,只要程序运行的时候抛出这个异常,都会触发断点。


ad3c6d4e15b247e4a18a9a14a8c9c9c0~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

2、管理断点

82791ad7cc6b4f20825b00a110be585c~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

  1. 点击图中1位置,为取消所有断点,也就是所有的断点都不触发。


  1. 点击图中2的位置,打开断点管理界面,勾选断点则代表断点起作用,不勾选则表示不起作用。

e80c8bea55694e3b92f46aab22817a7d~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

3、条件断点


条件断点太牛了,前面的断点每个写代码的应该都知道,是入门的。这部分是今天的重点,也是精华所在。


1.Enable 断点是否起作用,没什么可讲的,一般的时候会启用。


2.Suspend 挂起。后面有两个选项,选项All表示暂停当前应用的所有线程,Thread表示挂起当前正在运行代码的线程。一般在调试多线程的时候,选择thread,这样不会影响其他的线程,可以调试多线程问题。


3.Condition 懂点英文的都知道这个单词的意思,条件。这一部分的核心。


当勾选了这个选项时,会运行Condition框内的代码,只能返回true 或者false。当为true时会触发断点。false的时候则不触发。条件输入的时候可以使用当前上下文的代码。如下图中,i== 1 就是条。,当i = 1时断点会触发。在调试的时候可以断点特定情况下的问题。也是最常用的功能。


8ea2aa35e82f413593174cc14ac91f48~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


4.Log 也很简单——日志,也就是断点时执行Evaluate and log 内的代码,在代码框内你可以调用日志系统或者直接控制台打印,避免修改代码打印输出,如果你只想打印,不想挂起线程,可以把Suspend取消,这样断点只会触发,不会将应用暂停。如果勾选stack trace 会打印调用堆栈,可以看到断点的触发来源。是不是很赞?


389e0ec32086405aa04bd75d148ce511~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


5.remove once hit 很简单,如果断点触发过一次,下次就会自动失效删除。


6.Disable until hitting the following breakpoint 这个选项的意思就是直到下面选中的的断点触发时才会触发激活当前断点,主要是为了调试顺序。可以选中已经打的断点。


7.after hit 断点触发之后的操作,继续不可用,或者一直可用,看需求。


8.instance filter 勾选之后,只有输入的instanceId 运行到代码才会触发,用处不大。因为首先你要知道instance id。这个是运行时观察变量区@后面的id。


9e17c9cb6a9e430db3251251e7ccc9fd~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

9.class filter 过滤类,只有特定的类才会断点。不常用。


10.pass count  运行多少次之后触发断点,一般用在循环内,特定次数之后触发断点。常用。避免查看不想看的循环代码。


11.caller filter 调用者过滤。只有某个方法调用的时候才会触发。针对一个方法被多个地方调用,但是只想断点个别的调用的时候。这个虽然看起来比较好用,但是比较坑的是需要输入方法的全签名,可以使用条件断点解决的尽量不使用这个。类似:org.pdool.reflect.Player.addString(Ljava/lang/String;)V,如下图:


f3c7d27f913441c3a694cecc2c68c6a8~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

4、技巧


  1. drop frame 回退堆栈。


在开发中,和客户端调协议的时候,有时候客户端操作了一下,断点到了,但是有些变量没注意到,这个时候可以保持断点,然后到Frames选中想要重看的函数,右键 drop frame。可以回退堆栈,重新运行一次函数。在使用的时候要注意,上一次已经修改了的全局变量,无法回滚。


8ce7444d99764114937f8db5a4a42647~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

  1. alt + f8 运行时计算


         在运行到一段断点代码的时候,想看一下其他变量的值,可以使用这个快捷键。当然也可以使用这个方式修改内存的值。比如 this.setName(" 香菜"),只要你输入的代码不报错都可以。

0aeba9fb34f34b7fbbc06cc8be06459b~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

3.修改变量值


在调试的时候有些特殊条件不好出现,但是又想观察特殊条件下的程序行为,这个时候就可以通过修改变量,调整代码运行流程。

8ea2aa35e82f413593174cc14ac91f48~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

选择需要修改的变量,右键setValue 或者F2,输入需要修改的值,回车即可,这样对象的值就会被修改。这种修改是影响对象的整个生命周期的。


4.移动断点


选择断点,然后按住alt ,鼠标拖动断点,就可以移动断点的位置,整个断点的属性都会迁移。完美!


5.热更新


热更新就是在应用不重启的情况下将新改的代码应用。有以下限制:


1.函数参数格式不能修改。


2.不能为类添加函数。


3.不能为类添加变量。


4.只能修改函数内部的逻辑。


5.不能减少类的方法。


修改完代码之后,可以 ctrl + shift + F9,热更代码,在信息栏能看到更新成功,并且更新了几个类。


这个是在开发中很常用的功能,省去了一直重启的痛苦。

c057b73941d444d3b4037fed1c5e57ed~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp (2).jpg

5、远程调试


当代码部署到测试服的时候,有些测试问题会爆出来,但是本地没有,或者因为数据环境,或者因为账号的特殊问题。这时候想要调试。远程调试出场的机会到了。


想要远程调试,第一步 首先必须在远程应用上打开调试端口,加入启动命令中,然后启动应用。


-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
复制代码


第二步 在本机中,idea中,运行-->Edit Configurations --> +号 -->在下拉列表中选择Remote,然后输入远程机器的ip 和 启动的端口。


第三步 远程代码和本地代码连接成功之后,就可以和调试本地代码一样了。

c80a2811f79d443294ed92125cdc5a8d~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


你还知道哪些调试技巧,记得留言给我。


目录
相关文章
|
5月前
|
数据挖掘 Python
🚀告别繁琐!Python I/O管理实战,文件读写效率飙升的秘密
在日常编程中,高效的文件I/O管理对提升程序性能至关重要。Python通过内置的`open`函数及丰富的库简化了文件读写操作。本文从基本的文件读写入手,介绍了使用`with`语句自动管理文件、批量读写以减少I/O次数、调整缓冲区大小、选择合适编码格式以及利用第三方库(如pandas和numpy)等技巧,帮助你显著提升文件处理效率,让编程工作更加高效便捷。
72 0
|
3月前
|
Web App开发 前端开发 JavaScript
前端开发必备神器大公开,用过的人都哭了:效率翻倍不是梦!
前端开发结合了创意与技术,本文介绍了几个提升开发效率的工具:Visual Studio Code、Webpack、Postman、GitHub 和 Chrome DevTools。这些工具分别在代码编辑、模块打包、API 测试、版本控制和网页调试等方面发挥重要作用,帮助开发者提高工作效率,优化项目管理。
42 4
|
6月前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
129 0
|
9月前
|
消息中间件 缓存 监控
阿里P8整理的《百亿级并发系统设计》实战教程,实在是太香了
说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥有高并发经验者优先。
|
9月前
|
缓存 算法 JavaScript
性能调优太差,阿里P8都看不过甩给我一份Java性能调优PDF,真香
为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了?也许,你经常会抱怨这些问题。如果是这样,那说明你的程序出了性能问题。和功能性问题相比,性能问题在有些情况下,可能并不算什么太大的问题,将就将就,也就过去了。但是,严重的性能问题会导致程序瘫痪、假死,直至崩溃。
|
设计模式 运维 Java
硬核!阿里P8耗时3月撰写700页性能优化笔记:程序优化提升了7倍
前言 在我看来,Java性能优化是Java进阶的必经之路,性能优化作为Java工程师必备的一种技术,一直热度不减。 Java是目前软件开发领域中使用最广泛的编程语言之一。Java应用程序在许多垂直领域(银行、电信、医疗保健等)中都有广泛使用。帮助开发者通过专注于JVM内部,性能调整原则和最佳实践,以及利用现有监测和故障诊断工具,来提升应用程序在商业环境中的性能。
|
传感器
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
|
编译器 C++
还在因为写项目函数太多而烦恼?C++模板一文带你解决难题
还在因为写项目函数太多而烦恼?C++模板一文带你解决难题
|
IDE Linux 调度
看完这篇文章,我再也不用担心线上出现 CPU 性能问题了(下)
在上一篇文章中咸鱼给大家介绍了 CPU 常见的性能指标,当生产环境出现 CPU 性能瓶颈的时候,优先观察这些指标有没有什么异常的地方,能解决大部分情况

热门文章

最新文章