前言
嵌入式开发中,如果发生异常如内存访问越界等情况,有时会非常难debug到底是哪里出错,近来看了一下back trace回溯的功能及实现,在这里做个笔记。
backtrace就是回溯堆栈,简单的说就是可以列出当前函数调用关系。在理解backtrace之前我们需要理解一下函数执行过程的中的压栈过程。
ARM微处理器共有37个寄存器,其中31个为通用寄存器,6个为状态寄存器。但是往往这些寄存器都不能同时被访问,需要在特定的模式下访问特定的指令。
但在任何时候,通用寄存器R0~R15、一个或两个状态寄存器都是可访问的。有三个特殊的通用寄存器:R13:在ARM指令中常用作堆栈指针SPR14:也称作子程序连接寄存器(Subroutine Link Register)即连接寄存器LRR15:也称作程序计数器PC。
依次为当前函数指针PC、返回指针LR、栈指针SP、栈基址FP、传入参数个数及指针、本地变量和临时变量。如果函数准备调用另一个函数,跳转之前临时变量区先要保存另一个函数的参数。
PC寄存器和LR寄存器均指向代码段,PC表示当前的代码指向到何处,LR表示当前函数返回后要到哪里去继续执行。
SP和FP用于维护函数的栈空间,其中SP指向栈顶,FP指向上一个函数栈帧的栈顶。
==================================================================================================================================================================================================================
实战
先拿出HardFault机器对应的MAP文件
找到r01对应地址的函数
r06对应函数
lr对应地址函数
pc对应地址函数
分析流程为lr对应地址函数调用pc地址函数发生错误
后续需要分析代码进行具体原因判断
————————————————
版权声明:本文为CSDN博主「墨染 锦年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44710568/article/details/127488559
|