加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Linux内核的栈回溯与妙用

发布时间:2018-11-14 03:19:13 所属栏目:业界 来源:今日头条
导读:1 前言 说起linux内核的栈回溯功能,我想这对每个Linux内核或驱动开发人员来说,太常见了。如下演示的是linux内核崩溃的一个栈回溯打印,有了这个崩溃打印我们能很快定位到在内核哪个函数崩溃,大概在函数什么位置,大大简化了问题排查过程。 网上或多或少

原理是,当一个内核线程卡死时,首先考虑在某个函数陷入死循环,系统定时钟中断是不断产生的,此时current线程很大概率就是卡死线程(要考虑内核抢占,内核支持抢占时,内核某处陷入死循环照样可以调度出去),然后使用struct pt_regs *regs = get_irq_regs()方法,就能获取中断前线程的pc、sp、fp等寄存器值,有了这些值,就能按照内核线程崩溃栈回溯原理,对卡死线程函数调用过程栈回溯,找到卡死函数。mips架构栈回溯的核心函数show_backtrace()定义如下,只要传入内核线程的struct task_struct和structpt_regs结构,就能对内核线程当时指令的执行进行栈回溯。

  1. static void show_backtrace(struct task_struct *task, const struct pt_regs *regs) 

4.4 应用程序锁死时对所有应用线程的栈回溯

以arm架构为例。当应用锁死,尤其是偶现的锁死卡死问题,可以使用栈回溯的思路解决。以单核CPU为例,应用程序的所有线程,正常情况,两种状态:正在运行和其他状态(大部分情况是休眠)。

休眠的应用线程,一般要先进入内核空间,将应用层运行时的pc、lr、fp等寄存器存入内核栈,执行schdule函数让出CPU使用权,最后线程休眠。此时可以通过tesk_pt_regs函数从线程内核栈中获取线程进入内核空间前的pc、lr、fp等寄存器的数据。正在运行的应用线程,系统定时钟中断产生后,系统要执行硬件定时器中断,此时可以通过get_irq_regs函数获取中断前的pc、lr、fp等寄存器的值。

不管应用线程是否正在运行,都可以获取线程当时用户空间运行指令的pc、lr、fp等寄存器数据。当应用某个线程,不管是使用锁异常而长时间休眠,还是陷入死循环,从内核的进程运行队列中,依次获取到所有应用线程的pc、lr、fp等寄存器的数据后(可以考虑在account_process_tick函数实现),就可以按照前文思路对应用线程栈回溯,找出怀疑点。

实际使用时,要防止内核线程的干扰,task->mm可以用来判断,内核线程为NULL。当然也可以通过线程名字加限制,对疑似的几个线程栈回溯。应用线程正在内核空间运行时,这种情况用这个方法就有问题,这时需加限制,比如通过get_irq_regs函数获取到 pc值后,判断是在内核空间还是用户空间。读者实现该功能时,有不少其他细节要注意,这里不再一一列出。

5 应用程序栈回溯的展望

关于应用程序的栈回溯,笔者正在考虑一个方法,使应用程序的栈回溯能真正像内核一样打印出函数的符号及偏移,比如

现有的方法只能实现如下效果:

之后还得对应用程序反汇编才能找到崩溃的函数。

笔者的分析是,理论上是可以实现的,只要仿照内核的kallsyms方法,按照顺序记录每个应用函数的函数首地址和函数名字到一个文件中,当应用程序崩溃时,内核中读取这个文件,根据崩溃的指令地址在这个文件中搜索,就能找到该指令处于哪个函数中,本质还是实现了与内核kallsyms类似的方法。有了这个功能,不仅应用程序栈回溯能打印函数的名称与偏移,还能让mips架构应用程序崩溃的栈回溯按照内核崩溃栈回溯的原理来实现,不会再出现函数误报现象,不知读者是否理解我的思路?后续有机会,会尝试开发这个功能并分享出来。

6总结

实际项目调试时,发现栈回溯的应用价值非常大,掌握栈回溯的原理,不仅对内核调试有很大帮助,对加深内核的理解也是有不少益处。

这是本人第一次投稿,经验不足,文章可能也有失误的地方,请读者及时提出,但是笔者保证,文章讲解的内容都是经过理论和实际验证的,不会有原理性偏差。有问题请发往笔者邮箱。后续有机会,笔者会将内存管理、文件系统方面的总结分享出来。

【编辑推荐】

  1. 如何使用Linux命令或文件管理器来移动文件?
  2. 运维必备!Linux 远程数据同步工具详解
  3. 15个适用于Linux的最佳安全工具
  4. 在Linux中怎么运行MS-DOS游戏和程序
  5. 如何弄清Linux系统运行何种系统管理程序
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读