Linux内核栈信息获取与理解

http://www.ilinuxkernel.com/files/2/Linux_kernel_stack.html


Linux内核栈信息获取与理解

1内核栈获取

C语言的函数调用,是通过栈来实现的。如下图所示:

                1. 函数调用栈

内核异常或死机时,经常在内核日志中看到打印的栈信息和寄存器值。从函数栈信息,我们可以知道函数间的调用关系,从栈和寄存器数据,还可以得到各个变量、参数的值。对Linux内核理解和故障定位非常有帮助。


若希望打印出栈信息的函数中加上dump_stack()即可,dump_stack()已导出到内核符号表中,可直接调用。

00276:/*

00277:*Thearchitecture-independentdump_stackgenerator

00278:*/

00279:voiddump_stack(void)

00280:{

00281: unsignedlongstack;

00282:

00283: show_trace(current,NULL,&stack);

00284:}

00285:

00286:EXPORT_SYMBOL(dump_stack);

00287:


若是内核代码,则需要重新编译内核。若是内核模块,编译后,重新加载该模块。注意要控制好打印栈信息的次数和频度。内核中有些代码是大量被执行的,这时要控制打印次数,否则系统长时间无法响应。

下面栈信息是在文件fs/jbd/transaction.c,函数journal_dirty_data()中加入dump_stack()函数后的获取到的栈信息。

2内核栈信息的理解

对于Linux内核栈信息来说,也主要是函数的调用关系。


如下面栈信息:


对于语句:

[<c03743c8>]smp_scan_config+0xa9/0xcb


因为是最后一个函数,c03743c8dump_stack()函数的地址。

linux:~# cat /proc/kallsyms |grep smp_scan_config

c037431ft smp_scan_config


通过查找内核符号表,我们看到smp_scan_config()函数在内核中的地址是c037431f


+0xa9/0xcb”0xa9含义是当前函数在上一层函数内的偏移量。对于本句来说,就是dump_stack()函数在smp_scan_config()内核的偏移量为0xa9,行首打印的地址是c037431f+ a9 = c03743c8 。“0xcb”表示smp_scan_config()函数代码大小为0xcb


同理,我们知道在find_smp_config()函数中调用了smp_scan_config()函数,调用该函数的位置是代码c037441c处,偏移量为0x32find_smp_config()函数大小为0x5c


打印内核栈信息的原理是:将栈中的值都作地址对待,然后根据地址,首先查看该地址是否属于内核代码(text)段或初始代码(inittext)段中的函数。若是,则打印函数信息。

if(is_kernel_text(addr) || is_kernel_inittext(addr))

00165:constchar*kallsyms_lookup(unsignedlongaddr,

00166: unsignedlong*symbolsize,

00167: unsignedlong*offset,

00168: char**modname,char*namebuf)

… …

00179: if((all_var&&is_kernel(addr))||

00180: (!all_var&&(is_kernel_text(addr)||

00181: is_kernel_inittext(addr)||is_kernel_extratext(addr)))){

… …


若不是内核代码(text)段或初始代码(inittext)段中的函数,那么进而查找是为模块(驱动)中的函数。若是,则打印函数信息。


00224: /*seeifit's inamodule*/

00225: msym=module_address_lookup(addr,symbolsize,offset,

modname);

00226: if(msym)

00227: returnstrncpy(namebuf,msym,KSYM_NAME_LEN);


若既不是内核代码(text)段或初始代码(inittext)段中的函数,也不是模块(驱动)中的函数;那么什么信息都不打印,继续取栈中的值,直到栈底。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值