dump_stack分析函数调用关系实例及其实现

news2024/11/20 17:37:42

dump_stack分析函数调用关系


文章目录

  • dump_stack分析函数调用关系
  • 一、dump_stack实例
  • 二、dump_stack实现分析
    • Step 1: dump_stack_print_info
    • Step 2: show_stack
  • 三、关于堆栈


一、dump_stack实例

在正点原子阿尔法开发板中查看insmod命令使用什么方法:

#include <linux/module.h>
#include <linux/init.h>




static int hello_init(void){
#ifndef DEBUG

    printk("no def DEBUG\n");
#else
    printk(" def DEBUG\n");
#endif
    dump_stack();
    return 0;

}


static void hello_exit(void){

    printk("hello exit!!!\n");
    

}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Paranoid");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");

dump_stack();函数打印调用关系
在这里插入图片描述
从上往下:
sys_finit_module->load_module->do_init_module->do_one_initcall

所以可知使用的是finit_module
insmod命令流程

insmod_main->bb_init_module->finit_module

二、dump_stack实现分析

通过 grep,发现 dump_stack 函数原型存在于 kernel/lib/dump_stack.c 文件中。它的实现流程如下图所示:
在这里插入图片描述

static void __dump_stack(void)
{
    dump_stack_print_info(KERN_DEFAULT);
    show_stack(NULL, NULL);
}

可以看到关键的两个函数分别是dump_stack_print_info和show_stack。其中第一个函数是用来打印 info 信息的,而第二个函数是用来打印 Call trace的。

Step 1: dump_stack_print_info

第一部分主要实现 print info ,函数比较简单,我们直接看代码:
文件:kernel\kernel\printk\printk.c

/**
 * dump_stack_print_info - print generic debug info for dump_stack()
 * @log_lvl: log level
 *
 * Arch-specific dump_stack() implementations can use this function to
 * print out the same debug information as the generic dump_stack().
 */
void dump_stack_print_info(const char *log_lvl)
{
    printk("%sCPU: %d PID: %d Comm: %.20s %s %s %.*s\n",
           log_lvl, raw_smp_processor_id(), current->pid, current->comm,
           print_tainted(), init_utsname()->release,
           (int)strcspn(init_utsname()->version, " "),
           init_utsname()->version);

    if (dump_stack_arch_desc_str[0] != '\0')
        printk("%sHardware name: %s\n",
               log_lvl, dump_stack_arch_desc_str);

    print_worker_info(log_lvl, current);
}

current指针指向的是当前进程,那么这句代码就是分别打印出了:log_level, CPU id, command, kernel taint state, kernel version

Step 2: show_stack

第二部分的主要功能是实现 Call trace ,它的执行流程如下:
文件:kernel\arch\metag\kernel\traps.c

void show_stack(struct task_struct *tsk, unsigned long *sp)
{
    if (!tsk)
        tsk = current;
    if (tsk == current)
        sp = (unsigned long *)current_stack_pointer;
    else
        sp = (unsigned long *)tsk->thread.kernel_context->AX[0].U0;

    show_trace(tsk, sp, NULL);
}

在这里插入图片描述

kstack_end 是判断是否到达栈底的函数,一个线程堆栈大小为 THREAD_SIZE,SP 寄存器存储的是栈顶,由此可以找到对应的栈底,如果没有到堆栈底部,则每次持续打印出相关的函数调用列表。
接下来就是另一个关键函数 print_ip_sym ,看一下它的代码:

static inline void print_ip_sym(unsigned long ip)
{
    printk("[<%p>] %pS\n", (void *) ip, (void *) ip);
}

可以看到真正的打印函数也就一句代码,这个是真正的精髓所在:

printk("[<%p>] %pS\n", (void *) ip, (void *) ip);

把 %pS 作为格式化参数传递给 printk,printk 将负责把对应地址的函数名打印出来。由此看来,如何从地址转换到函数名这个最复杂的工作内核已经帮你做好了,dump stack 直接去用做好的轮子就行了。

三、关于堆栈

对于ARM 32bit CPU的不同模式,每种模式都有其自己的堆栈,并由SP寄存器指定。在内核态中,通常使用svc mode的堆栈,为了实现不同线程之间的堆栈分离,内核会为每个线程分配一个独立的堆栈地址,并将其存储在task_struct结构体中。当线程调度发生时,相应的堆栈地址会被设置给SP寄存器,以完成对不同线程之间堆栈的切换。

当中断到来时,CPU会进入irq mode进行硬件处理,然后进入svc mode处理中断服务程序。此时使用的堆栈是被中断进程的svc堆栈。dump_stack函数就是通过当前svc mode的SP寄存器打印堆栈信息。因此,dump_stack函数实质上是打印当前堆栈的函数信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[蓝帽杯 2022 初赛]之Misc篇(NSSCTF)刷题记录(复现)⑨

NSSCTF-Misc篇-[蓝帽杯 2022 初赛] 计算机取证&#xff1a;[蓝帽杯 2022 初赛]计算机取证_1[蓝帽杯 2022 初赛]计算机取证_2[蓝帽杯 2022 初赛]计算机取证_3[蓝帽杯 2022 初赛]计算机取证_4 手机取证&#xff1a;[蓝帽杯 2022 初赛]手机取证_1[蓝帽杯 2022 初赛]手机取证_2 网站…

使用堆视图创建3个按钮三角摆放

使用堆视图创建3个按钮三角摆放 效果如图&#xff1a; 分析 从效果图看&#xff0c;想要让3个Button呈三角摆放&#xff0c;需要两个堆视图完成。 首先外部一个大的“垂直堆”&#xff0c;垂直堆第一项放一个Button&#xff0c;第二项放一个“水平堆” 水平堆里再放两个But…

刚入职领导就要求做自动化测试?我懵了,从业务到框架设计总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

深度学习的环境搭建(window+pytorch)

1.检查是否安装CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由 NVIDIA 推出的一种并行计算平台和编程模型&#xff0c;用于利用 NVIDIA GPU&#xff08;Graphics Processing Unit&#xff09;的强大计算能力进行高性能计算任务。CUDA 的主要特点是…

logstash介绍和使用-ELK文章2

官方 Logstash 是免费且开放的服务器端数据处理管道&#xff0c;能够从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的“存储库”中。 下载和文档&#xff1a;https://www.elastic.co/cn/logstash/ docker部署&#xff1a;https://hub.docker.…

教你快速把heic格式转化jpg,4种方法操作简单

教你快速把heic格式转化jpg的方法&#xff0c;因为HEIC格式图片通常出现在苹果公司的iOS 11操作系统及之后的版本中&#xff0c;这是因为苹果公司在这些版本中采用了HEIF&#xff08;高效图像格式&#xff09;作为默认的照片格式来替代JPEG格式。同时&#xff0c;需要注意的是&…

asp.net+sqlserver社区小区流动人口管理系统

该系统的基本功能包括用户登录&#xff0c;管理员信息管理&#xff0c;社区组织管理&#xff0c;常住人口管理&#xff0c;流动人口管理&#xff0c;社区事务管理&#xff0c;社区服务管理&#xff0c;系统用户管理&#xff0c;修改密码等功能。 &#xff08;3&#xff09;功能…

项目分析v2

用户&#xff1a; 登录&#xff1a; 不能重复登录。 在服务端使用一个hashset记录用户的登录状态&#xff0c;如果用户id不在集合里面&#xff0c;就可以登录&#xff0c;登录时将用户id添加到集合中。用户下线时&#xff0c;将set中的元素删除。 登录成功后&#xff0c;服务端…

【语义分割】LinkNet从0到1和代码实现

文章目录 前言1.网络结构1.1 网络结构示意图1.2 创建LinkNet模型 2.代码2.1 各模块搭建2.1.1 卷积模块2.1.2 反卷积模块2.1.3 编码器模块 2.2 编码网络结构2.3 损失函数&训练2.4 训练 前言 已经有了U-net了&#xff0c;为什么需要linkNet&#xff1f; unet见这个文章【语义…

Docker基础篇(很详细)

一、简单介绍 &#xff08;一&#xff09;为什么用docker 开发人员发开完成就发布一个jar或者war包&#xff0c;其他的都交给运维人员来做&#xff1b;而现在&#xff0c;开发即运维&#xff0c;打包部署上线一套流程走完&#xff1a;开发人员会将项目及其附带的环境一起打包j…

UML类图使用介绍

文章目录 一、UML图1、什么是UML图2、类图概述3、类图的作用 二、类的表示方式举个栗子 三、类与类之间关系的表示方式1、关联关系&#xff08;1&#xff09;单向关联&#xff08;2&#xff09;双向关联&#xff08;3&#xff09;自关联 2、聚合关系3、组合关系4、依赖关系5、继…

安全加密基础—基本概念、keytool、openssl

前言 &#xff08;1&#xff09;本文不涉及源码、底层。只是讲解大概的密码演变过程和基本概念。能让接触到相关名词的人知道这些名词是干嘛的&#xff0c;为什么要有它。专业人士可以当作概念梳理&#xff0c;非专业人士可以当作科普。 &#xff08;2&#xff09;本文你将了解…

亿发工业互联网智能制造ERP系统,生产工厂信息化建设解决方案

亿发工业互联网智能制造ERP系统&#xff0c;生产工厂信息化建设解决方案 随着制造水平的发展&#xff0c;传统工厂原有的生产组织模式和质量管理模式已不能满足先进制造水平的要求。确保公司战略目标的实现&#xff0c;有必要借助信息技术加强对各种业务流程的管理。而企业走向…

Leetcode506. 相对名次

Every day a leetcode 题目来源&#xff1a;506. 相对名次 解法1&#xff1a;STL vector 自定义排序 使用 vector<pair<int, int>> 数组v记录原来 score 数组的下标和成绩。 对v按成绩进行降序排序。 新建一个 vector<string> 数组 ans&#xff0c;遍历…

WiFi(Wireless Fidelity)基础(三)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

FP斗篷,2023独立站必看指南

Cloak斗篷技术是一种网络隐身术&#xff0c;通过技术手段实现在网络上匿名和隐身&#xff0c;保护个人隐私和安全。斗篷技术的实现原理是通过使用虚拟专用网络&#xff08;VPN&#xff09;或代理服务器等技术&#xff0c;将用户的真实IP地址隐藏起来&#xff0c;使其在网络上的…

CentOS7离线升级SSH至9.1P1

1、离线安装telnet&#xff08;用telnet登录升级ssh&#xff0c;因为ssh升级时&#xff0c;ssh会话会断开&#xff09; &#xff08;1&#xff09;下载telnet、telnet-server、xinetd&#xff0c;并传到服务器上 http://rpmfind.net/linux/centos/7.9.2009/updates/x86_64/Pack…

目前电视盒子哪个最好?测评20款后整理网络电视盒子推荐

电视盒子是日常必备的数码单品&#xff0c;功能越来越丰富&#xff0c;但很多人不懂要如何选择电视盒子&#xff0c;芯片、内存外还应该考虑系统、技术优化和界面设计等因素。昨天刚刚结束了二十款电视盒子的测评&#xff0c;马上来介绍下我的测评结果&#xff0c;整理了网络电…

flutter mqtt的使用看这里,持续更新

mqtt网络协议&#xff0c;相信跟物联网相关的公司都会遇到&#xff0c;在Android,iOS原生开发是可以很好的实现&#xff0c;相关的资料也是很多&#xff01;但是在flutter里面还算比较尝鲜的一个领域吧&#xff01; 幸亏flutter里面 已经有一个还不错的第三库mqtt_client&…

Springcloud 之Gateway组件详解

目录 1.网关 1.1 网关简介 1.2 网关组件 1.2.1 Gateway介绍 1.2.2 Gateway实践 1.2.3 Gateway执行流程 1.2.4 断言工厂 1.2.5 过滤器 1.网关 1.1 网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多…