dump_stack调用过程【原创】

简介:

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博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/6048332.html,如需转载请自行联系原作者

相关文章
|
4月前
|
移动开发 安全 数据安全/隐私保护
class dump使用方式和原理
class dump使用方式和原理
19 0
|
5月前
|
移动开发 安全 数据安全/隐私保护
class dump使用方式和原理
导出的包是经过混淆,经过加固比较安全的包了
|
10月前
|
存储 调度
dump_stack分析函数调用关系实例及其实现
dump_stack分析函数调用关系实例及其实现
61 0
|
设计模式 C++ 容器
C++学习笔记(十九)——stack和queue的模拟实现
C++学习笔记(十九)——stack和queue的模拟实现
C++学习笔记(十九)——stack和queue的模拟实现
|
Linux
内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
183 0
内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
|
Java 索引
记录一次执行ArrayList的add方法异常细节复盘| Java Debug 笔记
记录一次执行ArrayList的add方法异常细节复盘| Java Debug 笔记
162 0
|
Web App开发 Unix Linux
dump系列(3)Qt使用Google Breakpad捕获程序崩溃报告
dump系列(3)Qt使用Google Breakpad捕获程序崩溃报告
251 0