当前位置: 首页 > 科技观察

同事们修复bug的速度很快,所以掌握了这些代码调试技巧

时间:2023-03-17 20:12:40 科技观察

介绍代码调试是研发工程师日常工作中不可或缺的重要组成部分。代码调试的目的不外乎两个。一是自查代码逻辑是否有问题,这样可以在测试介入前排除bug;错误。但无论目的是什么,高效的代码调试一定会提升我们代码的执行效率和定位、解决问题的效率,从而实现代码白盒的自我观察。本文主要列举了10个常用的Debug技巧,可以让我们事半功倍地定位代码问题。Debug调试场景回到上一步调试代码,有时候因为点击下一步的速度比较快,可能会直接跳过之前打的断点进入某个方法内部,但是我们还是要回看上一个断点处的情况,那么就可以使用这个回溯上一步的功能,即DropFrame,快速定位到上一个代码运行的位置。我们都知道JVM是通过栈帧来保存方法调用地址的,所以实际上这部分函数可以理解为放弃当前的调用栈,返回到原来的调用处。字段断点当我们需要知道一个类中的某个属性值何时被修改时,从一开始就调试起来太麻烦了,因为有时我们可能不知道属性赋值的起点到底在哪里,尤其是在阅读框架源代码的时候。那么这个时候可以尝试在类的字段下打断点,检查当属性被访问或修改时,会运行到属性修改发生的地方还是访问属性的地方,这样可以大大提高我们找到属性被修改的地方然后下沉修改的效率。流式调试Lambda表达式是JDK1.8的一个新特性,在实际项目编码中经常会用到它来简化一些循环操作代码。但是Lambda表达式不便于调试,不方便查看流内部值的运行情况。这时候我们就需要用到JavaStreamDebuger这个插件,这样我们在调试流的时候就可以看到内部的各种组件了。价值执行的过程和最终的结果,方便我们定位问题。表达式结果查看在调试的过程中,代码右侧一般会默认显示一些变量的当前值,但是有些表达式的值默认是不显示的,有时候我们需要付出代价注意表达式中的计算过程中的数据是否正确。此时可以用鼠标选中需要计算的代码表达式,然后使用(Alt+F8)快捷键查看表达式的计算结果。调试过滤条件是在一些循环条件下,比如某个List中有100个String对象,但是我们希望在调试的时候能够快速的找到满足条件的对象,而不是把时间浪费在调试我们不关心的对象上关于。这时候,我们就可以使用调试过滤器来快速过滤出我们需要的对象,大大提高我们的调试效率。异常断点在进行断点调试时,除了阅读框架源码了解技术原理或熟悉新业务外,大多数情况下在进行断点调试时会出现异常,需要进一步定位具体原因。但一般情况下,当出现异常时,抛出的异常要么被框架捕获并进入框架源码,要么被自身业务代码中的trycatch捕获,影响问题定位。所以,我们希望在出现异常的时候停在抛出异常的地方,方便我们定位问题。1、在任意断点点击鼠标右键,进行更多调试设置,找到JavaExceptionBreakpoints,添加内置Exception类型或自定义业务异常。2、此时进入调试模式运行代码。当代码逻辑生成之前添加的异常类型时,代码会停留在异常发生的地方,方便异常调试。远程调试在实际项目开发中,经常会遇到本地调试没有问题,但是部署到预发布环境或者生产环境就会出现bug。这个时候只能通过远程调试来具体定位问题。.1.在调试模式配置中选择远??程模式。2、配置远程环境服务以Jar形式运行。服务启动时需要添加启动参数java-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005-jarbusiness.jar服务添加在bin下的catalina.sh文件中tomcat容器中tomcat的目录。在容器中,需要在dockerfile中配置ENTRYPOINT,即服务的启动参数。注意:远程调试需要保证本地代码和远程代码完全一致,否则代码行数不匹配,达不到调试效果。迫不得已回到我们debug问题排查,有时候只是想确认业务逻辑是否有问题,不想实际执行一些消耗资源或者改变数据的操作,那么在这种场景下,我们可以使用函数的强制返回,不执行方法背后的代码,而是指定一个返回值,继续后续的业务逻辑调试。从运行结果可以看出,并没有真正执行addition的代码逻辑,而是强行返回后直接执行后续的业务逻辑。运行时修改变量在调试的过程中,有时我们需要根据我们预期的逻辑来排查和定位问题。在这种场景下,我们可能需要修改一些变量的值,让代码进入不同的预期业务逻辑。通过Alt+F8快捷键修改获取指定变量的值,右键SetValue设置新值。输入新的变量值回车设置,这样变量值就改变了,条件改变后原来的业务逻辑也改变了。多线程调试Idea默认的Debug模式会阻塞所有线程,只有在当前调试线程的逻辑完成后才进入其他线程。那么多线程场景下要调试业务逻辑怎么办呢?其实在设置断点的时候,右击断点,我们可以选择线程调试模式。这样我们就可以通过在Debugger中切换不同的线程来调试业务逻辑。重复使用快捷键1、F8:StepOver程序执行到下一步2、F7:StepInto进入方法内部3、Alt+Shift+F7:强制进入方法内部,主要针对F7无法进入的情况方法内部4、Shift+F8:进入方法后,如果不想一步步执行剩下的代码,可以用这个快捷键跳出5、Alt+F10:如果当前鼠标光标是不在代码运行处,可以使用该快捷键将光标返回到代码运行处6.Alt+F9:鼠标光标所在的位置,可以直接使用该快捷键跳转运行到光标处,无需断点。7.Alt+F8:计算表达式的值。用鼠标选中要计算的表达式后,就可以用这个快捷键来计算表达式的值8、Ctrl+F5:比如修改一些代码后需要重新运行程序,可以使用这个快捷键9、F9:如果一段代码中设置了两个断点,当调试到第一个断点后,按F9运行代码到第二个断点。如果再次按F9,将执行所有代码。也就是说,如果当前断点之后有断点,可以通过F9跳转。如果不是,则执行代码逻辑。10、Ctrl+Shift+F8:查看当前所有断点