Keil断点进阶用法,不看后悔

目录

1、前序 

2、断点简介 

2.1、exp

2.2、cnt

2.3、cmd

3、表达式(exp)  

3.1、ExecName

3.2、Path

3.3、Module

3.4、Identifier

4、命令(cmd) 

5、 设置断点方式 

5.1、手动设置断点

5.2、观察窗中设置断点

5.3、命令窗中设置断点

6、文中问题 

6.1、变量何时改变的?

6.2、变量被改变了多少次才出现的问题?

6.3、当这个变量被设置成某个数据后,我想让程序暂停下来继续分析,该怎么办?

6.4、我不想让程序停下来,又没有串口重定位,又想输出一些额外信息,又该怎么办?

7、原文


1、前序 

作为一名攻城狮,你是否也经常遇到过这种情况,程序正运行着,突然某个变量就被莫名修改了,导致系统就不能按预期的方向继续运行。此时将进行灵魂的拷问。

  • 变量何时改变的?

  • 变量被改变了多少次才出现的问题?

  • 当这个变量被设置成某个数据后,我想让程序暂停下来继续分析,该怎么办?

  • 我不想让程序停下来,又没有串口重定位,又想输出一些额外信息,又该怎么办?

以上问题的答案都可以这篇文章中找到答案。

2、断点简介 

BreakSet命令为指定的表达式 ( exp )设置断点。断点是程序地址或表达式,当它们为真时,会停止目标程序的执行或执行指定的命令(“cmd”)

断点的相关参数释义如下:

2.1、exp

是执行期间的一个地址或者一个表达式。

2.2、cnt

是一个表达式,用于确定在目标程序停止或执行指定命令之前满足断点条件的次数。默认计数值为 1。第一个断点触发后,计数被忽略。

2.3、cmd

是在断点触发时执行的 µVision 命令字符串。程序执行不会停止。用户定义函数可用于命令表达式。在函数中,您可以将系统变量 _break_设置为 1 以停止程序执行。未指定命令时,程序执行停止。

3、表达式(exp)  

在表达式中,常用到的就是程序变量(符号),程序变量是程序的变量。它们通常被称为符号或符号名称。表达式只支持简单的操作符,&, &&, <, , >=, ==, and !=。符号名称的一般形式是如下。

[\\ExecName][[\[Path/]Module][\Identifier]]

3.1、ExecName

表示在Target-Output-Name of Executable字段选项中定义的应用程序名称 ,必须以双反斜杠 (\\) 开头。

3.2、Path

表示源代码文件的路径。用斜杠 (/) 将文件夹与子文件夹分开。必须以斜杠 (/) 结尾。路径可以有绝对或相对符号。

3.3、Module

表示源模块的名称(*.c、*.cpp)。可以以Path 开头。必须以反斜杠 (\) 开头。可以使用调试命令从命令行窗口查询模块名称:DIR module。

3.4、Identifier

表示源代码对象。必须用反斜杠 (\)与Module分隔。当在应用程序中唯一时,可以独立使用并且没有反斜杠。标识符可以是:

  • 代码行号。

  • 变量(char、int、long、float、double)。

  • 复合变量(数组、结构、文件)。

  • 函数。

  • 上述的有意义的组合。

看了这么多是不是觉得枯燥乏味,那我们直接看一个例子,在程序中手动打一个断点,再看详细信息。

如果按照上述的组合,则立即推:

ExecName:STM32F103RB_Nucleo

Path:../Src/

Module:main.c

Identifier:为行号44

至少看到这里,我们知道了,手动设置的断点都是以行号来识别的

4、命令(cmd) 

最后一个参数是命令参数,如果不设置则默认是“_break_=1”。

当用户设置的exp成立之后,系统过就会暂停,以便用户分析程序。如果不想程序暂停则需要将_break_设置为0。该命令可以搭配printf使用,只能输出字符串,不能搭配变量使用。

而且如果使用命令行输出则必须加\n才能输出到命令窗口中,否则无法正常输出,后面会有例程以及注意点。

5、 设置断点方式 

我所熟悉设置断点有三种方式。

5.1、手动设置断点

此方法是最简单的,最为大家所熟悉的,即在文件的某一行手动设置一个断点。或者使用快捷键F9。

5.2、观察窗中设置断点

即把需要监控的变量加入观察窗中,然后选中该变量,右键选择“Set Access Breakpoint at xxx”之后在断点观察窗中将所需要的信息补全,这个也是比较常用的。

5.3、命令窗中设置断点

首先将命令行的窗口打开,在View->Command Windows,BS就是BreakSet的缩写,设置的时候就和断点的语法一样就行了,使用逗号隔开。因为Identifier这一选项已经说明如果符号唯一则前面的应用程序、路径以及模块都可以省略。命令输入时候会有提示的,会告诉你下一步应该输入的语法。使用命令行设置断点之后按下回车就可以了,在断点观察窗就可以看到详细信息了,如下图:

6、文中问题 

最后针对文中提到的问题使用命令行方式解答,使用变量TmpData。

6.1、变量何时改变的?

BS WRITE TmpData

当变量进行写的时候,程序会暂停。

6.2、变量被改变了多少次才出现的问题?

BS WRITE TmpData,10

当变量进行写10次,程序会暂停

6.3、当这个变量被设置成某个数据后,我想让程序暂停下来继续分析,该怎么办?

BS WRITE TmpData==10,1

当该变量为10时,程序会暂停。

6.4、我不想让程序停下来,又没有串口重定位,又想输出一些额外信息,又该怎么办?

BS WRITE TmpData==10,1,"printf(\"TmpData\\n\")"

当变量为10时,命令窗口会输出“TmpData”,并且程序不会暂停。

注意命令行中的cmd命令需要加\n,否则不会输出信息,而\是一个转义字符,需要\\才能输出\。

7、原文

喜欢文章的小伙伴,可以关注“typedef”公众号,原文链接:Keil断点进阶用法,不看后悔Keil中断点调试进阶用法,学到就是赚到。https://mp.weixin.qq.com/s/Dybfp2K-rUMOVVGtKxOI8w

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值