应用程序或服务崩溃行为故障排除指南

本文提供有关如何排查应用程序或服务崩溃行为的指南。

适用于: 所有受支持的 Windows Server 和 Windows 客户端版本

在应用程序日志中反复看到事件 ID 1001 和事件 ID 1000 时,它表示应用程序崩溃行为。 它与第一方或第三方进程一起发生,并指向可能的故障模块。

本文详细介绍了检查事件、了解事件中的信息以及根据事件是第一方应用程序还是第三方应用程序处理事件的过程。 此过程使用适用于 Windows 的调试工具。

开始之前

注意事项:

  • 验证是否正在运行已安装操作系统版本的最新更新。
  • 验证受影响的应用程序是否是最新的。
  • 如果安装了防病毒软件,请验证它是否在最新版本上运行,并已准备好必要的排除项。

事件 ID 1001 level 信息显示系统中是否启用了Windows 错误报告(WER)。 但是,需要更改此服务以收集 level 调查所需的信息。 默认情况下,系统不会记录此信息,以免产生轻微的性能开销。

级别 Error 为事件 ID 1000 是实际的应用程序崩溃事件。 它以以下示例的形式显示以下信息:

Log Name:      Application
Source:        Application Error
Date:          <Date Time>
Event ID:      1000
Task Category: Application Crashing Events
Level:         Error
Keywords:      
User:          SYSTEM
Computer:      demo.contoso.com
Description:
Faulting application name: netsh.exe, version: 10.0.22621.1, time stamp: 0x13af0815
Faulting module name: netsh.exe, version: 10.0.22621.1, time stamp: 0x13af0815
Exception code: 0xc0000005
Fault offset: 0x0000000000005399
Faulting process id: 0x0xFEE4
Faulting application start time: 0x0x1DAB66BB5BE07D4
Faulting application path: C:\WINDOWS\system32\netsh.exe
Faulting module path: C:\WINDOWS\system32\netsh.exe
Report Id: <Report ID>
Faulting package full name: 
Faulting package-relative application ID:

它通常将Microsoft模块呈现为故障模块, 例如,ntdll.dllkernel32.dllkernelbase.dll。 这些模块在进程在用户模式和内核模式之间运行和转换时大量使用。 在此过程中,他们被抓获为以前由行为不当模块执行的其他类型的腐败的受害者。

常见异常:

  • 0xc0000022

    STATUS_ACCESS_DENIED

  • 0xc0000005

    STATUS_ACCESS_VIOLATION

  • 0xc0000374

    STATUS_HEAP_CORRUPTION

发生异常时,可以使用Windows 错误报告(WER)和 GFlagsgflags.exe)为进程启用其他详细日志记录并收集完整进程转储。

安装适用于 Windows调试工具以获取gflags.exe,因为它包含在工具中。 但是,只需复制文件,而无需在需要故障排除的计算机上安装工具。

收集数据

对于前面的netsh.exe崩溃示例,请设置计算机以收集转储,以获取有关导致崩溃的原因的详细信息。 将netsh.exe替换为设备上事件 ID 1000 中标识的可执行文件。

  1. 通过从提升的命令提示符运行以下命令,设置 WER 以收集异常的完整进程转储:

    reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe"
    
    reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe"/v DumpFolder /t REG_EXPAND_SZ /d "C:\WER" /f
    
    md C:\WER
    
    reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe" /v DumpCount /t REG_DWORD /d 10 /f
    
    reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe" /v DumpType /t REG_DWORD /d 2 /f
    
    reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe"
    
    reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe" /v DumpFolder /t REG_EXPAND_SZ /d "C:\WER" /f
    
    reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe" /v DumpCount /t REG_DWORD /d 10 /f
    
    reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps\netsh.exe" /v DumpType /t REG_DWORD /d 2 /f
    

    这些命令最多允许收集并存储在 C:\WER 文件夹中的netsh.exe进程的 10 个完整进程转储

    注意

    添加了 Windows 64(WOW64)注册表位置上的 Windows,它允许 32 位应用程序在 64 位系统上运行。

  2. 设置 GFlags 以监视堆分配以跟踪损坏。

    导航到工具所在的目录,并从提升的命令提示符运行以下命令。

    若要打开 “启用页面堆 ”(hpa)标志,请执行以下操作:

    Gflags.exe /i netsh.exe +hpa
    

    若要关闭“启用页面堆”标志,请执行以下操作

    Gflags.exe /i netsh.exe -hpa
    

    重启设置生效的过程。

  3. 监视 C:\WER 文件夹并检查是否创建了任何转储。

分析数据

获得进程转储后,可以:

  • 如果进程是第三方进程,则与第三方共享相关转储以进行调查。
  • 如果流程是第一方进程,请联系Microsoft 支持部门分析数据。
  • 使用适用于 Windows 的调试工具安装的调试器(windbg.exe),并尝试使用 !analyze 扩展来确定故障模块。

收集数据并完成调查后,请删除注册表项(包含进程名称的注册表项),并关闭 GFlags 的“启用页面堆 ”标志。