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

dump_stack调用过程【原创】的更多相关文章

  1. Hbase的WAL在RegionServer基本调用过程

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/221 来源:腾云阁 https://www.qclo ...

  2. RPC框架调用过程详解

    RPC框架调用过程详解 2017年09月16日 21:14:08 荷叶清泉 阅读数 6275   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  3. FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误

    前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...

  4. pro*c调用过程

    数据库内有无参数过程名为procedure. pro*c调用过程 EXEC SQL EXECUTE   BEGIN     procedure;   END; END-EXEC; 需要在cfg配置文件 ...

  5. Hadoop中客户端和服务器端的方法调用过程

    1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...

  6. Servlet视频学习笔记 57-58 (servlet入门和调用过程)

    网易云课堂<30天轻松掌握JavaWeb视频>servlet部分 课时57 servlet开发入门 servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术.S ...

  7. 最原始的COM组件调用过程(不使用注册表信息)

    最原始的COM组件调用过程(不使用注册表信息) 最近因为项目的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了. 一般调用COM都是通过注册表找到它的位置, 然后 ...

  8. oracle顺序控制语句goto、null和分页过程中输入输出存储、java程序的调用过程

    顺序控制语句1 goto建议不要使用 declare i number:=; begin loop dbms_output.put_line(i); then goto end_loop; end i ...

  9. .net ADF 中 Ajax 的调用过程.

    图示是 .net ADF Ajax调用过程的简略过程: 1,2)当页面初始化之后, 浏览器一旦触发回调事件, 脚本函数负责处理回调信息, 并调用 ASP.NET 2.0/3.5 中的 WebForm_ ...

随机推荐

  1. SQL Server 数据库新建用户

    1.在[安全性]中的[登录名]右键创建登陆用户 2. 输入相关信息 3. 然后去相应的数据库下[安全性]中右键添加用户 4.选择刚刚创建的用户名 5. 选择[默认架构]为 owner 6. 对[拥有的 ...

  2. zju(5)LED控制实验

    1.实验目的 1.学习和掌握如何将一个驱动程序添加到Kconfig,编译到内核. 二.实验内容 1.编写EduKit-IV试验箱Linux操作系统下LED灯的驱动: 2.编写EduKit-IV试验箱L ...

  3. eclipse 导入web项目后,线程假死

    eclipse 导入web项目后,就出现关闭后,线程还存在的情况.使用java mission control 查看发现java script indexing线程在running. 关闭js验证后, ...

  4. cms修改后台目录

    if (!_dirName.Equals("manage")) { if (PageType.IndexOf(_dirName) != -1) { PageType = PageT ...

  5. Python学习笔记——部分常用/特殊用法

    1.使用*号来展开序列,*是序列展开,每个元素都当做一个参数.ls = (1, 2, 3);foo(ls),这样foo只有一个参数,就是ls这个列表本身foo(*ls), foo得到3个参数,分别为1 ...

  6. Color Space: HSI

    HSI色彩空间是从人的视觉系统出发,用色调(Hue).色饱和度(Saturation或Chroma)和亮度 (Intensity或Brightness)来描述色彩.HSI色彩空间可以用一个圆锥空间模型 ...

  7. String-自定义功能

    <script> /* *发现js中的String对象有限,想要对字符串操作的其他功能. *比如:去除字符串两端的空格.这时只能自.定义 */ //去除字符串两端的空格 function ...

  8. my first go

    package main import "fmt" func main() { var num1 int =5 for num1>0 { fmt.Println(" ...

  9. Masonry学习分享

    不完整目录 •UIScrollView 应用Masonry的正确用法 •tableHeaderView使用Masonry •同向文字显示优先级 1.基础篇 1.1基础使用 1.1.1运行效果 1.1. ...

  10. Codevs 1299 切水果

    题目链接 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果 ...