linux show stack/dump_stack函数分析

show_stack 和 dump_stack 是内核调试的重要工具。

1,show_stack函数分析

show_stack 函数用于打印当前进程或指定进程的内核态堆栈信息。其核心功能是回溯函数调用栈,并打印出每个函数的地址。

void show_stack(struct task_struct *task, unsigned long *sp, unsigned long pc)
{
    unsigned long fp;
    unsigned long *stack;

    if (sp == NULL) {
        if (task == NULL)
            sp = (unsigned long *)current_thread_info();
        else
            sp = (unsigned long *)task->thread.sp;
    }

    fp = *sp;
    stack = (unsigned long *)TASK_STACK;

    while (fp >= (unsigned long)stack && fp < (unsigned long)stack + THREAD_SIZE) {
        unsigned long lr = fp[1];
        unsigned long ra = fp[2];

        printk("fp: %08lx lr: %08lx ra: %08lx\n", fp, lr, ra);
        fp = (unsigned long *)fp[0];
    }
}

2,dump_stack函数分析

void dump_stack(void) {
    dump_backtrace(NULL, NULL);
}

static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) {
    unsigned int fp, mode;
    printk("Backtrace: ");
    if (!tsk) tsk = current;
    if (regs) {
        fp = regs->ARM_fp;
        mode = processor_mode(regs);
    } else {
        asm("mov %0, fp" : "=r" (fp));
        mode = 0x10;
    }
    if (fp) {
        c_backtrace(fp, mode);  // 调用汇编函数回溯栈
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陌上花开缓缓归以

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

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

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

打赏作者

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

抵扣说明:

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

余额充值