良许Linux教程网 干货合集 JLINK配合IAR断点功能,让bug无处可藏

JLINK配合IAR断点功能,让bug无处可藏

1. 前言

在产品开发中,调试工具是必不可少的开发利器。除了常见的ARM的CMSIS-DAP/ULINK、IAR的I-JET、P&E的U-multilink/Cyclone,以及一些半导体厂商提供的自定义调试工具如LPC-link、ST-Link等,还有两个备受赞誉的工具,它们就像是神一样存在。一个是SEGGER的J-LINK,它可以与IAR、KEIL等各种编译环境完美衔接,性能稳定可靠,价格也相对较低,因此在嵌入式工程师中非常流行,被誉为居家旅行必备的良品。另一个是劳特巴赫(Lauterbach),听起来就很高大上。作为专业的第三方调试工具供应商,劳特巴赫以其强大的TRACE32开发调试工具在全球享有盛誉。TRACE32开发工具具备丰富而强大的功能,包括基本调试配置、RTOS、多核系统、虚拟目标调试、能耗分析以及强大的脚本语言等,同时还支持市面上80多种常见的微处理架构。

当然,劳特巴赫的强大性能也意味着价格相对较高,比J-LINK贵上一个数量级。但对于大多数嵌入式开发者而言,最常用的仍然是基本调试功能,比如断点、寄存器查看以及内存/Flash的查看。本文将从断点的使用角度,介绍如何利用J-LINK与IAR配合使用,发挥劳特巴赫的一些强大功能。

2. 常用断点存在的问题

断点的概念非常简单,就是在指定的指令或代码行中断程序的执行。实现上可以是通过硬件断点(使用编程FPB实现),也可以是通过插入BKPT断点指令实现的软件断点。具体这两种断点底层的实现不在本文展开讨论。通常,常规的断点调试(实质上是代码断点调试),我们会在希望观察哪里出现问题的代码地址上双击设置断点。一旦运行到断点位置,程序会自动暂停执行,然后我们可以观察感兴趣的变量、内存或寄存器。这种断点调试功能能够帮助开发者解决大部分问题,但也存在一些局限性。

在很多情况下,我们只想知道某段代码是否被执行过,而无需让程序停下来。例如,在调试BLE协议栈时,我们不能逐步执行代码,否则会影响BLE主机和从机之间的通信时序,导致整个系统功能出现问题。还有中断处理函数的调试,一旦程序停下来,就无法进行其他中断的后续响应。此外,当两个设备进行通信时,如果其中一个设备以常规断点方式进行调试,可能会打断正常的通信过程。因此,通常的做法是添加串口打印或ITM半主机打印,将日志信息输出到屏幕上。然而,这种方式会增加额外的软硬件开销(串口打印需要两个UART引脚和UART驱动函数,ITM打印需要一个SWO和ITM驱动),甚至引入新的代码可能导致程序出错。此外,还有三种情形是常规断点无法

3. IAR支持的断点类型和使用方法

总结下来,在 IAR 中,主要有以下几种断点,下面逐一介绍。

  • 代码断点
  • 条件断点
  • 读写访问权限的数据断点
  • 数据日志断点
  • 日志断点
  • 电源断点

3.1. 代码断点

这种断点就是前面提到的最常用的断点,也是最简单的断点。开发则只需要在反汇编窗口中选择C行或ASM指令并切换断点。一旦遇到断点,用户应用程序将停止。这时候可以查看变量、标志和寄存器的值。换句话说,开发者拥有完全的控制权。对于这种普通代码断点,其数量受限于硬件断点的数量,例如对于 Arm Cortex-M,通常有6-8个硬件断点,但如果使用软件断点或在RAM中运行应用程序,则可以不受限制。使用时只需选择显示View -> Breakpoints 窗口,就可以启用或禁用断点。

image-20231014194207016
image-20231014194207016

默认情况下,IDE 将设置代码断点,而且是auto类型,可以通过Option->Debugger->JLINK/JTrace->Breakpoint去设置硬件断点还是软件断点。如果开发者有 I-jet,可以在右键单击代码行时明确选择一个 flash断点。注意断点符号中的“F”。Flash 断点功能在适用于 Arm 的IAR7.60 或更高版本中可用。

image-20231014194210687
image-20231014194210687

3.2 条件代码断点

条件断点是代码断点与某些标志或变量作为条件的组合。设置断点后,同样可以再次使用View -> Breakpoints 窗口查看所有断点,也可以通过右键单击并选择Edit option来设置额外参数。

image-20231014194213727
image-20231014194213727

设置断点条件所使用的语法类似于C语法,可以使用 ==、>= 和 true或changed)来实现更复杂的断点停止条件设置。该方法可以解决上面提到的第二种问题。

image-20231014194216946
image-20231014194216946

3.3 读写访问的数据断点

与其他断点相比,数据断点有点不同,因为是对特定内存地址、标志、变量或寄存器的读写访问的监控。使用时只需右键单击标志或变量并选择选项Set data Breakpoint。默认情况下,对该变量,特定地址,寄存器的任何读取和写入访问都会触发断点。如果你想添加额外的设置,你可以通过View->Breakpoints 窗口Edit 选项来完成. 除了读写访问之外,还可以监控数据是否匹配来作为断点的触发条件,这意味着写或读访问只会在数据匹配时触发暂停。另外,通过选择编辑按钮,开发者还可以打开一个额外的窗口,可以选择绝对地址甚至源代码所在行。对于变量或标志,建议使用自动大小。如果需要监控更大的范围,则应手动设置监控的地址范围或者变量范围,譬如说监控一个结构体的数据变化,使用这种数据断点也是可以实现的,但需要用户正确设置变量,特定地址,寄存器等监控对象的Size。使用这种方法可以解决前文提到的第三种问题

此处需要特别提一下,数据断点对于调试被应用程序破坏的标志和变量非常有用。笔者曾经就是使用这种办法在客户解决了两个埋藏的很深大bug,其中一个是查找某个关键变量在哪里被意外修改,通过设置条件断点+stack callback迅速定位到了肇事代码段,另一种是客户端的意外堆栈溢出调查,当时的做法是在堆栈大小的90%地址靠近栈顶处设置一个数据断点,当堆栈溢出接近时,设置的数据断点会被触发而停止应用程序,从而迅速找到问题的根源,至于如何设置,此处暂不展开。

image-20231014194219953
image-20231014194219953

3.4 数据日志断点

除了具有读写访问权限的数据断点外,开发者还可以使用数据日志断点。这种断点的好处在于可以在时间线中监视和以图形方式绘制内存中特定变量或地址的值,使显示更加直观,用户还可以在同一个时间轴上显示和比较两个或多个变量,从而在逻辑上排查问题。设置的方法就是View->Breakpoints 窗口Edit 选项,然后选择set Data Log Breakpoint for counter即可,使用这种方法可以解决前文提到的第四种问题

image-20231014194223701
image-20231014194223701

时间线以及附加数据日志和数据日志摘要可在探针选项下找到,例如如下面的屏幕截图所示。

image-20231014194227601
image-20231014194227601

3.5 日志断点

除了代码和数据断点之外,还有一种日志断点,这是一个特殊的断点,因为它只会临时暂时停止应用程序以打印消息,然后继续代码的运行。一旦运行到设置的日志断点,它会显示如下用户预先设定的消息,告知用户某个函数事件被触发。这种方式的好处在于,无需额外添加串口打印或者ITM半主机打印输出log信息到显示屏,无需额外的软硬件开销,便可实现基本的信息打印,方便开发者跟踪程序的执行流程。

image-20231014194230721
image-20231014194230721

如下图所示,每次断点命中时,调试日志窗口中都会显示一条消息。添加的计数器可以了解应用程序通过该部分源代码的次数。通过这种办法可以解决前面提到的第一个问题,即不停止代码又能获知感兴趣的代码段是否被执行过,以及执行的次数,兵不血刃,无需添加任何额外的代码。

image-20231014194234569
image-20231014194234569

3.6 电源断点

除了代码的调试,IAR还支持先进的电源调试技术,可以监控功耗,并将其与源代码相关联。这也使得添加电源断点成为可能,可以设置一个阈值,如 25mA,一旦能量高于该值,调试器将被触发停止。设置阈值非常简单, 只需要打开J-Link->PowerLog 窗口,然后设置值和所需选项,如上图或下图所示。通过这种分析,可以直观的看出代码执行过程中的功耗值,下面的时间线窗口不是必需的,但它可以为提供正在使用的能量提供一个时间参考。

image-20231014194237685
image-20231014194237685

4. 总结:

至此,介绍完了IAR支持的6种不同的断点类型和使用方法,也顺带针对性的解决了前文中提到的日常调试遇到的四个问题。如果在日常调试过程中灵活运用以上的这几种断点,对于日常调试提高开发速度和解决一些深藏的bug(例如前文提到的大型程序中变量被莫名修改,堆栈溢出追踪等) 很有帮助。当然劳特巴赫之所以卖的这么贵,必然有其强大之处,尤其是强大的脚本编程,多核系统,能耗分析以及对芯片内部操作的开放度,能给开发者最大的操作灵活度。但就日常的断点调试看,IAR+JLINK的组合也基本能满足大部分的需求,毕竟就地取材最方便。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部