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

简介: 作为程序大家都知道,写代码和调试的时间是差不多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


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


目录
相关文章
|
1月前
|
Web App开发 前端开发 JavaScript
前端开发必备神器大公开,用过的人都哭了:效率翻倍不是梦!
前端开发结合了创意与技术,本文介绍了几个提升开发效率的工具:Visual Studio Code、Webpack、Postman、GitHub 和 Chrome DevTools。这些工具分别在代码编辑、模块打包、API 测试、版本控制和网页调试等方面发挥重要作用,帮助开发者提高工作效率,优化项目管理。
34 4
|
4月前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
67 1
|
4月前
|
并行计算 编译器 C#
"CMake高手进阶秘籍:解锁高级技巧,实践最佳策略,让你的项目构建如丝般顺滑,效率飙升!"
【8月更文挑战第11天】CMake是现代软件开发的关键构建系统,其跨平台与灵活配置特性简化了复杂项目的构建流程。本文探讨CMake的高级技巧与最佳实践,包括升级至最新版本以利用新功能;采用面向目标的编程方法,增强项目清晰度与可维护性;运用CMake预设统一多平台构建配置;掌握调试技巧快速定位问题;集成代码检查与格式化工具保障代码质量;以及启用并行构建提升构建效率。通过这些策略,开发者能够更高效地管理大型项目。
87 3
|
4月前
|
Rust 搜索推荐 测试技术
揭秘Rust性能极限!从菜鸟到高手的蜕变之路:深入剖析性能分析与调优的隐秘技巧
【8月更文挑战第31天】Rust凭借卓越的性能、内存安全性和并发支持,成为高性能系统开发的首选语言。本文详细介绍Rust的性能优化流程,涵盖从基础分析到高级调优的技巧,并通过示例代码展示具体操作。内容包括理解Rust的性能优势、常用性能分析工具(如Cargo Bench、Valgrind和perf)、基准测试示例以及优化技巧,如减少内存分配、利用并发模型、优化数据结构和避免过度抽象。通过持续优化与迭代,开发者可充分发挥Rust的潜力,提升程序性能。
221 0
|
4月前
|
Java 数据库连接 缓存
Hibernate性能调优:五大秘籍,让应用效能飙升,告别慢如蜗牛的加载,体验丝滑般流畅!
【8月更文挑战第31天】本文深入探讨了提升Hibernate应用性能的五大技巧,包括选择合适的缓存策略、优化查询语句、合理使用Eager与Lazy加载、批量操作与事务管理以及利用索引和数据库优化。通过正确配置多级缓存、分页查询、延迟加载、批量处理及合理创建索引,能够显著提高应用响应速度与吞吐量,改善用户体验。这些技巧需根据具体应用场景灵活调整,以实现最佳性能优化效果。
219 0
|
4月前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
88 0
|
7月前
|
缓存 算法 JavaScript
性能调优太差,阿里P8都看不过甩给我一份Java性能调优PDF,真香
为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了?也许,你经常会抱怨这些问题。如果是这样,那说明你的程序出了性能问题。和功能性问题相比,性能问题在有些情况下,可能并不算什么太大的问题,将就将就,也就过去了。但是,严重的性能问题会导致程序瘫痪、假死,直至崩溃。
|
设计模式 运维 Java
硬核!阿里P8耗时3月撰写700页性能优化笔记:程序优化提升了7倍
前言 在我看来,Java性能优化是Java进阶的必经之路,性能优化作为Java工程师必备的一种技术,一直热度不减。 Java是目前软件开发领域中使用最广泛的编程语言之一。Java应用程序在许多垂直领域(银行、电信、医疗保健等)中都有广泛使用。帮助开发者通过专注于JVM内部,性能调整原则和最佳实践,以及利用现有监测和故障诊断工具,来提升应用程序在商业环境中的性能。
|
人工智能 JSON 缓存
身为程序员,你有哪些提高写代码效率的黑科技?
身为程序员,你有哪些提高写代码效率的黑科技?