在线调试程序时,打断点是非常有效的一种方式,配合单步调试,可以快速定位问题。但是有时候,手动打断点用起来不是那么方便。
比如想要在一个循环的第N次停下来,如果手动打断点,那就要不停的点击单步运行,直到循环运行到第N次。再比如,程序运行过程中变量不知何时被改变了,又不好定位,手动打断点就不知打在哪里。这时就要用到一些断点的高级用法。
点击Debug菜单,选择BreakPoints:
弹出下面菜单:
最上面的断点是手动打的,双击该断点,会看到 Expression 会显示该断点的信息,修改 Count 的值为 10,点击 Define,然后关闭该窗口。
这里说明一下:
-
Expression为表达式,即断点的条件,可以看到,手动设置的断点结尾为\123,表示在 main.c 文件的 123 行。这里支持基本的 >、<、==、!= 等操作符。
-
Count为次数,表示运行多少次中断一次,手动设置的断点Count都是1。
-
Command为命令,表示到达该断点时执行的命令,默认为空。
按照上面的设置,运行程序。可以看到,程序运行到断点时没有马上停下,而是在第10次才停下来:
将变量添加到Watch窗口,右击选择Set Access BreakPoint at xxx。还是弹出刚才的菜单:
勾选 Access 方式 Read 或 Write,设置 Count 值,点击 Define。这里选择 Write,Count 值为 4,表示该变量第四次被写入时程序会停止。
跟上一步一样,在 Watch 窗口,右击变量选择 Set Access BreakPoint at xxx。勾选 Access 方式 Read 或 Write,删除 Expression 下原来的内容,填写表达式“AD== 10”。点击 Define。这样当 AD==10 时程序会停止。
选择一个手动打好的断点,然后在 Command 下填写 printf(),则在运行到断点处时,程序不会停止,而是在 Command 窗口打印设置的信息。
还可以将 3 和 4 组合使用,如下:
则 AD==10 时,程序不中断,在 Command 窗口打印信息。断点的高级用法还有很多种,不同的表达式,不同的指令等,具体可查阅 Keil的使用帮助文档。