博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dump_stack调用过程【原创】
阅读量:6692 次
发布时间:2019-06-25

本文共 2017 字,大约阅读时间需要 6 分钟。

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;
    int ok = 1;
    printk("Backtrace: ");
    if (!tsk)
        tsk = current;
    if (regs) {
        fp = regs->ARM_fp;
        mode = processor_mode(regs);
    } else if (tsk != current) {
        fp = thread_saved_fp(tsk);
        mode = 0x10;
    } else {
        asm("mov %0, fp" : "=r" (fp) : : "cc");
        mode = 0x10;
    }
    if (!fp) {
        printk("no frame pointer");
        ok = 0;
    } else if (verify_stack(fp)) {
        printk("invalid frame pointer 0x%08x", fp);
        ok = 0;
    } else if (fp < (unsigned long)end_of_stack(tsk))
        printk("frame pointer underflow");
    printk("\n");
    if (ok)
        c_backtrace(fp, mode);
}
#endif

我们搜索这个 c_backtrace 函数

在arch\arm\lib中 backtrace.S中

#include <linux/linkage.h>

#include <asm/assembler.h>
        .text
@ fp is 0 or stack frame
#define frame    r4
#define sv_fp    r5
#define sv_pc    r6
#define mask    r7
#define offset    r8
ENTRY(c_backtrace)

。。。。

1003:        ldr    r2, [sv_pc, #-4]    @ if stmfd sp!, {args} exists,

        ldr    r3, .Ldsi+4        @ adjust saved 'pc' back one
        teq    r3, r2, lsr #10        @ instruction
        subne    r0, sv_pc, #4        @ allow for mov
        subeq    r0, sv_pc, #8        @ allow for mov + stmia
        ldr    r1, [frame, #-4]    @ get saved lr
        mov    r2, frame
        bic    r1, r1, mask        @ mask PC/LR for the mode
        bl    dump_backtrace_entry
        ldr    r1, [sv_pc, #-4]    @ if stmfd sp!, {args} exists,
        ldr    r3, .Ldsi+4
        teq    r3, r1, lsr #10
        ldreq    r0, [frame, #-8]    @ get sp
        subeq    r0, r0, #4        @ point at the last arg
        bleq    .Ldumpstm        @ dump saved registers
1004:        ldr    r1, [sv_pc, #0]        @ if stmfd sp!, {..., fp, ip, lr, pc}

 

再看这个函数 dump_backtrace_entry

void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)

{
#ifdef CONFIG_KALLSYMS
    printk("[<%08lx>] (%pS) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
#else
    printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
#endif
    if (in_exception_text(where))
        dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
}

 

转载于:https://www.cnblogs.com/sky-heaven/p/6048332.html

你可能感兴趣的文章
nginx 负载均衡5种方式及其服务器几种状态
查看>>
每天早上七点钟备份公司的web站点计划
查看>>
iOS GCD(Grand Central Dispatch)的使用(1)
查看>>
linux ftp上传下载命令操作
查看>>
ELK实时日志分析平台(elk+kafka+metricbeat)-metricbeat(三)
查看>>
Linux命令之帮助命令
查看>>
NGINX由入门到精通:编译安装nginx
查看>>
救援模式修复bootloader
查看>>
Java中元组的使用
查看>>
medusa 2.0的简单使用
查看>>
照片美妆---人脸老化
查看>>
zabbix3.2升级3.4报错Database error
查看>>
在C#中使用官方驱动操作MongoDB
查看>>
《精通javascript》几个简单的函数(一)
查看>>
XML 编辑器 介绍
查看>>
Makefile 中:= ?= += =的区别【转】
查看>>
linux内核栈与用户栈【转】
查看>>
Thread thread2 = new Thread()
查看>>
Hadoop 概述
查看>>
jquery select
查看>>