关于Debug和本文

Debug,意为“调试”,是程序员必备技能之一。

Debug开始用的时候还是很不习惯的,需要适应,本文面向新手介绍Debug相关内容。

Debug的三种手段

  • 断点(breakpoint)

    • 打上断点以后,程序运行到断点处就会暂停,可以一步一步观察运行情况。
  • 跟踪(trace)
    • 跟着流程一步一步走,看看程序代码的执行流程。
    • 跟着流程一步一步走,看看变量动态的变化情况。
  • 监视(watch)
    • 即时监视:鼠标指向变量。
    • 快速监视:点右键,Inspector。
    • 添加监视:点右键,Watch。

IntelliJ IDEA

最简单的程序

先随着一个最简单的程序看IDEA的Debug流程。

我们选择一个1+2+…+10的程序,我们通过这个最基本的程序了解如何去Debug。
IDEA我个人比较喜欢用F8来逐行运行观察,发现问题再追踪。

在标注行数的左边栏的空白处,点一下,会出现一个红点,带出一条红线,这叫断点(IDEA的断点真的比Eclipse好看和便于增删)。

打断点的目的是使程序Debug运行到这里的时候会停住,我们能逐步地观察变量的变化、程序语句执行的流程等等。

根据我的观察,其实对于初学者,需要测试的部分中一个方法打一个断点就够了,因为一直按F8就会继续逐行执行,希望我这么说会比较容易接受一些。

右键Debug运行,注意不要Run,Run的话断点就无效了。

开始运行后,可以看出程序停在了打断点的那一行处,并且有很多灰色的k-v对,下方的Variable栏就会出现各种变量的值,可以追踪各个变量的当前值和值的变化。

按F8就可以继续执行。

Variable栏中蓝色的变量表示刚刚被修改过:

运行结束,得到结果:(事实上如果真有Bug,能发现的话在过程中就发现了)

不断的输入

我们可能需要命令行输入很多数据,有时候我们选择复制后一股脑输入Debug的Console中,但很多时候我们输入几个值并按回车就自动进入了Debug。而Debug运行到需要IO的地方就会阻塞,那么怎么去增加新的输入呢?

先输入10,然后回车:

程序跳到上面讲过的Debug界面:

顺着执行,会被IO卡住,那怎么办呢?点击Console,切到Console界面:

输入新的值,回车:

这次就不是自动切回去了,需要点击下方的Debugger:

程序继续执行:

Console识别在一次IO后就切Debugger,所以比较省事的做法是,第一次就把所有的数据输进去。

中断Debug

想中断Debug就和中断Run一样,左边栏的红色方框,点一下就能结束。

多方法打断点

下面的代码除了main()外还有一个多行的方法被调用,如果我们在for那里打上断点能不能进入function()呢?

public class PlusTest {private static int function(int num) {int sum = 0;for (int i = 1; i <= num; i++) {sum += i;}return sum;}public static void main(String[] args) {int sum = 0;int num = 10;for (int i = 1; i <= num; i++) {sum += function(i);}System.out.println(sum);}}

从这个时候开始观测(只有这一个断点):

下一步:

下一步:

我们发现,并没进入function(),这怎么办呢?

当然是把function()也打上断点:

接着走下去:

下一步:

哇偶,进去了!我们可以在function()方法里继续观察变量的变化了。

递归函数的Debug

递归的话有明显的回溯感,特别是对于二叉树递归算法,要是打断点会感觉一会儿前进一会儿回溯。

要把握清楚到底在哪个子过程中递归,看准变量的变化。

这里也不拿很复杂的递归函数说事了,就说说阶乘递归函数吧:

public class PlusTest {private static int function(int num) {if (num == 0 || num == 1) {return 1;}return num * function(num-1);}public static void main(String[] args) {int num = 10;System.out.println(function(num));}}

向下分解问题、递归:

递归到终止条件了:

到达递归终止条件后,就开始一步步弹出栈、形成答案了:

输出结果:

Eclipse

左边小圆点是断点,左键单击可标注:

右键选择Debug运行:

会提示选择进入Debug的模式,一定要进去,点Switch:

左边有调用栈的信息,右边有变量表、断点表等信息,中间是代码,下面是Console:

这里提示全部的断点,不用的时候别忘了取消:

递归回溯的时候,左边调用栈瞩目:

按F6就像IDEA的F8一样啦,一行一行执行;而F5的话还能追溯调用栈找到源码,甚至可用来阅读源码 :

鼠标移到变量上还能直接看变量的值和状况:

右上角的小Bug图案,右键点击,选择Close即可退出Debug样式、返回普通模式:

Eclipse和NetBeans的Debug比较

功能描述 Eclipse NetBeans
逐语句执行 F5 F7
逐过程执行 F6 F8
跳出函数 F7 Ctrl+F7
运行到光标处 Ctrl+R F4

【Java】带你走进Debug的世界相关推荐

  1. 【密码学】一万字带您走进密码学的世界(下)

    引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 在<一万字带您走进密 ...

  2. 【密码学】一万字带您走进密码学的世界(上)

    引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 为了使读者对密码学有一个整 ...

  3. 带你走进rsync的世界

    导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...

  4. 冷链冷库|果蔬保鲜储藏冷链冷库 海格里斯带你走进果蔬冷库世界

    冷链行业涵盖冷冻加工,冷藏贮藏,冷链运输和冷链销售全过程.冷链行业的主要设施包括冷库或低温物流中心.生鲜食品加工中心(包括中央厨房).冷藏运输车.超市陈列柜等.而冷链行业景气度的提升则会带动冷库,冷藏 ...

  5. 轻松带你走进shiro的世界

    2019独角兽企业重金招聘Python工程师标准>>> 1.10分钟带你轻松入门shiro Shiro是apache旗下的一款轻量级的Java安全框架,它可以提供如下服务: Auth ...

  6. vLive带你走进虚拟直播世界

    虚拟直播是什么? 虚拟直播是基于5G+实时渲染技术,在绿幕环境下拍摄画面,通过实时抠像.渲染与合成,再推流到直播平台的一种直播技术.尽管这种技术早已被影视工业所采用,但在全民化进程中却是困难重重,面临 ...

  7. 带你走进服务器的世界看个明白

    第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听 还要动手记,勤思考,多交流甚至尝试着去教会别人 第2章 服务器 2.1 运维的基本职责: 网站的数据不能丢 网站7*24小时运行 ...

  8. 一步一图,带你走进 Netty 的世界!

    作者 | SessionBest 来源 | https://cnblogs.com/sessionbest/p/9000727.html 点击领取DD带来的高端机械键盘.AirPods.天猫卡等专属福 ...

  9. 一篇小文带你走进RabbitMQ的世界

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 说到消息中间件,大部分人的第一印象可能是Kafka.毕竟Kafka自问世以来,就顶着高并发,大流量 ...

最新文章

  1. VS 打开No EditorOptionDefinition export found for the given option name问题解决
  2. Pthread:POSIX Threads Programming
  3. scala maven plugin
  4. python使用rabbitMQ介绍五(话题模式)
  5. 程序员过关斩将--论系统设计的高可扩展性
  6. 关于本人在多个技术平台发布文章的声明
  7. linux ip addr peer,CentOS 7 设置网络IP地址
  8. 第6章 面向方面编程
  9. php限制密码输入错误次数,js密码输入错误指定次数禁止输入
  10. libevhtp介绍与demo构建
  11. maven部署项目到tomcat8中
  12. 反编译获取任何微信小程序源码(完)
  13. Exif的Orientation信息说明
  14. 电脑各个硬件的理论知识 经典
  15. 图像特征点检测与匹配评价——量化指标
  16. loop variable ‘numerator‘ creates a copy from type ‘const std::string‘ [-Wrange-loop-construct]
  17. 手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习
  18. 天猫精灵 python 控制_树莓派4B小爱同学、天猫精灵、智能音箱、百度语音极速版、百度语音标准版、语音识别、语音合成终极方案...
  19. 完整数字华容道05:游戏结束
  20. 电子工程师必备(电子书版3本全):

热门文章

  1. vscode格式化关于符合eslint检测语法配置
  2. 微信小程序开发之普通链接二维码
  3. phpstorm xdebug配置
  4. GeoPoint与LocationData
  5. nginx+tomcat7+memcached
  6. Kubernetes 创建pod一直处于ContainerCreating 状态解决过程
  7. java 异或_Javase第一部分:操作符的使用(按位异或运算)(含视频讲解)
  8. 意大利_【解读】去意大利留学,一定要学意大利语吗?意大利语难吗?
  9. mycat 分表子查询_还不懂MyCat?一文带你深入剖析,实现MySQL读写分离
  10. c语言保存后怎么打开文件,保存打开文件之后,怎么也不能在显示函数中出来。。...