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

TopSemic嵌入式 2021-11-19 13:31


  • 1. 前言

  • 2. 常用断点存在的问题

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

    • 3.1. 代码断点

    • 3.2 条件代码断点

    • 3.3 读写访问的数据断点

    • 3.4 数据日志断点

    • 3.5 日志断点

    • 3.6 电源断点

  • 4. 总结:

  • 5. 经验交流:

1. 前言

在产品开发中,调试工具是不可或缺的开发利器,除了日常常见的ARM的CMSIS-DAP/ULINK,IAR的I-JET,P&E的U-multilink/Cyclone, 各个半导体厂商自定义的XX-LINK(例如LPC-link, ST-Link,等)之外,还有两个是神一样的存在,一个是SEGGER的J-LINK,支持与IAR/KEIL等各种编译环境无缝衔接,性能稳如老狗, 价格低廉, 所以在嵌入式工程师中的普及率非常高,被称为居家旅行匮赠好友之佳品。另外一个是一听名字就感觉高大上的劳特巴赫Lauterbach,作为专业第三方调试工具厂商,以其强大的TRACE32开发调试工具享誉全球,TRACE32开发工具拥有非常丰富和强大的功能,包括基本调试配置、RTOS、多核系统、虚拟目标调试、能耗分析以及强大的脚本语言等,而且可以支持市场中使用的80多种常见的微处理架构。

当然Lauterbach性能的强大,对应的代价就是价格也比JLINK多出一个数量级,但是对于大部分嵌入式开发者来说,最常用的还是基本的调试功能,包括断点,寄存器查看,内存/Flash的查看,本文从断点使用的角度讲解如何使用JLINK配合IAR支持的各种断点用出点劳德巴赫的一些强大功能。

2. 常用断点存在的问题

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

因为很多时候我们只想知道某段代码是否运行过,而不能让程序停下来,譬如说调试BLE协议栈,无法去单步运行,否则会打断BLE主机和从机之间的通讯时序,而导致整个系统功能出现问题。还有中断处理函数的调试,程序一旦停下了也就失去了其他所有中断的后续响应,再比如两个设备通信,一旦一方采用常规断点的方式调试,可能会打断正常的通信过程。所以通常的做法是添加串口打印或者ITM半主机打印输出log信息到显示屏,但是这种方式会带来额外的软硬件开销(对于串口打印来说是两个UART pin脚+UART驱动函数,对于ITM打印输出是一个SWO+ITM驱动),甚至因为引入新的代码导致程序出错。除此之外,还有3种场景是这种普通断点无法满足的,第一个是同一段循环体运行N次才停下来,第二个是当变量被写入新的数据或者被读取时停下来,第三个是实时记录断点所在行某个特定变量或者地址的值,并在时间轴上以图形的形式显示出来,方便分析和对比。

以上这些功能在这些功能在劳德巴赫中是最基本功能,同样在IAR中也提供了不同形式的断点类型和组合,只是日常习惯了只用了其代码断点的功能,没能充分发挥IAR的强大断点功能,针对以上4种问题在IAR中可以分别用日志断点、条件断点、读写权限的数据断点、数据日志断点逐个击破,从而避免了额外添加代码的繁琐,也能为解决隐藏bug提供更加灵活的手段。尤其是其中的读写权限的数据断点,笔者曾经就是使用这种办法帮客户解决了两个埋藏的很深大bug,其中一个是查找某个关键变量在哪里被意外修改,通过设置条件断点+stack callback迅速定位到了肇事代码段,另一种是客户代码意外堆栈溢出调查,当时的做法是在堆栈大小的90%地址靠近栈顶处设置一个写触发的数据断点,当某层调用过程中堆栈接近溢出时,设置的数据断点会被触发而停止应用程序,从而迅速找到堆栈是在哪层调用溢出的,从而解决问题。

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

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

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

3.1. 代码断点

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

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

3.2 条件代码断点

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

设置断点条件所使用的语法类似于C语法,可以使用 ==、>= 和 <=。例如,如果您希望应用程序在计数器等于 10 时在断点处停止,您可以使用“counter==10”。这在中断例程中需要断点时非常有用。如果没有设置条件,应用程序就会一直被停止,影响到系统的正常工作,使用标志或变量作为条件使事情变得容易得多。甚至用户还可以使用跳过计数器和条件检查(如true或changed)来实现更复杂的断点停止条件设置。该方法可以解决上面提到的第二种问题。

3.3 读写访问的数据断点

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

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

3.4 数据日志断点

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

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

3.5 日志断点

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

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

3.6 电源断点

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

4. 总结:

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

5. 经验交流:

欢迎关注公众号,获取更多实用分享。



TopSemic嵌入式 TopSemic,让芯片使用更简单。 专注分享:嵌入式,单片机,STM32,ARM,RTOS,Linux, 软硬件,半导体,电子技术等相关内容。
评论
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 161浏览
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 55浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 98浏览
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 71浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 73浏览
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 85浏览
  •         在上文中,我们介绍了IEEE 802.3cz[1]协议提出背景,旨在定义一套光纤以太网在车载领域的应用标准,并介绍了XMII以及PCS子层的相关机制,在本篇中,将围绕IEEE 802.3cz-MultiGBASE-AU物理层的两个可选功能进行介绍。EEE功能        节能以太网(Energy-Efficient Ethernet)是用于在网络空闲时降低设备功耗的功能,在802.3cz的定义中,链
    经纬恒润 2024-12-19 18:47 83浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 118浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 84浏览
  • 汽车驾驶员监控系统又称DMS,是一种集中在车辆中的技术,用于实时跟踪和评估驾驶员状态及驾驶行为。随着汽车产业智能化转型,整合AI技术的DMS逐渐成为主流,AI模型通过大量数据进行持续训练,使得驾驶监控更加高效和精准。 驾驶员监测系统主要通过传感器、摄像头收集驾驶员的面部图像,定位头部姿势、人脸特征及行为特征,并通过各种异常驾驶行为检测模型运算来识别驾驶员的当前状态。如果出现任何异常驾驶行为(如疲劳,分心,抽烟,接打电话,无安全带等),将发出声音及视觉警报。此外,驾驶员的行为数据会被记录
    启扬ARM嵌入式 2024-12-20 09:14 98浏览
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 144浏览
  •         不卖关子先说感受,真本书真是相见恨晚啊。字面意思,见到太晚了,我刚毕业或者刚做电子行业就应该接触到这本书的。我自己跌跌撞撞那么多年走了多少弯路,掉过多少坑,都是血泪史啊,要是提前能看到这本书很多弯路很多坑都是可以避免的,可惜这本书是今年出的,羡慕现在的年轻人能有这么丰富完善的资料可以学习,想当年我纯靠百度和论坛搜索、求助啊,连个正经师傅都没有,从软件安装到一步一布操作纯靠自己瞎摸索,然后就是搜索各种教程视频,说出来都是泪啊。  &
    DrouSherry 2024-12-19 20:00 110浏览
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 80浏览
我要评论
5
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦