日期:2014-05-16  浏览次数:20700 次

高手帮忙解释一下dump_stack()打印出来的信息,谢谢
听人说dump_stack()在调试中很有用,比printk好用,所以试了一下,但是不知道dump_stack()打出来的是什么东西 

望高手指点一下啊,谢谢!

这个是我的模块源码
new_module.c 

#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int g_hello_init()
{
  printk(KERN_DEBUG "This is new module_init!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
  dump_stack();
  return 0;
}
static void g_hello_exit()
{
  printk(KERN_DEBUG "This is new module_exit~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
module_init(g_hello_init);
module_exit(g_hello_exit);


这个是内核打出来的对应信息 

<7>This is new module_init!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<4>[<c005b3bc>] (dump_stack+0x0/0x14) from [<bf014034>] (g_hello_init+0x18/0x24 [new_module])
<4>[<bf01401c>] (g_hello_init+0x0/0x24 [new_module]) from [<c0056304>] (do_one_initcall+0x34/0x188)
<4>[<c00562d0>] (do_one_initcall+0x0/0x188) from [<c00ac10c>] (sys_init_module+0x90/0x1a0)
<4>[<c00ac07c>] (sys_init_module+0x0/0x1a0) from [<c0056f20>] (ret_fast_syscall+0x0/0x2c)
<4> r7:00000080 r6:00000000 r5:beb5dd24 r4:00000254
<4>1312.966 - <6>init: event { 'add', '/module/new_module', 'module', '', -1, -1 }


------解决方案--------------------
打印内核调用栈,非常有用啊,但是不能替代printk,因为只能打印内核调用栈
可以看出
insmod 模块 之后,sys_init_module -->do_one_initcall ->g_hello_init->dump_stack
其中g_hello_init 就是你写的模块初始化函数

一般用在内核panic时定位发生错误的函数