Jlink-commander查找程序跑死

本文详细介绍了如何通过分析ARM处理器的堆栈指针SP、连接寄存器LR和程序计数器PC来诊断程序陷入死循环的问题。在设备死机的情况下,借助JlinkCommander软件,观察异常模式下的寄存器值,通过内存检查和代码定位,最终发现是由于FIFO队列满导致的死循环。这个过程强调了在没有复位设备的情况下保护现场的重要性,以及如何有效进行故障排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现象

写了个测试程序,运行2小时后出现程序陷入死循环。设备已经死机。利用没有复位的剩余价值减少代码review的范围,

基础介绍

  • 堆栈指针R13(SP)

    当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。

  • 连接寄存器R14(LR)
    每种模式下r14都有自身版组,它有两个特殊功能:

  1. 保存子程序返回地址。
  2. 当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。
  • 程序计数寄存器R15
    PC 指向当前的程序地址。如果修改它的值,就能改变程序的执行流。

实现原理

查看死机时PC,LR,SP三个特殊的寄存器的值。然后通过仿真中的汇编直接查找对应的程序。

实际操作

首先需要准备好jlink和三根杜邦线链接SDO、SCK和GND。千万不要连复位引脚,因为很有可能不小心复位了,导致案发现场被破坏。
然后打开Jlink Commander软件
在这里插入图片描述

1、敲入以下命令:connect
根据提示选择对应芯片
在这里插入图片描述
2、输入h:
可以看到对应指针的值,记下这三个值。因为我的程序都在sdram里面跑,在rt1052单片机中对应的地址都是0x80000000之后的。
在这里插入图片描述

3、可以试下g(go继续跑) 、h(halt)看下程序是否还在跑。因为我这边PC指针一直在这个值,所以怀疑是个死循环。
4、使用mem指令看sp压栈的内容,我们找出附近所有0x80xxxxxxx开头的地址并进行记录。这里是小端模式所以对应的应该是xx xx xx 80。(需要根据实际单片和代码在哪里运行分析,也可能是内部ram0x20xxxxxx,也可能是0x68xxxxxx的sram,stm32芯片外部扩展地址可能与nxp不一致,所以一定要看芯片手册)
在这里插入图片描述
5、断电重启或者另外一台设备进行仿真
在这里插入图片描述
输入需要查询的地址,注意需要加上0x,例如0x80015BBF。先查PC和LR,如果没有什么发现再去看SP指针的那一堆数据中可疑的地址。
在这里插入图片描述
然后定位到了对应函数。这边是因为fifo队列满了导致死循环
在这里插入图片描述

### 关于JLink Commander程序运行中出现崩溃或卡的问题及解决方案 当遇到JLink Commander程序运行过程中发生崩溃或卡的情况时,可以考虑以下几个方面来排查和解决问题。 #### 使用稳定版本的JLink软件 对于市场上存在的一些非正版JLink设备,可能会出现兼容性问题。建议尝试使用较老版本的JLink软件,这有助于规避由于硬件与最新版软件之间可能存在的适配问题所引起的异常状况[^4]。可以从官方网站下载并安装适合当前使用的旧版本JLink工具包。 #### 避免意外复位目标板 连接调试接口时应特别注意不要触碰或接通复位引脚,以免无意间触发系统的重启操作而干扰正常的调试流程。仅需通过杜邦线正确连接SDO、SCK以及GND这三个必要的信号端口即可满足基本通信需求[^2]。 #### 更新至最新的驱动程序 确保计算机上已安装了不低于V4.9版本号以上的官方认证过的JLink驱动程序,并且保持其处于更新状态。这样不仅可以提高稳定性还能增强与其他组件间的协作效率[^1]。 #### 检查物理连接质量 仔细检查所有连线是否存在松动或者接触不良的现象;确认电源供应正常工作;另外也要留意环境因素比如静电放电是否会对测试过程造成影响。 ```bash # 如果怀疑是USB端口供电不足引起的问题, # 可以尝试更换其他USB端口或将电脑接入交流电源适配器后再试。 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒妖71

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值