Linux内核的栈回溯与妙用
发布时间:2018-11-15 11:24:24 所属栏目:业界 来源:今日头条
导读:副标题#e# 1 前言 说起linux内核的栈回溯功能,我想这对每个Linux内核或驱动开发人员来说,太常见了。如下演示的是linux内核崩溃的一个栈回溯打印,有了这个崩溃打印我们能很快定位到在内核哪个函数崩溃,大概在函数什么位置,大大简化了问题排查过程。 网
|
当A函数中崩溃时,先从fp寄存器中获取A函数栈的第二片内存地址,从中取出B函数栈的第二片内存地址,再从A函数栈的第一片内存取出A函数的返回地址,也就是B函数中的指令地址,这样就推导出B函数调用了A函数,同理推导出C函数调用了B函数。 演示的代码很简答,但是这个分析是适用于复杂函数的,已经实际验证过。 3.1.3 arm 内核栈回溯的“bug” 这个不是我危言耸听,是实际测出来的。比如如下代码: 这个函数调用流程在内核崩溃了,内核栈回溯是不会打印上边的b函数,有arm 64系统的读者可以验证一下,我多次验证得出的结论是,如果崩溃的函数没有执行其他函数,就会打乱栈回溯规则,为什么呢?请回头看上一节的代码演示 汇编代码是 可以发现,test_a_函数前两条指令不是stpx29, x30,[sp,#-16]和mov x29,sp,这两条指令可是栈回溯的关键环节。怎么解决呢?仔细分析的话,是可以解决的。 (编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

