Jlink-commander查找程序跑死

问题现象

写了个测试程序,运行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队列满了导致死循环
在这里插入图片描述

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柒妖71

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

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

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

打赏作者

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

抵扣说明:

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

余额充值