作为一个程序,大家都知道写代码和调试的时间几乎是9:1,也就是说大家90%的时间都在调试。我们如何才能最快地找到错误?调试是开发中解决问题最重要的方法。也看到很多同事在开发中只是单纯的调试,所以写了这篇文章。俗话说,工欲善其事必先利其器。良好的调试技巧让你在开发中如鱼得水。从大的角度来看,调试主要是本地调试和远程调试。本地调试是使用IDE的调试按钮在本地启动项目,远程调试一般是指在其他机器上调试程序。下面分别从这两个方面说起。因为我在开发中使用的是idea,所以下面的例子和截图都是idea的。调试技巧相同,使用eclipse的同学可以自行迁移到eclipse。1.断点分类行断点顾名思义,行断点就是点击代码的左侧,红点表示断点成功,代码运行到这一行就会触发。方法断点方法断点是方法签名上的断点,当调用该方法时将触发断点。如上图所示,菱形红点字段断点字段断点是在字段定义处添加断点,任何访问或写入都会触发断点。ExceptionbreakpointExceptionbreakpoint在调试视图中,点击两个小点,打开断点界面,然后点击“+”号,选择JavaExceptionBreakpoints,输入你要断点的异常名称。比如常用的NullPointerException,只要在程序运行时抛出这个异常,就会触发断点。2.Managebreakpoints点击图中位置1可以取消所有断点,即不会触发所有断点。点击图中位置2,打开断点管理界面。如果勾选断点,说明断点起作用,不勾选,说明断点不起作用。3.条件断点条件断点太好了。写代码的人应该都知道前面的断点,都是初学者。这部分是今天的重点,也是精华所在。1、Enablebreakpoint是否有效,没啥好说的,一般都会启用。2.暂停暂停。后面有两个选项,选项All表示挂起当前应用的所有线程,Thread表示挂起当前运行代码的线程。一般在调试多线程的时候,选择thread,这样就不会影响到其他线程,多线程的问题就可以调试出来了。3.Condition懂一点英语的人都知道condition这个词的意思。这部分的核心。勾选此选项时,会运行Condition框中的代码,只返回true或false。当为真时,将触发断点。为false时,不会触发。输入条件时可以使用当前上下文的代码。下图中,i==1为横条,当i=1时断点触发。调试时,可以针对特定情况下断点问题。这也是最常用的功能。4.Log也很简单——log,就是执行Evaluate中的代码,到断点的时候记录。在代码框中可以调用日志系统或者直接打印到控制台,避免修改代码打印输出。如果只想打印,不想挂起线程,可以取消Suspend,这样只会触发断点,不会挂起应用程序。如果勾选stacktrace,会打印调用栈,可以看到断点的触发源。是不是很棒?5.removeoncehit很简单,断点触发一次,下次自动失效删除。6.Disableuntilhittingthefollowingbreakpoint该选项表示当前断点只有在下面选择的断点被触发后才会被触发,主要用于调试命令。可以选择已经命中的断点。7、afterhit断点触发后的操作,持续不可用,还是一直可用,看需求。8、instancefilter勾选后,只有输入的instanceId运行到代码时才会触发,用处不大。因为首先您需要知道实例ID。这是运行时观察变量区@后面的id。9.classfilter过滤类,只有特定的类才会断点。不常使用。10.passcount多少次触发断点,一般用在循环中,一定次数后触发断点。常用。避免查看您不想看到的循环代码。11.callerfilter来电过滤。仅在调用方法时触发。当从多个地方调用一个方法,但只想为个别调用设置断点。虽然这样看起来比较好用,但是比较可惜,因为需要输入法的完整签名。可以使用条件断点解决,尽量不用这个。类似:org.pdool.reflect.Player.addString(Ljava/lang/String;)V,如下图:4.技能掉帧回滚栈。开发过程中,与客户端调整协议时,有时客户端运行,到了断点,但没有注意到一些变量。这时候可以保留断点,然后到Frames中选择要查看的函数,右键dropframe。您可以展开堆栈并再次运行该函数。使用时需要注意的是,上次修改的全局变量不能回滚。alt+f8运行时计算当运行到断点代码时,如果想查看其他变量的值,可以使用这个快捷键。当然你也可以用这个方法来修改内存的值。比如this.setName("coriander"),只要你输入的代码不报错。3.修改变量值调试时有些特殊情况不好,但又想观察程序在特殊情况下的行为。这时候可以通过修改变量来调整代码运行过程。选中要修改的变量,右键setValue或F2,输入要修改的值,回车,这样对象的值就会被修改。这种修改会影响对象的整个生命周期。4.移动断点选中断点,然后按住alt,用鼠标拖动断点,移动断点的位置,整个断点的属性都会被迁移。完美的!5.热更新热更新是在不重启应用程序的情况下应用新修改的代码。有以下限制:1.函数参数格式不能修改。2.不能给类添加函数。3.不能向类中添加变量。4.只能修改函数内部的逻辑。5.类的方法不能减少。修改代码后,可以按ctrl+shift+F9热更新代码,可以在信息栏看到更新成功,更新了几个类。这是开发中非常常用的一个功能,省去了一直重启的痛苦。5.远程调试代码部署到测试服务器时,会弹出一些测试问题,但是本地没有,要么是数据环境的问题,要么是特殊账户的问题。这时候想调试一下。现在是远程调试发挥作用的时候了。如果要远程调试,第一步是在远程应用程序上打开调试端口,将其添加到启动命令中,然后启动应用程序。-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000第二步在本机,idea中,run-->EditConfigurations-->+sign-->selectindrop-downlistRemote,然后输入远程机器的ip和端口启动。Step3远程代码和本地代码连接成功后,就可以和调试本地代码一样了。你还知道哪些调试技巧,欢迎留言告诉我。原创不易,两周写一篇文章,求分享,点击阅读,敬请关注。感谢您的支持。天天想想,再好的人也过不好。好吧好吧,看到就收下吧。——仓央嘉措
