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, 软硬件,半导体,电子技术等相关内容。
评论 (5)
游客_597432021-11-19 22:46
一直想知道keil和jlink的这些断点怎么弄,可以安排上?
游客_356012021-11-19 15:57
st~ulink照样香[呲牙][调皮][偷笑]
游客_534292021-11-19 14:41
哈哈哈哈,仿真真的是查bug的一大利器呀
游客_531072021-11-19 13:43
jlink买edu版本的就不贵,四五十刀就有
游客_869502021-11-19 13:36
正版的JLINK好像也不便宜
  • 深圳触觉智能SOM3506核心板现已上市,搭载瑞芯微RK3506B/J超低功耗处理器(1.5GHz三核A7+M0),低功耗满载仅0.7W,支持40℃~85℃工作环境,即日起宽温级59元/工业级68元,特价开售!芯片介绍RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台,三核Cortex-A7+单核Cortex-M0多核异构设计,CPU频率达1.5Ghz, M0 MCU为200Mhz。RK3506适用场景简介工业控制‌:RK3506适用于工业控制、工业通信、人机
    Industio_触觉智能 2025-03-07 10:03 162浏览
  • 深圳触觉智能RK3506开发板现已上市,开启预售!搭载瑞芯微RK3506B/J超低功耗工业处理器(1.5GHz三核A7+M0,主频1.5GHz);支持1280×1280显示、双百兆网口、星闪无线三模,板载高达2路CAN FD与5路串口。RK3506适用场景简介工业控制‌:RK3506适用于工业控制、工业通信、人机交互等应用场景。其多核异构架构(3xCortex-A7+Cortex-M0)和外设接口丰富,支持Buildroot、Yocto系统,适合轻量级HMI应用‌。‌工业通信‌:RK3506均支
    Industio_触觉智能 2025-03-07 10:04 136浏览
  • 多人同时共享相同无线网络,以下场景是否是您熟悉的日常?姐姐:「妈~我在房间在线上课,影音一直断断续续的怎么上课啊!」奶奶:「媳妇啊~我在在线追剧,影片一直卡卡的,实在让人生气!」除此之外,同时间有老公在跟客户开在线会议,还有弟弟在玩在线游戏,而妈妈自己其实也在客厅追剧,同时间加总起来,共有五个人同时使用这个网络!我们不论是在家里、咖啡厅、餐厅、商场或是公司,都会面临到周遭充斥着非常多的无线路由器(AP),若同时间每位使用者透过手机、平板或是笔电连接到相同的一个网络,可想而知网络上的壅塞及相互干扰
    百佳泰测试实验室 2025-03-06 16:50 162浏览
  • ASL6328芯片支持高达 6.0 Gbps 运行速率的交流和直流耦合输入T-MDS 信号,具备可编程均衡和抖动清理功能。ASL6328 是一款单端口 HDMI/DVI 电平转换 / 中继器,具有重新定时功能。它包含 TypeC双模式 DP 线缆适配器寄存器,可用于识别线缆适配器的性能。抖动清理 PLL(锁相环)能够消除输入抖动,并完全重置系统抖动容限,因此能更好地满足更高数据速率下 HDMI 抖动合规性要求。设备的运行和配置可通过引脚设置或 I2C 总线实现。自动断电和静噪功能提供了灵活的电
    QQ1540182856 2025-03-06 14:26 137浏览
  •        深夜的公园里,当路灯熄灭后,传统监控摄像头只能拍出模糊的黑白画面,仿佛老式胶片电影里的场景。而搭载为旌瑶光ISP的摄像头,却能像猫科动物一样,在几乎全黑的环境中捕捉到行人衣服的颜色、树叶的纹理,甚至快速跑动的宠物狗毛发细节。这种从“黑白默片”到“全彩4K电影”的跨越,背后是为旌瑶光ISP对传统红外补光技术的颠覆性创新。一、传统方案之困:被红外光“绑架”的夜视世界        传统安防摄像头依赖红外
    中科领创 2025-03-07 16:50 323浏览
  • 一、系统概述MYD-LD25X搭载的Debian系统包含以太网、WIFI/BT、USB、RS485、RS232、CAN、AUDIO、HDMI显示和摄像头等功能,同时也集成了XFCE轻量化桌面、VNC远程操控、SWITCH网络交换和TSN时间敏感网络功能,为工业设备赋予“超强算力+实时响应+极简运维”的体验!类别名称描述源码TF-AArm Trusted Firmware 2.8OP-TEEOP-TEE 3.19BootloaderU-boot 2022.10KernelLinux Ke
    米尔电子嵌入式 2025-03-07 14:08 244浏览
  • 近年来,越来越多的企业在5S管理的基础上,开始追求6S、7S甚至8S管理,仿佛S越多,管理就越先进,企业就越优秀。于是,6S增加了“安全”,7S又加上了“节约”,8S甚至引入了“学习”……看似更加全面,实则很多企业只是机械地增加S,却忽略了管理的核心目标:提升效率、降低浪费、优化工作环境。优思学院认为,5S本身已经是一套成熟的精益管理工具,它的核心理念不仅简单高效,而且易于实施和推广。如果企业只是为了赶时髦,盲目增加S,而没有真正理解5S的本质,那么这些额外的“S”很可能会变成管理上的负担,而不
    优思学院 2025-03-07 12:43 206浏览
  • 文/Leon编辑/cc孙聪颖2025年全国两会进行时,作为“十四五”规划收官之年,本届两会释放出坚定目标、稳中求进、以进促稳等信号。其中,企业家们的建议备受关注,关系到民营经济在2025年的走向。作为国内科技制造业的“老兵”,全国人大代表、TCL集团创始人及董事长李东生在本届两会中提出三份代表建议,包括《关于优化中国科技制造业融资环境的建议》、《关于加强AI深度伪造欺诈管理的建议》和《关于降低灵活就业人员社会保险参保门槛的建议》,表现出对科技制造、AI发展和劳动者保障方面的关注。会后,李东生接受
    华尔街科技眼 2025-03-06 19:41 143浏览
  • ​CS6212是一款可分别用于USB Type-C主机/显示端口源应用的带重定时的有源开关。这设备符合USB 3.2标准版本1.0和USB Type-C标准上的VESA DisplayPort Alt模式 1.0版,支持通过GPIO或12C进行灵活的模式切换。此设备支持USB 3.2第2x1代 运行速度高达10Gbps,DisplayPort 1.4运行速度高达HBR3 8.1Gbps。CS6212管脚分布及功能定义:CS6212支持重定时器训练,并支持USB 3.2标准中定义的状态状态机(RT
    QQ1540182856 2025-03-07 10:09 163浏览
  • 在企业管理和职场环境中,权力是一个常被提及却又让人感到微妙的话题。有人觉得它充满吸引力,有人却对它避之不及。然而,不管你对权力的态度如何,理解它、掌握它,甚至善用它,都是职场成功的重要一环。今天,我们就来深入探讨权力的本质,特别是个人权力和社会权力的区别,以及如何在职场中逐步建立属于自己的影响力。权力的两种面貌:你掌控自己,还是掌控他人?说到权力,首先要区分它的两种类型。个人权力是你对自己生活的掌控感。比如,你能自由决定自己的职业方向,不用总是请示他人。这种权力让人感到踏实和满足,是我们在生活中
    优思学院 2025-03-07 15:56 209浏览
  • 随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重建的关键突破。一、3DGS技术概述与原理1、3DGS的技术概述3DGS是一种基于3D高斯分布的三维场景表示方法。通过将场景中的对象转化为多个3D高斯点,每个点包含位置、协方差矩阵和不透明度等信息,3DGS能够精确地表达复杂场景的几何形状和光照特性。与传统的神经辐射场(NeRF)方法相比,
    康谋 2025-03-06 13:17 322浏览
  • 服务器应用环境与客户需求PCIe 5.0高速接口技术的成熟驱动着生成式AI与高效能运算等相关应用蓬勃发展。在随着企业对服务器性能的要求日益严苛,服务器更新换代的周期也持续加快。在此背景下,白牌与DIY(Do It Yourself)服务器市场迎来了新的发展契机,但同时也面临着更趋复杂的技术挑战。传统上,白牌与DIY服务器以其高度客制化与成本效益优势受到市场青睐。然而,随着PCIe 5.0等高速技术的导入,服务器系统的复杂度大幅提升,对组装技术与组件兼容性也就提出更高的要求。举个简单的例子来说,P
    百佳泰测试实验室 2025-03-06 17:00 165浏览
  • Sub-GHz,即工作频段低于1GHz的无线通信技术,常见频段有315MHz、433MHz、868MHz与915MHz等。其可借助无线电波在自由空间传播的特性,把数据调制到射频载波上进行传输,达成物联网设备间的无线通信,是物联网设备实现高效、稳定、无缝交互的“通信基石”。典型射频信号(无线电波)收发电路简示在工业自动化、智慧城市、智慧农业与智能家居等物联网领域中,LoRa、Wi-SUN、Z-Wave、Sigfox等工业级通信协议大多运行在Sub-GHz频段。而正是通过Sub-GHz射频技术,传感
    华普微HOPERF 2025-03-07 11:39 165浏览
我要评论
5
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦