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

深入讨论如何断点

时间:2023-03-20 22:18:38 科技观察

对于程序员来说,调试的时间往往比写程序的时间还要长。尤其是像我这样以写bug为主的程序员,正确使用断点调试是提高效率的有效途径。今天我们就来说说如何高效调试断点。由于IAR是工作中的主要IDE,所以本文主要关注IAR。1、打开有普通断点的IDE,如下图,我们要在执行到104行时停止程序,我们在下图中104行号前点击,会出现一个红色的断点标记陈述。如下图所示:或者点击设置断点的语句,按下鼠标右键,选择ToggleBreakpoint(Code)。2.条件断点除了上面最常见的断点,有时我们还需要在特定条件下触发断点。比如上面的代码,希望程序在num等于100的时候暂停。这时候最常用的方法有两种:1、最笨的方法就是手动运行100次。2、写一个判断语句,当num等于100时执行某条语句,并在这条语句上设置断点如下:这种方法是可行的,但是也有很大的缺陷:在优化代码的时候,有些语句可能是优化。断点不起作用。这时候,条件断点就派上用场了。设置断点后,进入调试模式,然后在IAREWARM的选项栏中选择View->Breakpointswindow可以查看设置的断点,右击设置的断点,选择Edit配置断点。我们想在num等于100时暂停程序,那么我们在下图红框内填入num==100。当然也可以设置(num>=10)和(num<=10),类似于C语言中使用的==、>=、<=。当程序全速运行时,当程序运行到第104行,num等于100时,会暂停,如下图:注意上面的“and”字。此时断点触发的条件运行到104行,num等于100时同时满足,断点到其他行也是一样的效果,如下图:3.数据断点看完上面的描述,有同学会问,如果我想在num等于100的时候暂停,不要同时满足其他条件,为什么会有这样的需求?在实际开发过程中,会遇到很多数据“异常”的情况。比如在一个代码量很大的项目中,某个变量突然变成了1,但是又无法快速定位到代码修改处。这时,数据断点(非正式名称,人名)登场。值得注意的是,数据断点只对全局变量有效。进入调试模式,然后在IAREWARM的选项栏中选择View->Breakpointswindow可以查看设置的断点,空白处右击选择NewBreakpoint,然后选择Data。1处填写num,表示要监控的变量,2处选择Enable,3处写入0x00000064,表示当num等于100时,程序会暂停。测试结果如下:眼尖的同学可能已经注意到Accesstype选项,我们选择了Read/Write,也就是说无论是读操作还是写操作,当num等于100时,程序都会被暂停。WhenReadisselected,theprogramwillbesuspendedonlywhenthereadingnumisequalto100.WhenWriteisselected,theprogramwillbesuspendedonlywhennumisequalto100whenwritingnum.对比下图,一个停在106行,一个停在104行,具体原因是C语言的基础知识,这里不再赘述。注意:1.对于Cortex-M设备,只能设置一个匹配数据的断点。而这样的断点使用了两个硬件断点。2、调试设备仅限I-jet、JTAGjet、J-Link/J-Trace和ST-LINK,不支持自制的CMSIS-DAP。4.总结新建断点的时候还有log,Datalog等,我用的不多。以上主要介绍了我经常使用断点的方式。希望对大家有所帮助。本文转载自微信公众号《懂编程》