转自:http://blog.chinaunix.net/uid-26403844-id-3361770.html

http://blog.csdn.net/ryfjx6/article/details/7064854

刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们不知到一个函数或者一个模块到底在哪里出了问题时我们可以利用dump_stack有效的找到问题的根源,下面只是简单的给出了使用方法。
  我在自己的主机上试了一下dump_stack()

Makefile文件

点击(此处)折叠或打开

  1. obj-m := hello.o
  2. KERNELBUILD :=/lib/modules/$(shell uname -r)/build
  3. default:
  4. make -C $(KERNELBUILD) M=$(shell pwd) modules
  5. clean:
  6. rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

hello.c文件

点击(此处)折叠或打开

  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/kprobes.h>
  4. #include <asm/traps.h>
  5. MODULE_LICENSE("Dual BSD/GPL");
  6. static int __init hello_init(void)
  7. {
  8. printk(KERN_ALERT "dump_stack start\n");
  9. dump_stack();
  10. printk(KERN_ALERT "dump_stack over\n");
  11. return 0;
  12. }
  13. static void __exit hello_exit(void)
  14. {
  15. printk(KERN_ALERT "test module\n");
  16. }
  17. module_init(hello_init);
  18. module_exit(hello_exit);

注意使用dump_stack()要加上这两个头文件

点击(此处)折叠或打开

  1. #include <linux/kprobes.h>
  2. #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文件

点击(此处)折叠或打开

  1. obj-m := hello.o
  2. #hello-objs := hello-world.o
  3. KVERSION := $(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ
  4. all:
  5. make ARCH=arm CROSS_COMPILE=arm-eabi- -C $(KVERSION) M=$(PWD) modules
  6. clean:
  7. 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的简单使用 【转】的更多相关文章

  1. dump_stack的简单使用

    转载:http://blog.csdn.net/sanchuyayun/article/details/39183941 刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们 ...

  2. dump_stack的简单使用 +CALL TREE

    http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/zifeng274059226/article/ ...

  3. 内核中dump_stack()的实现,并在用户态模拟dump_stack()【转】

    转自:https://blog.csdn.net/jasonchen_gbd/article/details/44066815?utm_source=blogxgwz8 版权声明:本文为博主原创文章, ...

  4. Linux驱动之poll机制的理解与简单使用

    之前在Linux驱动之按键驱动编写(中断方式)中编写的驱动程序,如果没有按键按下.read函数是永远没有返回值的,现在想要做到即使没有按键按下,在一定时间之后也会有返回值.要做到这种功能,可以使用po ...

  5. 写个dump_stack【转】

    转自:http://blog.chinaunix.net/uid-27714502-id-3434761.html 简单实现dump_stack 0.首先确保你能写个内核模块:打印"hell ...

  6. dump_stack 实现分析【转】

    转自:http://kernel.meizu.com/2017/03/18-40-19-dump_stack.html 1 简介 说起 dump_stack() ,相信从事 Linux 内核或者驱动相 ...

  7. 总结一下内核DEBUG中的dump_stack, BUG, BUG_ON以及panic

    有点空闲时间,让我们来总结一下内核DEBUG中的各个语句吧.随便找个内核驱动,在init函数里面加入如下代码测试: u8 a = 1, b = 0; printk("----------du ...

  8. linux内核中打印栈回溯信息 - dump_stack()函数分析【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] ...

  9. 内核中dump_stack的实现原理(1) —— 栈回溯

    环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14   概述     栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助 ...

随机推荐

  1. 22 Zabbix系统版本升级过程

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 22 Zabbix系统版本升级过程 Zabbix升级与其他相类似系统升级一样,前提一定做好备份,备 ...

  2. THUWC2019 摸鱼记

    Day1 菜狗选手无人权,衣服没有海星,狗牌手写全糊,餐票不发刷卡,住宿自理宾馆. 人菜没办法. 感受到了自己智商低 不想写了 想原地退役 不知道还要不要走下去

  3. 【loj3054】【hnoi2019】鱼

    题目 描述 ​ 难以描述.......慢慢看..: ​ https://loj.ac/problem/3054 范围 ​ $6 \le n \le 1000  ,  1 \le |x| , |y| \ ...

  4. P1274 魔术数字游戏 naive搜索+剪枝

    真的naive...... 我把所有能剪的枝都剪了才过的.否则就是TTT 还有个很神奇的事:数组作为参数传进递归函数时会造成上一层函数里的数组的改变.这个我TM调了一天. 下面奉上代码 #includ ...

  5. P1382 楼房 set用法小结

    这个sb题目,剧毒... STL大法好 首先,我准备用经典的线段树优化扫描线来做.之前的矩形周长把我困了数天导致我胸有成竹. 然后,敲代码半小时,调试半个月......这个,sb,怎么改都是0分+2个 ...

  6. 忘记ios访问限制密码

    1.使用iTunes将手机备份在本地. 2.下载iBackupBot,打开后在左侧可以看到你的历史备份,选择刚刚备份的文件.依次选择System Files -> HomeDomain -> ...

  7. Persits.Jpeg CMYK-to-RGB

    这几天发现有几个用户上传的图片显示一个“红叉叉”,用迅雷下载一看,原来图片的“模式”是CMYK,这样的模式是不能在IE中正常显示的. 我想起能不能用程序自动转换呢? 在网上看到利用Persits.Jp ...

  8. 迭代器_iter_,生成器yeild,三元运算,列表解析(十三)

    迭代器: l = [1, 2, 3, 4] iter = l.__iter__() print(iter) print(iter.__next__()) print(iter.__next__()) ...

  9. 使用gdb+core查看错误信息

    core的使用Linux下core文件调试方法 ulimit -c xxx可以设置core文件的大小 proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式. ...

  10. 十、java_IO

    目录: 一.java流式输入/输出原理 二.java流类的分类 三.输入/输出流类 四.常见的节点流和处理流 五.文件流 六.缓冲流 七.数据流 八.转换流 九.Print流 十.Ubject流 一. ...