深入浅出地讲解rvbacktrace原理

前情提要:栈

        要理解栈回溯,就要首先理解栈是如何运行的

        下面看一段非常简单的代码

uint32_t funB(uint32_t b)
{
    return b-1;
}

void funA(uint32_t a)
{
    uint32_t b = funB(a);
}


int main(void)
{
    board_init();
    funA(3);
    while (1) {
    }
    return 0;
}

         这段代码的逻辑非常简单,调用链也很清晰,在main函数中调用funA,funA中调用funB,main函数的汇编代码如下所示

int main(void)
{
8000648c:	1141                	add	sp,sp,-16
8000648e:	c606                	sw	ra,12(sp)
80006490:	c422                	sw	s0,8(sp)
80006492:	0800                	add	s0,sp,16
    board_init();
80006494:	b16fe0ef          	jal	800047aa <board_init>
    funA(3);
80006498:	450d                	li	a0,3
8000649a:	b7dfd0ef          	jal	80004016 <funA>

        可以看到,当main函数执行时,首先向上开辟了一块栈空间,然后将ra,s0压栈,随后才是用户所写的代码逻辑,对这里用到的两个寄存器进行说明:

        -ra:保存了返回地址,当执行jal时,会将下一条指令的地址保存至ra

        -s0:又叫fp,frame point,栈帧指针,是回溯需要用到的重要寄存器

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值