dump_stack的简单使用 【转】
转自:http://blog.chinaunix.net/uid-26403844-id-3361770.html
http://blog.csdn.net/ryfjx6/article/details/7064854
刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们不知到一个函数或者一个模块到底在哪里出了问题时我们可以利用dump_stack有效的找到问题的根源,下面只是简单的给出了使用方法。
我在自己的主机上试了一下dump_stack()
Makefile文件
点击(此处)折叠或打开
- obj-m := hello.o
- KERNELBUILD :=/lib/modules/$(shell uname -r)/build
- default:
- make -C $(KERNELBUILD) M=$(shell pwd) modules
- clean:
- rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions
hello.c文件
点击(此处)折叠或打开
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/kprobes.h>
- #include <asm/traps.h>
- MODULE_LICENSE("Dual BSD/GPL");
- static int __init hello_init(void)
- {
- printk(KERN_ALERT "dump_stack start\n");
- dump_stack();
- printk(KERN_ALERT "dump_stack over\n");
- return 0;
- }
- static void __exit hello_exit(void)
- {
- printk(KERN_ALERT "test module\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
注意使用dump_stack()要加上这两个头文件
点击(此处)折叠或打开
- #include <linux/kprobes.h>
- #include <asm/traps.h>
然后make得到hello.ko
在运行insmod hello.ko把模块插入内核
运行dmesg
[ 3719.352022] usb 1-8: new high speed USB device number 11 using ehci_hcd
[ 4266.252826] usb 1-8: USB disconnect, device number 11
[ 5246.942980] dump_stack start
[ 5246.942985] Pid: 3438, comm: insmod Not tainted 3.0.0-21-generic #35-Ubuntu
[ 5246.942987] Call Trace:
[ 5246.942993] [] hello_init+0x17/0x1000 [hello]
[ 5246.942999] [] do_one_initcall+0x42/0x180
[ 5246.943003] [] sys_init_module+0xbe/0x230
[ 5246.943006] [] system_call_fastpath+0x16/0x1b
[ 5246.943008] dump_stack over
打出运行这个模块时调用的函数
删除模rmmod hello
补充:
Android.mk文件
点击(此处)折叠或打开
- obj-m := hello.o
- #hello-objs := hello-world.o
- KVERSION := $(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ
- all:
- make ARCH=arm CROSS_COMPILE=arm-eabi- -C $(KVERSION) M=$(PWD) modules
- clean:
- make -C $(KVERSION) M=$(PWD) clean
在android编译环境下编译,编译出来的.ko文件可以在手机中insmod
http://blog.csdn.net/sqhxhg/article/details/6369190
一、dump_stack(堆栈转储)作用:主要用于内核调试,打印内核堆栈段信息。
二、使用前便已内核时:使用前,先在内核配置中把kernel debug选上:
make menuconfig:
kernel hacking-->
kernel debug
三、arch/x86/kernel/dumpstack.c
void dump_stack(void){
unsigned long bp=0;
unsigned long stack;
#ifdef CONFIG_FRAME_POINTER
if(!bp)
get_bp(bp);
#endif
printk("pid:%d,comm:%20s %s %s %.*s/n",current->pid,current->comm,print_tainted(),init_utsname()->release,(int)strcspn(init_utsname()->version,init_utsname()->version);
show_trace(NULL,NULL&stack,bp);
}
dump_stack不准确的原因分析
kernel panic后打印的堆栈信息是调用dump_stack函数获得的。而dump_stack的原理是遍历堆栈,把所有可能是内核函数的内容找出来,并打印对应的函数。因为函数调用时会把下一条指令的地址放到堆栈中。所以只要找到这些return address,就可以找到这些return address所在函数,进而打印函数的调用关系。
但是dump_stack可能不准确,可能的原因有三:
1.所有这些可以找到的函数地址,存在/proc/kallsyms中。它并不包括内核中所有的函数,而只包括内核中stext~etext和sinittext~einittext范围的函数,及模块中的函数。详细可参考scripts/kallsyms.c
2.一些函数在编译时进行了优化,把call指令优化为jmp指令,这样在调用时就不会把return address放到堆栈,导致dump_stack时在堆栈中找不到对应的信息。
3.堆栈中可能有一些数值,它们不是return address,但是在内核函数地址的范围里,这些数值会被误认为return address从而打印出错误的调用关系。
dump_stack的简单使用 【转】的更多相关文章
- dump_stack的简单使用
转载:http://blog.csdn.net/sanchuyayun/article/details/39183941 刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们 ...
- dump_stack的简单使用 +CALL TREE
http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/zifeng274059226/article/ ...
- 内核中dump_stack()的实现,并在用户态模拟dump_stack()【转】
转自:https://blog.csdn.net/jasonchen_gbd/article/details/44066815?utm_source=blogxgwz8 版权声明:本文为博主原创文章, ...
- Linux驱动之poll机制的理解与简单使用
之前在Linux驱动之按键驱动编写(中断方式)中编写的驱动程序,如果没有按键按下.read函数是永远没有返回值的,现在想要做到即使没有按键按下,在一定时间之后也会有返回值.要做到这种功能,可以使用po ...
- 写个dump_stack【转】
转自:http://blog.chinaunix.net/uid-27714502-id-3434761.html 简单实现dump_stack 0.首先确保你能写个内核模块:打印"hell ...
- dump_stack 实现分析【转】
转自:http://kernel.meizu.com/2017/03/18-40-19-dump_stack.html 1 简介 说起 dump_stack() ,相信从事 Linux 内核或者驱动相 ...
- 总结一下内核DEBUG中的dump_stack, BUG, BUG_ON以及panic
有点空闲时间,让我们来总结一下内核DEBUG中的各个语句吧.随便找个内核驱动,在init函数里面加入如下代码测试: u8 a = 1, b = 0; printk("----------du ...
- linux内核中打印栈回溯信息 - dump_stack()函数分析【转】
转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接. 目录(?)[-] ...
- 内核中dump_stack的实现原理(1) —— 栈回溯
环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14 概述 栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助 ...
随机推荐
- KEIL中函数定义存在但go to definition却不跳转的原因
可能是 go to definition 函数的地方,被包含在一个未使能的条件编译宏内部,因为这样KEIL在编译时,就未将该条件编译宏内部的信息编译入工程的Browse Information.
- 【转】cJSON 源码分析
cJSON源码分析 简介 由于C语言汇总,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json. JSON是一种轻量级的数据交换格式.JSON采用完全独立与语言的文本格式,易于人阅 ...
- [POI2012]BON-Vouchers----你敢模拟吗?
链接:https://www.luogu.org/problemnew/show/P3536 题意: 定义n个数为幸运数字,一共有n批人,设第i批人有x个,则它们会依次取走余下的x的倍数中最小的x个, ...
- (转)Maven中的DependencyManagement和pluginmanagement
背景:最近在学习maven的多模块构建过程中看到DependencyManagement选项,对这个选项的使用做个记录! 区别与联系 这里介绍一个在父项目中的根结点中声明dependencyManag ...
- StringTokenizer 的性能看来真的不用担心
一直以来,分析HTTP的Header使用的都是StringTokenizer,但是看过jdk中关于StringTokenizer的介绍: StringTokenizer 是出于兼容性的原因而被保留的遗 ...
- MyEclipse新建工作空间后的配置详细步骤
1. General --> Workspace --> UTF-8 2. General --> Editors -->File Associations --> J ...
- vuejs怎么在服务器部署?(知乎)
作者:知乎用户链接:https://www.zhihu.com/question/46630687/answer/157166318来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- python类变量和实例变量的区别
类变量:是为类服务的,类所有的实例都共享使用,在一个地方被改变,所有调用的地方变量值都改变.定义类时的写法为类名.变量名 实例变量:是在实例中生效的,每个实例变量的值都根据实例本身需求进行修改,不会影 ...
- 即将上线的Spark服务器面临的一系列填坑笔记
即将上线的Spark服务器面临的一系列填坑笔记 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 把kafka和flume倒腾玩了,以为可以轻松一段时间了,没想到使用CDH部署的spa ...
- 函数和常用模块【day05】:文件目录开发规范(七)
本节内容 1.背景 2.设计目录结构的好处 3.关于readme的内容 4.关于requirements.txt和setup.py 5.关于配置文件的使用方法 一.背景 "设计项目目录结构& ...