dump_stack调用过程【原创】

简介: dump_stack调用: void dump_stack(void){    dump_backtrace(NULL, NULL);} 继续看: static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)...

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));
}

 

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
3月前
|
移动开发 安全 数据安全/隐私保护
class dump使用方式和原理
class dump使用方式和原理
18 0
|
4月前
|
移动开发 安全 数据安全/隐私保护
class dump使用方式和原理
导出的包是经过混淆,经过加固比较安全的包了
|
9月前
|
存储 调度
dump_stack分析函数调用关系实例及其实现
dump_stack分析函数调用关系实例及其实现
56 0
|
Linux
内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
180 0
内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
|
SQL 安全 关系型数据库
故障分析 | 从 data_free 异常说起
临时表 引发的data_free异常案例
501 3
故障分析 | 从 data_free 异常说起
|
Java 机器人 物联网
【C++初阶:内存管理】C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数 下
【C++初阶:内存管理】C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数
149 0
【C++初阶:内存管理】C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数 下
|
存储 Java Linux
【C++初阶:内存管理】C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数 上
【C++初阶:内存管理】C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数
112 0
【C++初阶:内存管理】C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数 上
|
Java 索引
记录一次执行ArrayList的add方法异常细节复盘| Java Debug 笔记
记录一次执行ArrayList的add方法异常细节复盘| Java Debug 笔记
162 0
|
监控 安全 测试技术
C++还在用printf/cout进行Debug?学习一下如何自己写日志库吧(上篇)
日志是出现异常第一个想到的东西,它记录了程序运行过程中所调用的函数,所接受到的值,所执行的行为等等。大家也都看到这篇的标题了,我这个人有一个缺点,就是不太喜欢用别人的东西,如果有能力,我希望自己造,所以今天我们自己来动手撸一个日志库,文章重点讲实现过程,如果需要源码,可以前往github获取[FdogLog,一个轻量级C++日志库,用于日志服务。
C++还在用printf/cout进行Debug?学习一下如何自己写日志库吧(上篇)