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文件

点击(此处)折叠或打开

  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.  
  6. MODULE_LICENSE("Dual BSD/GPL");
  7.   
  8. static int __init hello_init(void)
  9. {
  10.      printk(KERN_ALERT "dump_stack start\n");
  11.      dump_stack();
  12.      printk(KERN_ALERT "dump_stack over\n");
  13.      return 0;
  14.  }
  15.  static void __exit hello_exit(void)
  16.  {
  17.       printk(KERN_ALERT "test module\n");
  18.  }
  19.  
  20. module_init(hello_init);
  21. 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从而打印出错误的调用关系。 

 

时间: 2024-10-03 18:48:53

dump_stack的简单使用 【转】的相关文章

源代码-怎么样再linux下查看dump_stack()函数打印出来的信息?

问题描述 怎么样再linux下查看dump_stack()函数打印出来的信息? 本人Linux小白,刚学没多久,最近我想要研究下linux中打开文件操作的流程,于是我就在内核的filp open()函数的源代码中插入了dump_stack_()函数. 我重新编译内核之后,直接在终端调用cd 命令行,然后想在系统日志里面看看有没有 函数调用打印出来,但是翻来翻去好像什么都没有的样子. 但是我自己写一个简单的模块,里面有dump_stack_函数,在编译模块,再运行这个模块, 这样的话又可以在日志里

子进程及时知道父进程已经退出的最简单方案

  [精彩] 子进程及时知道父进程已经退出的最简单方案? http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14 [发表评论] [查看原文] [C/C++讨论区][关闭] 要父进程知道子进程退出,这太容易了,但是要子进程知道父进程退出,可有点麻烦.       父进程如果退出,子进程如何知道呢,最笨的方法,父子进程之间建立socket连接,然后建立心跳,没隔1秒测试一把,当然太笨了,通过管道,可以吗?如何做?有更加简单的方法吗?

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

转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] 简介 相关基本知识 关键寄存器介绍 内核中的函数栈 dump_stack函数   简介 当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令.产生错误的原因.关键寄存器的值以及函数调用关系等信息,这

写个dump_stack【转】

转自:http://blog.chinaunix.net/uid-27714502-id-3434761.html 简单实现dump_stack 0.首先确保你能写个内核模块:打印"hello kernel"   如果熟悉dump_stack的话,完全可以绕开此文,或者自己去看dump_stack代码实现之.   1.dump_stack是什么 经常调试内核一定对这个函数不陌生,因为我们大多数人调试内核的时候都受这个函数的 折磨,不信,那么我们调用下这个函数看看(随意写个内核模块调用d

dump_stack 实现分析【转】

转自:http://kernel.meizu.com/2017/03/18-40-19-dump_stack.html 1 简介 说起 dump_stack() ,相信从事 Linux 内核或者驱动相关开发的同行对于此函数肯定不陌生.我们经常会用到此函数来对自己的代码进行 debug,可以快速帮助开发者理清函数调用流程,或者说解决 bug-- 首先我们来看一下 dump_stack 的打印,相信很多人都遇到过 : [ 4.778339] <1>-(1)[258:charger_thread]C

Win 8照片应用欣赏与简单编辑图片

在Win8照片应用中点击想要访问的分类,进入照片预览界面,为方便触控屏用户,Win8采用了横向浏览的方式,我们可以看到多个文件夹,触控屏用户只要滑动手指就能顺畅预览精美图片,鼠标操作可以滑动滚轮,操作都非常方便. 如果需要放大和缩小浏览图片,触控屏用户可以用手指开合来轻松操控,键鼠用户可以点击界面右下角的"+/-"按钮,或者用"Ctrl+鼠标滚轮"灵活缩放图片视图. Win8照片应用缺省按文件夹浏览,在文件夹浏览界面中,点击鼠标右键,屏幕下方会弹出几个选项:按日期浏

ps设计中国水墨风简单的烟雾骏马海报效果

  ps设计中国水墨风简单的烟雾骏马海报效果!简单粗暴,几步即可完成,不管是景观.动物.还是人物都适用,非常棒的设计参考 分类: PS入门教程

简单介绍Python2.x版本中的cmp()方法的使用

  这篇文章主要介绍了简单介绍Python2.x版本中的cmp()方法的使用,然而该方法在Python3.x版本中已并不再内置...需要的朋友可以参考下 cmp()方法比较两个列表的元素. 语法 以下是cmp()方法的语法: ? 1 cmp(list1, list2) 参数 list1 -- 这是要进行比较的第一个列表 list2 -- 这是要进行比较的第二个列表 返回值 如果元素是相同类型的,执行比较,并返回结果.如果元素是不同的类型,检查,看看他们是否是数字 如果是数字必要时强制进行数字比较

ajax同步异步的简单实现

本文为大家介绍下ajax同步异步的简单实现,感兴趣的朋友可以参考下 复制代码 代码如下: $("#btn_saveFWSB").click(function(){  var obj=checkData(arr);  if(obj.flag==true){  hideAddDiv();  $.ajax({  type : "POST",  url : "/vts/doInsertFWZT.do",  async: false ,//ajax同步