备注

对于 Windows 错误检查代码的一般故障排除,请遵循以下建议:

  • 如果最近添加了新的设备驱动程序或者系统服务,请尝试删除或者更新它们。尝试确定系统中导致新错误检查代码出现的更改。
  • 在设备管理器中查看是否有任何设备标有感叹号 (!),这表示存在问题。查看属性中显示的任何故障设备驱动程序的事件日志。尝试更新相关驱动程序。
  • 检查事件查看器中的系统日志以获取可能有助于查明导致错误的设备或者驱动程序的其他错误消息。在系统日志中查找与蓝屏在同一时间窗口中发生的严重错误。
  • 如果我们最近向系统添加了硬件,请尝试移除或者更换它。或者与制造商联系以查看是否有可用的补丁。

有关其他常规故障排除信息,请参阅蓝屏数据。

Windows 蓝屏代码 0x3B:SYSTEM_SERVICE_EXCEPTION

SYSTEM_SERVICE_EXCEPTION 错误检查的值为 0x0000003B。
这表明在执行从非特权代码转换为特权代码的例程时发生了异常。

on  it road.com

解决方法

要调试此问题,请使用带有参数 3 的 .cxr(显示上下文记录)命令,然后使用 kb(显示堆栈回溯)。

我们还可以在此停止代码之前的代码中设置一个断点,并尝试单步前进到出错的代码中。
使用 u 、 ub 、 uu(反汇编)命令查看汇编程序代码。

!analyze 调试器扩展显示有关错误检查的信息,有助于确定根本原因。
详细步骤查看我们的教程 在windows 中使用WinDBG 调试dmp文件

以下示例是 !analyze 的输出。

SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: fffff802328375b0, Address of the instruction which caused the bugcheck
Arg3: ffff9c0a746c2330, Address of the context record for the exception that caused the bugcheck
Arg4: 0000000000000000, zero.
...

有关 WinDbg 和 !analyze 的更多信息,请参阅以下主题:

  • 使用 !analyze 扩展
  • 使用 WinDbg分析内核模式转储文件

识别驱动程序

如果可以识别导致错误的驱动程序,其名称将打印在蓝屏并存储在内存中的位置 (PUNICODE_STRING) KiBugCheckDriver 。
我们可以使用调试器命令 dx(显示调试器对象模型表达式)来显示:dx KiBugCheckDriver

使用 !error 扩展来显示有关参数 1 中异常代码的信息。

以下是 !error 的输出示例。

2: kd> !error 00000000c0000005
Error code: (NTSTATUS) 0xc0000005 (3221225477) - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.

查看 WinDbg 的 STACK TEXT 输出,了解有关发生故障时正在运行的内容的线索。
如果有多个转储文件可用,请比较它们的信息以查找堆栈中的公共代码。
使用 kb(显示堆栈回溯)等调试器命令来调查有问题的代码。

使用以下命令列出加载到内存中的模块: lm tn

使用 !memusage 检查系统内存的一般状态。
我们还可以使用命令 !pte 和 !pool 来检查内存的特定区域。

过去,此错误与过度使用分页池有关,这可能是由于用户模式图形驱动程序交叉并将错误数据传递给内核代码而发生的。
如果我们怀疑是这种情况,请使用 Driver Verifier 中的池选项来收集其他信息。

Driver Verifier

Driver Verifier 是一种实时运行以检查驱动程序行为的工具。
例如,Driver Verifier 检查内存资源的使用,例如内存池。
如果它在驱动程序代码的执行中发现错误,它会主动创建一个异常,以允许进一步检查该部分驱动程序代码。
Driver Verifier Manager 内置于 Windows 中,可在所有 Windows PC 上使用。

要启动 Driver Verifier Manager,请在命令提示符下输入 verifier。
我们可以配置要验证的驱动程序。
验证驱动程序的代码在运行时会增加开销,因此请尝试验证尽可能少的驱动程序。
有关详细信息,请参阅驱动程序验证程序。

原因

此停止代码表示正在执行的代码出现异常,并且其下方的线程是系统线程。

NTSTATUS 值中描述了参数 1 中返回的异常信息。

异常代码在 ntstatus.h 中定义,ntstatus.h 是 Windows 驱动程序工具包提供的头文件。

(有关详细信息,请参阅 Windows 驱动程序工具包中的头文件)。

常见的异常代码包括:

  • 0x80000003:STATUS_BREAKPOINT
    当没有内核调试器连接到系统时遇到断点或者断言。
  • 0xC0000005:STATUS_ACCESS_VIOLATION
    发生内存访问冲突。(错误检查的参数 4 是驱动程序尝试访问的地址。)

SYSTEM_SERVICE_EXCEPTION 参数

参数说明
1导致错误检查的异常。
2导致错误检查的指令地址 导致错误检查
3的异常的上下文记录地址
40
日期:2020-09-17 00:15:54 来源:oir作者:oir