keil调试监视变量的方法

凯尔调试过程查看全局变量和局部变量的方法及编译器优化

一、查看全局变量的方法:监视窗口

窗口允许计算符号、寄存器和表达式。该窗口显示项目名称、值和类型。
通过工具栏按钮或使用菜单打开此窗口视图–观察窗口view---watch窗口

在哪里

搜索框允许在当前名称列表中查找表达式。搜索字符串可以由字母数字字符和掩码字符组成,如附录中所述F.TR1搜索表达式.
名字列出表达式名称。符号名称符合中描述的规则程序变量(符号)。项目标有图标:-标识复杂类型的项,如结构或数组。-标识简单类型的项,如整数或字符。
价值显示内存地址或表达式的计算值。该字段可以包含说明性文本。类型的表达式无符号字符显示值和相应的字符。单引号()指示该值是从以前的调试会话中恢复的。值被更新:每当程序执行停止。在程序执行期间,当视图-定期窗口更新已启用。当单击工具箱按钮更新窗口.
类型显示表达式的类型。对于函数,该字段显示返回和参数类型。

使用监视窗口

将表达式拖放到其他窗口,例如内存、命令或逻辑分析仪窗口。

添加表达式

  • 双击文本并开始编辑。请参阅一节公式详情请见。
  • 将表达式从其他窗口拖放到“监视”窗口中。
  • 打开文件的上下文菜单。使用将项目添加到-观察#。鼠标位置下方的变量被添加到“监视”窗口中。
  • 使用命令手表套装贴在窗口上命令.

删除表达式

  • 单击项目名称,然后按删除钥匙。
  • 使用命令守望杀手贴在窗口上命令.

更改表达式的值

  • 单击值字段并开始编辑。不是所有的表达式都接受变化。

上下文菜单允许:

  • 移除表达式。
  • 更改值的表示。
  • 设置断点。
  • 向其他窗口添加表达式。
  • 显示或隐藏包含搜索框.

二、查看局部变量的方法:调用堆栈和局部变量窗口

调用堆栈+局部变量窗口显示当前堆栈上的对象。显示了使用RTX-RTOS的应用程序的任务。每个对象都与其位置或值以及类型相关联。

从工具栏或使用菜单打开此窗口查看-调用堆栈窗口.

在哪里

名字显示符号名称。当前活动的功能或任务以绿色突出显示。双击项目节点以展开或折叠项目。
位置/价值显示该项目的内存地址或值,或者有说明性文本。对于类型的物料无符号字符该字段显示值和字符。
类型显示对象类型。函数与其返回类型和参数类型相关联。

窗口内容会自动更新:

  • 每当程序执行停止时。
  • 在程序执行期间,当视图-定期窗口更新已启用。

上下文菜单允许:

  • 跳转到呼叫者代码。
  • 跳转到被调用方代码。
  • 在十六进制和十进制表示值之间切换。

三、编译器优化:编译器优化级别和调试视图

编译器执行的精确优化取决于所选择的优化级别,以及您是针对性能还是代码大小进行优化。

编译器支持以下优化级别:

  • 0

    最小优化。关闭大多数优化。启用调试时,此选项会提供最佳的调试视图,因为生成代码的结构直接对应于源代码。所有干扰调试视图的优化都被禁用。特别是:断点可以设置在任何可到达的点上,包括死代码。变量的值在其作用域内的任何地方都是可用的,除了未初始化的地方。Backtrace给出了预期从读取源开始的开放函数激活的堆栈。请注意,尽管由-O0与源代码最接近,用户可能更喜欢由-O1因为这将在不改变基本结构的情况下提高代码的质量。注意死代码包括对程序结果没有影响的可达代码,例如从未使用过的局部变量赋值。不可到达的代码是指不能通过任何控制流路径到达的代码,例如紧跟在return语句之后的代码。

  • 1

    受限优化。编译器只执行可以由调试信息描述的优化。移除未使用的内联函数和静态函数。关闭严重降低调试视图质量的优化。如果与一起使用--debug,这个选项给出了一个总体上令人满意的调试视图,代码密度很高。调试视图与–O0are:不能在死代码上设置断点。变量的值在初始化后可能在其作用域内不可用。例如,如果他们被分配的位置已经被重新使用。没有副作用的函数可以不按顺序调用,或者在不需要结果时可以省略。由于tailcalls的存在,Backtrace可能不会给出读取源时预期的开放函数激活的堆栈。优化级别–O1在源代码和目标代码之间产生良好的对应,尤其是当源代码不包含死代码时。生成的代码将比–O0,这可以简化目标代码的分析。

  • 2

    高度优化。如果与一起使用--debug,调试视图可能不太令人满意,因为目标代码到源代码的映射并不总是清晰的。编译器可能会执行调试信息无法描述的优化。这是默认的优化级别。调试视图与–O1由于多个源代码位置映射到文件的一个点的可能性,以及更激进的指令调度,源代码到目标代码的映射可能是多对一的。指令调度允许跨序列点。这可能会导致在某个特定点报告的变量值与您可能从阅读源代码中得到的值不匹配。编译器自动内联函数。

  • 3

    最大优化。启用调试时,此选项通常会给出一个糟糕的调试视图。ARM建议在较低的优化级别进行调试。如果你使用-O3-Otime编译器一起执行更激进的额外优化,例如:高级标量优化,包括循环展开。这可以以较小的代码规模成本带来显著的性能优势,但代价是更长的构建时间。更积极的内联和自动内联。这些优化有效地重写了输入源代码,导致目标代码与源代码的对应性最低,调试视图最差。这--loop_optimization_level=option控制在下执行的循环优化量–O3 –Otime。循环优化的数量越多,源代码和目标代码之间的一致性就越差。有关在源代码上执行的高级转换的更多信息,请访问–O3 –Otime使用--remarks命令行选项。

因为优化会影响目标代码到源代码的映射,所以优化级别的选择-Ospace-Otime通常会影响调试视图。

选择-O0如果需要简单的调试视图,则是最好的选择。选择-O0通常会将ELF图像的大小增加7%到15%。若要减小调试表的大小,请使用--remove_unneeded_entities选项。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值