Postsread more
系统崩溃归因:从内核到内存的五层收敛法
系统崩溃归因:从内核到内存的五层收敛法
导语:崩溃分析真正的工作量不在「找到崩溃的那个函数」,而在证明它不是根因。
崩溃报告给出的,几乎总是发现故障的位置,而不是造成故障的位置。
内核是个诚实的证人,但它的证词有偏差:它只在踩到非法内存的那一刻报警。而那块内存可能几毫秒前、也可能十几分钟前就被别人写坏了;那个对象可能早已被回收,指针只是还挂在某个链表上。所以崩溃点天生在下游,根因在上游,两者之间隔着一段时序。
这决定了排查的基本形状:不是去找「谁崩了」,而是沿时间往回退,直到找到一个能被证据钉住、又能被实验证伪的环节。
下面这套分层方法,是我在一次真实的蓝屏排查中逐步磨出来的。它不是检查清单的堆叠,而是一条证据粒度越来越细的收敛链。
五层漏斗:每层只回答一个问题
层与层之间不是并列关系,而是上下游关系。上层的产物是下层的输入,判据是「是否产出一个能被下一层消费的锚点」。没有锚点的层,等于没做。
图 1 · 每层只承担一个问题,且必须交付一个可被下层消费的锚点
越往下越接近机理,也越贵 —— 上层没收敛就别急着往下跳
越往下越接近机理,也越贵 —— 上层没收敛就别急着往下跳
在进入 L1 之前,还有一件成本最低、收益最高的事。