You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10类kernel_panic功能函数定位失败问题排查求助

Windows 10中对应Linux kernel_panic的崩溃触发函数定位问题

问题背景

Linux中有kernel_panic函数负责触发系统崩溃,我想在Windows 10中找到功能等效的函数符号,让分析工具通过内存地址捕获系统崩溃事件。

我尝试通过调试定位该函数:针对常见BSOD(如IRQL_NOT_LESS_EQUAL、PAGE_FAULT_IN_NONPAGED_AREA,tcpip.sys错误引发的崩溃),计划手动触发崩溃后查看调用栈追踪目标函数,但内核模式下无法使用Windbg的.call命令。从调试输出看页面相关问题集中在nt内核,但替换RIP为相关函数地址的操作均无效,请问我的思路和操作存在什么问题?

调试输出:

1: kd> x *!*page*fault*
fffff800`3e96ea44 nt!MiResolvePageFileFault (void)
fffff800`3e9268d0 nt!MiInitializePageFaultPacket (void)
fffff800`3e92e57c nt!PfSnLogPageFaultCommon (void)
fffff800`3eb35434 nt!EtwpCoverageSamplerPageFault (EtwpCoverageSamplerPageFault)
fffff800`3e8733b4 nt!PfSnLogPageFault (PfSnLogPageFault)
fffff800`3e865ab0 nt!xHalIommuServicePageFault (xHalIommuServicePageFault)
fffff800`3e9e0880 nt!KiPageFault (KiPageFault)
fffff800`3eb4c800 nt!KiPageFaultShadow (KiPageFaultShadow)
fffff800`3eb2dbf4 nt!EtwTracePageFault (EtwTracePageFault)
fffff800`3eb3c000 nt!ExpSvmServicePageFault (ExpSvmServicePageFault)
fffff800`3ead9bf8 nt!MiLargePageFault (MiLargePageFault)
fffff800`3f2cd9c0 hal!IvtGetPageFault (IvtGetPageFault)
fffff800`3f2d0070 hal!HsaDismissPageFault (HsaDismissPageFault)
fffff800`3f2c9940 hal!IommupHvDismissPageFault (IommupHvDismissPageFault)
fffff800`3f2ccfe0 hal!IvtDismissPageFault (IvtDismissPageFault)
fffff800`3f2d0a60 hal!HsaGetPageFault (HsaGetPageFault)
fffff800`3f31bf80 hal!HalpBlkPageFault (HalpBlkPageFault)
fffff800`3f2c9a80 hal!IommupHvGetPageFault (IommupHvGetPageFault)
fffff802`42434fb8 Wof!g_PagesFaultedOnAgain = <no type information>
fffff802`4446916c dxgmms2!VIDMM_GLOBAL::PageInFaultedAllocation (void)
fffff802`4449b5ec dxgmms2!VIDMM_GLOBAL::PageInFromFaultedList (public: long __cdecl VIDMM_GLOBAL::PageInFromFaultedList(class VIDMM_DEVICE *))



1: kd> x *!*irql*less*
fffff802`41daf7ec acpiex!PlExtpVerifyIrqlLessThanOrEqual (PlExtpVerifyIrqlLessThanOrEqual)

1: kd> db tcpip!TCPIP_MEMORY_FAILURES   --->    a constant unfortunately
fffff802`42a0d900  55 04 00 10 02 00 55 04-80 00 00 00 80 00 00 80  U.....U.........
fffff802`42a0d910  92 05 00 10 05 00 89 05-00 00 00 00 01 00 00 80  ................

问题分析与解决方案

1. 核心错误:定位了错误的函数层级

你当前查找的KiPageFault、MiResolvePageFileFault等是异常处理的中间环节,并非Windows中对应kernel_panic的最终崩溃触发函数。Windows所有BSOD的统一入口是nt!KeBugCheckEx,所有不可恢复的错误(包括你提到的IRQL、页错误、tcpip.sys异常)最终都会调用这个函数触发系统崩溃。

2. 替换RIP无效的原因

内核模式下直接修改RIP跳转到KiPageFault这类中间函数,缺少必要的上下文:

  • 这类函数是中断/异常的处理例程,需要特定的错误码、栈帧结构、硬件寄存器状态才能正常执行
  • 没有前置异常触发的情况下,强行跳转只会导致上下文混乱,无法走到崩溃逻辑

3. 正确的定位与验证方法

  • 找到等效函数:执行命令x nt!KeBugCheck*,会看到nt!KeBugCheckEx(核心函数)和nt!KeBugCheck(封装函数),前者就是你要找的目标。
  • 手动触发崩溃验证:在Windbg内核调试中直接执行内置命令!crash,系统会触发BSOD,此时查看调用栈会清晰看到最终调用链指向nt!KeBugCheckEx。
  • 捕获崩溃事件:分析工具只需监控nt!KeBugCheckEx的内存地址,所有系统崩溃都会经过这个函数。

补充说明

你提到的各类BSOD错误码(如0xA对应IRQL_NOT_LESS_EQUAL、0x50对应PAGE_FAULT_IN_NONPAGED_AREA),都是作为参数传递给KeBugCheckEx的,该函数负责收集崩溃信息、生成dump并终止系统运行。

内容的提问来源于stack exchange,提问作者anonymous bear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:05:24