80%的程序员都不了解的调试技巧

转载自   80%的程序员都不了解的调试技巧

程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上。甚至说不是在调试代码,就是即将调试代码。 :)

今天我们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些快速定位问题的方式。

看到这里的朋友,不要马上认为我标题党,再往下看看,如果你还有一些更好用的技巧,欢迎留言。

下面进入正题。

1 多线程调试

开发过多线程应用的朋友应该有体会,有些时候,为了观察多个线程间变量的不同状态,以及锁的获取等,就会想到在代码里加个断点debug一下。

在IDE里断点停下来的时候,可以切换到另外的线程中,跑其他的代码,不会互相影响。当然,这里是有个开关的,在Eclipse里默认开启,

但是在IntelliJ IDEA里默认是没有开启的。也就是说如果你在IDEA里代码里加断点,虽然一个线程的断了下来,但其他线程的已经执行过了。此处把线程的suspend设置成和Eclipse模式一样之后,也可以开始多线程应用的调试。简单设置可以直接在断点处,将suspend改成Thread

 

一个线程断下来之后,可以通过在线程窗口切换,到其它线程中继续运行。

IntelliJ IDEA里在这儿切换

 

我们看到main线程和pool-1-thread-1这两个线程都处于RUNNING状态,切换到任何一个都可以继续运行。

此时,就可以写一个多线程的应用,同时向ArryList这一类非线程安全的容器中存放内容,然后观察为什么他们是线程不安全的,会出现什么问题,生动又形象。

PS: 这里顺道说一下,这就是为什么创建线程时建议起一个有意义的名字,至少是可以识别的名字,否则在这里都不能区分出哪个是自己的线程,想切换还麻烦。

 

2 后退执行

这里所说的后退执行,是有些时候我们在debug代码时,懒的每个方法都进入单步调试,就会出现你观察一个变量值的变化时,某个方法没跟进去,结果值就变了,不得不重来一次

依靠后退执行的功能,可以后退,就像下棋时悔棋那种功能一样。当然,这个后退招待的名字是我自己起的,在IDE里被称为Drop Frame

 

有了这个功能,我们在Drop 了当前这个Frame之后,已经改变的变量值不会恢复。比如你向当前调用方法里传入了一个List,并且在方法中向List里添加了内容,那在Drop到调用该方法的地方时,List不会恢复到之前的状态。

但是在该方法再次被调用时,你可以观察List什么时候被改变的,至少不需要再重跑一遍程序了。甚至你可以一言不合就后退。

 

3 条件断点

为了调试代码,就需要在要观察变更的地方添加断点,然后小心翼翼的一步步执行。但是如果是在一个循环里,又或者该方法会被多线程同时调用到的时候,你小心的向下单步调试,发现没有你关心的内容,又从循环开始处跑下来,还是没你的内容,人就开始烦燥起来。

其实,在添加断点的时候,我们可以为断点增加一定的条件,这样,在指定的条件满足时,断点才会生效。

IntelliJ IDEA内,在断点上右击,会弹出如下图的条件框,输入指定的条件即可。

 

有了条件断点,不相关,不感兴趣的代码就可以直接跳过了。

 

4 片断代码

这个没想好用什么名字来表述。有些时候在调试过程中,忽然想招待一段与此相关,但不在源文件中的代码来观察一下,辅助进行问题分析。此时你会停止程序,添加代码然后重新跑一次吗?

在IDEA里有一个执行代码片断的功能,可以在当前代码的上下文内,执行你临时写的代码。

例如,当前方法传入一个List,但这个方法里少一个你后面条件需要使用到的元素,此时你可以临时使用片断代码执行的功能,添加一个进去。

注意,在IntelliJ IDEA里,这个上面红框,像个小计算器的按钮就是临时执行的功能,点击之后,会弹出按钮下方这个Evaluate Expression的框,输入代码,点击右下角的Evalute即可。返回值会显示在Result处。

 

这就就相当于临时改变了变量内容。

然后,还可以调用对象的方法,执行功能,获取属性值等。

 

 

5 查看变量修改值

每个IDE在调试代码时都提供了一个观察当前上下文变量值的窗口。其实除了查看之外,一些非final的基本类型,还可以直接在此处修改值。这样如果多次循环执行时,每次可以恢复到期望的值,不需要重启程序。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JDBCTemplate实现与Spring结合,方法公用 ——Emp实现类(EmpDaoImpl)

/** * Title: EmpDaoImpl.java * Package org.dao.impl * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-6-3 下午2:42:51 * version V1.0 */ package org.dao.impl;import java.io.Serializable; import java.util.Li…

复制vmware overLay网络无法ping通 ping www.baidu.com可以

因为忘记关闭防火墙了!!!!! 要永久关闭!! 修改hostname https://blog.csdn.net/qq_27327261/article/details/109100219 关闭防火墙 https://blog.csdn.net/qq_27327261/article/details/1…

2016.NET Core相关内容回顾

每一年的脚步的确是快,转眼间马上就2017。.NET Core 2014年宣布开源以来,在2016年发布了第一个版本,2017年将发布第二个版本,在这新年之际,我们回顾2016年,新的一年,带着理想和抱负继续出发。 1…

使用JDBCTemplate实现与Spring结合,方法公用 ——Spring配置(applicationContext.xml)

<?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"xs…

微服务化的数据库设计与读写分离

转载自 微服务化的数据库设计与读写分离 数据库永远是应用最关键的一环&#xff0c;同时越到高并发阶段&#xff0c;数据库往往成为瓶颈&#xff0c;如果数据库表和索引不在一开始就进行良好的设计&#xff0c;则后期数据库横向扩展&#xff0c;分库分表都会遇到困难。 对于…

centos7 切换中文输入法 无需安装

*************** 当你发现自己的才华撑不起野心时&#xff0c;就请安静下来学习吧&#xff01;***************

Consul 服务注册与服务发现

1. 服务注册 对 Consul 进行服务注册之前&#xff0c;需要先部署一个服务站点&#xff0c;我们可以使用 ASP.NET Core 创建 Web 应用程序&#xff0c;并且部署到 Ubuntu 服务器上。 ASP.NET Core Hell World 应用程序示例代码&#xff0c;只需要三个文件&#xff0c;Startup.cs…

Java Base64 编码解码方案总结

转载自 Java Base64 编码解码方案总结 Base64是一种能将任意Binary资料用64种字元组合成字串的方法&#xff0c;而这个Binary资料和字串资料彼此之间是可以互相转换的&#xff0c;十分方便。在实际应用上&#xff0c;Base64除了能将Binary资料可视化之外&#xff0c;也常用来…

babel基本使用

babel 转码器es6->es5 第一步 安装babel工具&#xff0c;使用命令,查看版本号 npm install --global babel-clibabel --version第二步 配置文件 .babelrc&#xff08;后缀名固定&#xff09; {"presets": ["es2015"],"plugins": [] }第…

tar (child): .tgz\r:无法 open: 没有那个文件或目录

Linux下运行bash脚本显示“: /usr/bin/env: "bash\r": 没有那个文件或目录 程序员小熊 2017-12-18 14:45:45 18395 收藏 7 分类专栏&#xff1a; Linux 版权 用 ./ 运行bash脚本文件出现 报错信息 /usr/bin/env: "bash\r": 没有那个文件或目录 错误原…

Entity Framework Core 1.1 升级通告

Entity Framework Core&#xff08;EF Core&#xff09;是一个轻量级的&#xff0c;可扩展和实体框架的跨平台版本。今天&#xff0c;我们宣布 Entity Framewor Core 1.1 正式可用了。 EF Core 和 .NET Core 遵循相同的发行周期。每2个月不断的改进和每6个月的新功能发布。这是…

聊聊微服务架构及分布式事务解决方案

转载自 聊聊微服务架构及分布式事务解决方案 分布式事务场景如何设计系统架构及解决数据一致性问题&#xff0c;个人理解最终方案把握以下原则就可以了&#xff0c;那就是&#xff1a;大事务小事务&#xff08;原子事务&#xff09;异步&#xff08;消息通知&#xff09;&am…

2014年JAVA省赛B组---第四题---大衍数列

【答案】&#xff1a; i % 2 0 public class TEST { // 奇偶数判断&#xff1a;x % 2 0public static void main(String[] args) {for (int i 1; i < 100; i) {if (i % 2 0) // 填空System.out.println(i * i / 2);elseSystem.out.println((i * i - 1) / 2);}}}

使用熔断器设计模式保护软件

作为软件开发人员&#xff0c;我们的生活是快节奏的&#xff0c;我们采用的是敏捷软件开发方法&#xff0c;迭代式的开发我们软件功能&#xff0c;开发完成提交测试&#xff0c;通过了QA的测试后被部署到生产环境&#xff0c;然后可怕的事情在生产环境里发生了&#xff0c;生产…

好的句子

"大概每个人都会遇到一个不能在一起的人&#xff0c;放手舍不得&#xff0c;坚持又太累&#xff0c;这样的爱而不得最是煎熬。" 你要去做一个懂事的大人&#xff0c;不要回头&#xff0c;不要难过。

hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice

最近在做项目中遇到一个简单的问题&#xff0c;但是解决了好久&#xff0c;问题就是投影查询。 先来看看出现的异常&#xff1a; java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice at cn.bdqn.guanMingSys.dao.i…

架构师之路:从码农到架构师你差了哪些

转载自 架构师之路&#xff1a;从码农到架构师你差了哪些 Web应用&#xff0c;最常见的研发语言是Java和PHP。 后端服务&#xff0c;最常见的研发语言是Java和C/C。 大数据&#xff0c;最常见的研发语言是Java和Python。 可以说&#xff0c;Java是现阶段中国互联网公司中&…

2014蓝桥杯-B-省赛-五-圆周率

【答案】&#xff1a;4 / (x - 1)) public class TEST {public static void main(String[] args) {double x 111;for (int n 10000; n > 0; n--) {int i 2 * n 1; //把i变为奇数x 2 (i * i / x);}// x21/xSystem.out.println(String.format("%.4f", 4 /…

Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题&#xff0c;就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现。SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字&#xff0c;它表明数据库中数…

mvc.net分页查询案例——PagedList

在.net中&#xff0c;除了人手动写分页类之外&#xff0c;微软还提供了官方的分页&#xff0c;分页工具类包括PagedList和PagerExtension&#xff0c;先来看看PagedList类里面是怎么写的&#xff1a; PagedList using System; using System.Collections.Generic; using Syste…