推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

函数调用栈分析工程师手册

资料介绍

函数调用栈分析工程师手册 概述 在嵌入式开发里,函数调用栈(Call Stack)是一个既熟悉又陌生的概念。熟悉,是因为每个程序跑起来都离不开它;陌生,是因为真到程序崩溃或者死机的时候,很少有人能又快又准地把它读明白。这一讲,我们就把函数调用栈掰开揉碎,一步步看清它到底是什么、怎么工作、出了问题又该怎么定位。 我们先来看一个最朴素的场景:你的单片机程序跑着跑着突然进不了中断,或者跑出个莫名其妙的野指针错误。这时候很多人的第一反应是"看代码找逻辑错误",但其实错往往不在逻辑,而在调用栈被破坏或溢出。读懂调用栈,往往比逐行读代码更快地锁定真凶。 这一讲我们采用培训讲义的方式,从原理讲起,逐步过渡到实战技巧。你会发现,调用栈并不是什么高深莫测的东西,它本质就是一块内存、一组指针、外加一套严格的"进出规矩"。把这套规矩吃透了,绝大多数与栈相关的疑难杂症都能迎刃而解。 【小引言】本节为总览:先建立调用栈的整体画面,再逐个击破原理、参数、设计与故障排查。 工作原理 我们来看调用栈的核心机制。当一个函数被调用时,处理器会做两件事:一是把返回地址压入栈中,二是为本次调用的局部变量和参数分配栈空间。这两件事合在一起,就形成了通常所说的"栈帧"(Stack Frame)。栈帧是调用栈的基本单元,每次函数调用对应一个栈帧,函数返回时这个栈帧就被弹出释放。 我们再深入一层。在 ARM 架构里,栈的生长方向是向下的,即栈顶地址不断减小。函数入口处,编译器会通过压栈指令把需要保存的寄存器(尤其是返回地址寄存器和保存用的通用寄存器)依次压入栈中,并更新栈指针。函数退出时,则按相反的顺序弹栈恢复。这个过程看似机械,却要求严格的配对,任何一处压栈与弹栈的不对称,都会导致返回地址错乱。 我们来看一个关键点:栈指针和帧指针的区别。栈指针始终指向当前栈顶,随压弹栈不断变化;

部分文件列表

文件名 大小
函数调用栈分析工程师手册.docx 41K

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载