转自: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. Hdoj 1064 Financial Management

    题目描述 Problem Description Larry graduated this year and finally has a job. He's making a lot of money ...

  2. EXTRACT FILES AND IMAGES FROM A SHAREPOINT CONTENT DATABASE

    If you ever had the problem where you need to extract files from a SharePoint Content Database or no ...

  3. CF1073E Segment Sum 解题报告

    CF1073E Segment Sum 题意翻译 给定\(K,L,R\),求\(L~R\)之间最多不包含超过\(K\)个数码的数的和. \(K\le 10,L,R\le 10^{18}\) 数位dp ...

  4. luogu2024 食物链 (并查集)

    把一个点拆成三个,分别对应它的同类.它的猎物和它的天敌,这样的话(以下的相等都是并查集意义上的): 如果令a,b同类,那么a的猎物不能是b的同类,a的天敌不能是b的同类 如果令a吃b,那么a的同类不能 ...

  5. 分数拆分(Fractions Again?!, UVa 10976)

    题目链接:https://vjudge.net/problem/UVA-10976 It is easy to see that for every fraction in the form 1k(k ...

  6. SDL2.0 VLC ubuntu安装和黑屏问题

    开发环境安装: 1,执行:"sudo apt-get build-dep libsdl1.2",确定依赖库都装全了. sdl2.0没有正式发布到ubuntu,使用下面方法安装: h ...

  7. dij与prim算法

    两种算法本质是相同的. 都是从某一个点开始进行延伸,不断更新一个dis值,直到所有的点都被遍历到,从而求出一个最短路或者是一个树的边权的最小总和. 朴素算法都是n^2,都可以采用堆优化处理,降低复杂度 ...

  8. (转)在Eclipse中创建Maven多模块工程

    背景:以前只总结了怎么在命令行下创建maven的多模块项目,在eclipse下怎么创建不是很清楚.最近需要在git的资源库中上传多模块项目,方便后期的维护,所以将网上的资料进行整理. 原文链接:htt ...

  9. 收藏:c语言的多线程同步

    1.<秒杀多线程第一篇 多线程笔试面试题汇总> 2.<秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别> 3.<秒杀 ...

  10. 增加swap分区,文件形式

    查看swap a: sudo swapon -s b: free -m 文件方式: 1. 生成 生成一个1Gb(bs*count)的文件 [root@localhost ~]# dd if=/dev/ ...