转自: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. ANDROID 实现 再按一次返回键退出程序 代码片段

    //1.声明变量 // 退出时间 private long currentBackPressedTime = 0; // 退出间隔 private static final int BACK_PRES ...

  2. MVC 4 图片的上传及显示

    1 首先我们看一下如何上传 1.1 view 上传页面: 1: @using (Html.BeginForm("Create", "Achievement", ...

  3. SharePoint 2013 pre-config

    #region 1. add winrm, application server and web server role Add-WindowsFeature winrm-iis-ext, Appli ...

  4. hdu 2577 How to Type(dp)

    Problem Description Pirates have finished developing the typing software. He called Cathy to test hi ...

  5. google gson

    发现了google的gson,因为之前对于protocolbuf有一些了解,带着一些好奇心,我开始使用了gson. 经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实 ...

  6. A1052. Linked List Sorting

    A linked list consists of a series of structures, which are not necessarily adjacent in memory. We a ...

  7. Java:读取系统信息

    com.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) Managem ...

  8. zoj3707(Calculate Prime S)解题报告

    1.计算(a/b)%c,其中b能整除a 设a=b*r=(bc)*s+b*t 则(b*t)为a除以bc的余数 r=c*s+t 而 (a/b)%c=r%c=t (a%bc)/b=(b*t)/b=t 所以对 ...

  9. jenkins Pipeline 使用

    说明 Jenkins pipeline 是一套插件,支持将连续输送管道实施和整合到Jenkins.Pipeline提供了一组可扩展的工具,用于通过管道DSL为代码创建简单到复杂的传送流水线.他目前支持 ...

  10. 通过Cloudera Manager部署CDH5.15.1的webUI界面详解

    通过Cloudera Manager部署CDH5.15.1的webUI界面详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客CDH的部署完全通过Cloudera Mana ...