eclipse怎么debug:靠断点调试逐步定位代码异常问题
刚学Java那会,最头疼的就是摸不清eclipse怎么debug,代码跑崩了只会一遍遍打印日志瞎找问题。那时候总觉得debug是个很高级的功能,不敢随便点,报错弹窗跳出来就只会复制去浏览器搜,半天找不出具体哪一行代码出的问题,白白浪费大把时间,明明就是几行代码的小逻辑错误,硬生生卡一两个小时。
最开始踩的蠢坑,就是直接右键run运行,压根分不清运行和调试的区别。总以为程序报错,重新跑一遍就能自己修复,在控制台刷一堆红色报错信息,盯着看半天,只知道程序异常,完全定位不到变量出错、逻辑走偏的具体位置。反复修改代码反复运行,做的全是无用功,根本抓不住问题的核心。
折腾好久才搞明白,debug的核心根本不是自动修bug,是跟着代码执行轨迹看每一步数据变化。
第一次正经调试的时候,胡乱在代码首尾打了十几个断点,整个程序跑起来直接卡死,每走一行就暂停一次,繁琐到让人烦躁。当时完全不懂断点要打在逻辑分支、循环体、变量赋值的关键位置,无脑全覆盖的操作,让简单的调试变得无比臃肿,半天推进不了一点进度。后来慢慢试出来,只在疑似出错的代码行左侧双击打点,界面出现蓝色小圆点,这才是有效的调试断点,多余的断点全部右键取消就行,多余的断点只会干扰调试节奏。
启动调试也有讲究,不是点普通运行按钮,是右键代码页面选择debug as,再选java application。很多时候启动失败,就是因为之前的程序端口没关闭,后台还在运行旧的进程,再重新启动就会冲突,关掉后台残留进程就能正常进入调试模式。初次用的人基本都会卡在这一步,不知道进程残留的问题,反复重试也没用。
进入调试界面后,一开始完全看不懂弹出的窗口,密密麻麻的变量、线程数据看得头大。其实根本不用管所有参数,只盯着自己定义的变量就行。按F6是单步跳过,一行一行执行代码,能清晰看到每一步变量数值的变动,适合排查普通代码行的逻辑问题;F5是步入方法内部,遇到自定义方法的时候,用这个键能钻进方法里看执行逻辑,专门找深层嵌套的代码错误;F8是直接跳到下一个断点,不用逐行浪费时间,适合跳过已经确认无误的代码段落。
有次写循环遍历集合的代码,一直报索引越界异常,打印日志只能看到最终报错结果,根本看不出循环到第几次出的问题。开启debug模式后,对着循环条件打了断点,逐行F6执行,清清楚楚看到循环次数超出了集合的长度,瞬间就锁定了问题根源,前后也就两分钟就修复了bug,比盲测高效太多。那一次之后才真正意识到,debug不是锦上添花的功能,是写代码最基础的排错手段。
其实很多人debug没用对,就是太心急,总想一步找到问题,不肯逐行核对数据变化。代码的逻辑错误从来不会凭空出现,都是某一次变量赋值、条件判断出错导致的,debug的意义就是把隐形的代码执行过程,变成看得见、可追溯的步骤,所有隐藏的小问题都会暴露出来。
那天调试完那段循环代码,关掉软件的时候,屏幕上还留着调试界面的变量数据弹窗。