Skip to main content

2026 年 9 月 28 日

操作系统崩溃分析

在适用于 Windows 和 Horizon 的 Omnissa Workspace ONE Experience Management 环境中使用增强的操作系统崩溃分析功能,可帮助捕获根本原因事件,而不是捕获内核级别的事件。此功能默认已激活。

收集的设备数据

适用于 Windows 和 Horizon 的体验管理代理使用 ExternalDumpAnalyzer 进程(包含在代理中)收集所列的操作系统崩溃分析功能属性。

列属性数据类别数据说明相关事件
完整堆栈跟踪complete_stack_trace设备诊断/崩溃诊断数据从操作系统崩溃转储分析捕获的完整堆栈跟踪。

这是一个文本字段,可能包含多个用于诊断系统崩溃的堆栈帧。
来自 DeviceEventTracker 的系统崩溃
归因模块caused_by_module设备诊断/崩溃诊断数据由转储分析标识为与崩溃原因关联的模块或驱动程序,例如,.dll、.sys 或模块名称。

这是一个字符串字段。
来自 DeviceEventTracker 的系统崩溃
关联进程process_associated_with设备诊断/崩溃诊断数据根据转储分析确定的与系统崩溃关联的进程名称。

这是一个字符串字段。
来自 DeviceEventTracker 的系统崩溃

要求

在将增强的操作系统崩溃分析功能部署到 Windows 设备之前,请确保您已满足所列的要求。

  • 使用适用于 Windows 的体验管理和 Horizon 代理 26.07 或更高版本。
  • 确保设备的符号缓存目录可供 Workspace ONE Endpoint Telemetry 服务帐户写入。
  • 确保设备可以直接或通过配置的代理访问位于 http://msdl.microsoft.com/download/symbols 的 Microsoft 公用符号服务器。
  • 在设备上安装并使用 WinDbg。
  • 对服务方案使用系统级别的环境变量。
  • 重新启动 Workspace ONE Endpoint Telemetry 服务,或在更改系统级别的环境变量后重新启动系统。

此功能的工作原理是什么?

当体验管理检测到 Windows 操作系统崩溃转储时,DeviceEventTracker 会启动 ExternalDumpAnalyzer 进程 (ws1dumpa.exe)。有两种操作系统崩溃分析模式:IPC(进程间通信)模式和独立模式。

IPC 模式

  • 当 Windows 操作系统崩溃发生且系统检测到操作系统崩溃转储时,DeviceEventTracker 会从 C:\Program Files\WorkspaceONE\Endpoint Telemetry\Tools\ws1dumpa.exe 启动 ExternalDumpAnalyzer 进程。
  • 崩溃转储路径将作为参数传递到该进程。
  • 开始分析之前,ws1dumpa.exe 会执行以下验证。
    • 该请求正在以 SYSTEM 或管理员特权运行。
    • 转储文件存在。
    • 调试器工具可用。
    • 网络连接可用。
    • 如果任何验证失败,系统将记录相应的警告或错误消息。
  • 验证后,ExternalDumpAnalyzer 进程将执行下列步骤。
    • 使用安装的调试器分析转储。
    • 生成崩溃分析结果。
    • 将结果报告回遥测服务。
  • 分析器输出包括以下扩充的崩溃字段。
    • process_associated_with
    • caused_by_module
    • complete_stack_trace

调试器回退

如果调试器工具不可用,分析器将回退到内置调试器。它会将内置的 Windows 调试助手与崩溃转储详细信息、最小进程、模块信息和 complete_stack_trace 的符号选项搭配使用。complete_stack_trace 符号选项有助于进行分析。

符号解析

  • 如果网络连接可用,则系统可以 从符号服务器下载匹配的符号。WinDbg 使用这些符号进行准确的分析。
  • 如果网络不可用,但所需的符号已存在于本地缓存中,分析器也可以使用它们。

分析回退

如果外部分析由于任何原因而失败,DeviceEventTracker 将回退到内嵌转储分析。它会将内置的 Windows 调试助手与崩溃转储详细信息、最小进程、模块信息和 complete_stack_trace 的符号选项搭配使用。complete_stack_trace 符号选项有助于进行分析。

最后, 系统会生成 system_crash 事件,并将其与这些扩充的属性一起发送到体验管理。

独立模式

您也可以通过提供转储文件作为参数,独立执行 ExternalDumpAnalyzer 进程。

  1. 以管理员身份打开命令提示符。
  2. 运行以下命令 C:\Program Files\WorkspaceONE\Endpoint Telemetry\Tools\ws1dumpa.exe "dumpfilepath"。

行为

  • 所有验证和分析功能均与 IPC 模式相同。
  • 分析结果将直接显示在命令提示符中。
  • 结果不会发送到 Intelligence 或体验管理服务。
  • 此模式主要用于故障排除和验证目的。

在设备上安装并使用 WinDbg

ExternalDumpAnalyzer 进程使用 Microsoft 调试引擎加载操作系统崩溃转储、解析符号并生成崩溃分析字段,如堆栈跟踪和归因模块。使用 WinDbg 作为调试器,因为它构建在 Microsoft 调试器引擎之上,并提供对操作系统崩溃分析的完全访问权限。

搜索顺序

ExternalDumpAnalyzer 进程按下列顺序搜索 Microsoft 调试引擎组件。

  1. Windows SDK 调试工具路径,例如 C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64
    • 如果找不到任何内容,则会尝试下一个搜索位置。
  2. Microsoft Store WinDbg 软件包路径 C:\\Program Files\\WindowsApps\\Microsoft.WinDbg_*
    • 如果找不到任何内容,则会尝试下一个搜索位置。
  3. 系统 dbgeng.dll

WindDbg 安装方法

您可以使用两种方法安装 WinDbg:Microsoft Store 或 Windows SDK。

在部署系统使用的设备环境中运行安装命令并验证安装路径,然后广泛激活增强的操作系统崩溃分析。

  • Microsoft Store 安装
    • 您可以管理员身份运行命令行,使用 WinGet 软件包管理器和所列命令安装 WinDbg。
    • winget install --id Microsoft.WinDbg --source msstore --accept-package-agreements --accept-source-agreements
    • 使用 Workspace ONE UEM 中的软件分发 (SFD) 功能将该命令推送到设备。
  • Windows SDK 安装
    • 如果您的组织阻止使用 App Store,请使用 Windows SDK 及其相应的Windows SDK 调试工具。
    • 确保 dbgeng.dll 系统文件位于下列路径之一中。
      • C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
      • C:\Program Files (x86)\Windows Kits\10\Debuggers\arm64
      • C:\Program Files (x86)\Windows Kits\10\Debuggers\x86

ExternalDumpAnalyzer 进程在哪里?

ExternalDumpAnalyzer 进程驻留在设备上的下列路径中。

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WorkspaceONE\Endpoint Telemetry\Service\Config\ExternalDumpAnalyzer\Enabled

您可以将设备注册表中的键值对更改为 false,以停用增强的操作系统崩溃分析功能。

键名称值说明
启用trueExternalDumpAnalyzer 已激活。
启用falseExternalDumpAnalyzer 已停用。

用于停用的脚本

如果您不希望手动停用键值对,则可以创建自己的 PowerShell 脚本(例如,将文件命名为 Set-ExternalDumpAnalyzer.ps1)以进行远程或批量停用,而不是手动编辑注册表项。

  • .\Set-ExternalDumpAnalyzer.ps1 — 激活该功能 (Enabled = "true")
  • .\Set-ExternalDumpAnalyzer.ps1 -Disable — 停用该功能 (Enabled = "false")
  • .\Set-ExternalDumpAnalyzer.ps1 -Remove — 完全移除该键(恢复为默认值)

注意:确保在写入 HKLM 时使用管理员/SYSTEM 特权运行脚本。

#Requires -RunAsAdministrator
<#
.SYNOPSIS
    Enables, disables, or removes the DEEM / Endpoint Telemetry
    "ExternalDumpAnalyzer" registry setting, for remote/mass deployment.

.DESCRIPTION
    Target key:
        HKLM\SOFTWARE\WorkspaceONE\Endpoint Telemetry\Service\Config\ExternalDumpAnalyzer

    Actions:
      (default)   Set  "Enabled" = "true"    -> feature enabled
      -Disable    Set  "Enabled" = "false"   -> feature disabled
      -Remove     Delete the ExternalDumpAnalyzer key entirely
                  -> agent falls back to its default (disabled)

    Notes:
    - "Enabled" is a STRING (REG_SZ) "true"/"false", matching the admin guide and
      the agent config option ExternalDumpAnalyzer/Enabled (bool, default false).
    - Creates the key path if it does not exist (enable/disable).
    - Always targets the 64-bit registry view, so it works even if invoked by a
      32-bit deployment host (avoids WOW6432Node redirection).
    - Intended for Workspace ONE UEM scripts, Intune, GPO startup scripts, or
      PowerShell Remoting (Invoke-Command).

.PARAMETER Disable
    Disable the feature (sets Enabled = "false"). Omit to enable ("true").

.PARAMETER Remove
    Remove the ExternalDumpAnalyzer key from the registry (reverts to default).

.EXAMPLE
    .\Set-ExternalDumpAnalyzer.ps1
    Enables ExternalDumpAnalyzer (Enabled = "true").

.EXAMPLE
    .\Set-ExternalDumpAnalyzer.ps1 -Disable

.EXAMPLE
    .\Set-ExternalDumpAnalyzer.ps1 -Remove

.NOTES
    Exit codes: 0 success | 1 general failure | 2 verification failed |
                5 not elevated
#>
[CmdletBinding(DefaultParameterSetName = 'Set')]
param(
    [Parameter(ParameterSetName = 'Set')]
    [switch]$Disable,

    [Parameter(ParameterSetName = 'Remove')]
    [switch]$Remove
)

$ErrorActionPreference = 'Stop'

$subKeyPath = 'SOFTWARE\WorkspaceONE\Endpoint Telemetry\Service\Config\ExternalDumpAnalyzer'
$valueName  = 'Enabled'

function Test-IsAdministrator {
    $identity  = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = New-Object Security.Principal.WindowsPrincipal($identity)
    return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

try {
    if (-not (Test-IsAdministrator)) {
        Write-Error 'Must be run as Administrator (writes to HKLM).'
        exit 5
    }

    # Open the 64-bit HKLM view explicitly (robust to 32-bit callers).
    $base = [Microsoft.Win32.RegistryKey]::OpenBaseKey(
        [Microsoft.Win32.RegistryHive]::LocalMachine,
        [Microsoft.Win32.RegistryView]::Registry64)

    if ($Remove) {
        # ---- Remove the ExternalDumpAnalyzer key entirely ----
        $existing = $base.OpenSubKey($subKeyPath)
        if ($null -eq $existing) {
            Write-Output "ExternalDumpAnalyzer key not present; nothing to remove."
            Write-Output "Key: HKLM\$subKeyPath"
            $base.Close()
            exit 0
        }
        $existing.Close()

        $base.DeleteSubKeyTree($subKeyPath)

        # Verify removal.
        $check = $base.OpenSubKey($subKeyPath)
        $base.Close()
        if ($null -ne $check) {
            $check.Close()
            Write-Error "Verification failed: key still present at HKLM\$subKeyPath"
            exit 2
        }

        Write-Output "ExternalDumpAnalyzer REMOVED from registry (agent reverts to default: disabled)."
        Write-Output "Key: HKLM\$subKeyPath"
        exit 0
    }

    # ---- Enable / Disable ----
    $desired   = if ($Disable) { 'false' } else { 'true' }
    $stateText = if ($Disable) { 'DISABLED' } else { 'ENABLED' }

    # CreateSubKey creates the full path if missing and opens it writable.
    $key = $base.CreateSubKey($subKeyPath)
    if ($null -eq $key) {
        Write-Error "Failed to open/create registry key: HKLM\$subKeyPath"
        exit 1
    }

    # Value is a REG_SZ string "true"/"false".
    $key.SetValue($valueName, $desired, [Microsoft.Win32.RegistryValueKind]::String)

    # Verify the written value.
    $actual = $key.GetValue($valueName)
    $key.Close()
    $base.Close()

    if ($actual -ne $desired) {
        Write-Error "Verification failed: $valueName = '$actual' (expected '$desired')."
        exit 2
    }

    Write-Output "ExternalDumpAnalyzer $stateText  ($valueName = `"$actual`")"
    Write-Output "Key: HKLM\$subKeyPath"
    exit 0
}
catch {
    Write-Error "Failed to update ExternalDumpAnalyzer: $($_.Exception.Message)"
    exit 1
}

符号相关设置的策略

您可以配置一些策略来定义与符号相关的设置。这些策略位于 Workspace ONE Endpoint Telemetry > DEEM > Symbol Store Settings 下面。

策略使用的注册表项是 Symbol Store Settings 策略(该策略位于 HKLM\Software\Policies\WorkspaceONE\Endpoint Telemetry\DEEM\Symbol Store Settings),并且包含要配置的 5 个符号注册表策略文件。

  1. 本地符号
    • 配置要使用哪些符号变量。
    • 这些设置会影响 Microsoft 符号、替代符号和符号代理注册表文件。
    • True = 本地符号变量
      • 在 Symbol Store Settings 策略中,将 UseLocalSymbolConfiguration 配置为 true,以将 ExternalDumpAnalyzer 进程设置为使用本地符号变量。
      • 必须在设备上至少配置其中一个本地符号变量。
        • _NT_SYMBOL_PATH
        • _NT_ALT_SYMBOL_PATH
        • _NT_SYMBOL_PROXY
      • 如果未在设备上配置其中任何一个本地符号变量,ExternalDumpAnalyzer 进程可以使用默认受管符号缓存。
      • 如果将此策略设置为 true,系统将会忽略 Microsoft 符号、替代符号和符号代理注册表文件。
    • False = 策略值或默认管理的符号变量
      • 在 Symbol Store Settings 策略中,将 UseLocalSymbolConfiguration 配置为 false,以将 ExternalDumpAnalyzer 进程设置为使用策略值或默认受管符号变量。
      • 如果存在策略值,系统首选使用这些值。如果未在设备上设置策略值,则系统将使用受管默认值。
  2. Microsoft 符号
    • 配置 Microsoft 符号路径和本地缓存位置。
    • 注册表值为 MicrosoftSymbols。
    • 默认值(如未配置)为 srv*C:\ProgramData\WorkspaceONE\ws1etlm\MSSymbols*http://msdl.microsoft.com/download/symbols。
    • 自定义缓存示例为 srv*C:\Symbols*http://msdl.microsoft.com/download/symbols。
    • 如果将 UseLocalSymbolConfiguration 配置为 true,系统将忽略此注册表文件。
  3. 替代符号
    • 配置与路径 _NT_ALT_SYMBOL_PATH 等效的其他符号路径。
    • 注册表值为 AlternativeSymbols。
    • 系统会先搜索此路径,然后再搜索 Microsoft 符号路径。
    • 例如,C:\PrivateSymbols。
    • 如果将 UseLocalSymbolConfiguration 配置为 true, 系统将忽略此注册表文件。
  4. 符号代理
    • 配置与 _NT_SYMBOL_PROXY 等效的符号代理。
    • 注册表值为 SymbolProxy。
    • 例如 http://proxy.example.com:8080。
    • 如果将 UseLocalSymbolConfiguration 配置为 true,系统将忽略此注册表文件。
  5. 删除符号
    • 配置受管本地符号缓存在删除之前保留的时长。
    • 注册表值为 DeleteSymbolsKeepHours。
    • 最好将清理定时器与配置的保留计划相关联。
      • 如果设备过去已下载符号,并且清理即将进行或已逾期,请在引导(崩溃后发生)后将此注册表延迟 15 到 25 分钟。
      • 如果稍后需要清理设备,请根据该保留期外加 15 到 25 分钟设置定时器。此定时器确保清理不会在启动时立即运行,也不会干扰崩溃转储分析。
    • 允许的值包括 Minimum: 1 hour、Maximum: 720 hours 和 Default: 168 hours。七天内有 168 小时。

配置符号策略

从两种方法中做出选择,以激活和部署增强的操作系统崩溃分析功能。使用 PowerShell 命令或使用组策略对象 (GPO)。

  • PowerShell
    • 使用注册表策略,直接写入策略注册表项。
    • 如果使用软件分发 (SFD) 功能向设备推送命令并且不使用 GPO,则此方法非常有用。
    • 此方法需要在设备上使用 WinDbg。
  • 组策略对象
    • 在组策略管理编辑器中配置符号注册表策略文件。
    • 使用 ADMX 和 ADML 模板,在域 GPO 级别从组策略管理控制台部署符号策略。
    • GPO 会将相同的注册表支持的策略值写入到目标设备上。
    • 如果使用 GPO 管理设备并且不使用 SFD,则此方法非常有用。

PowerShell 方法

如果使用 SFD 功能将命令推送到设备,请根据需要添加必要的符号注册表策略文件并调整相应策略的值。

重要信息:在更改计算机环境变量后重新启动 Workspace ONE Endpoint Telemetry 服务或重新引导设备,因为 Windows 服务会在服务进程启动时读取环境变量。

示例

以下列出了一些符号注册表策略文件的示例。

默认受管符号缓存

定义默认受管符号缓存。

$policyPath = "HKLM:\Software\Policies\WorkspaceONE\Endpoint Telemetry\DEEM\Symbol Store Settings"
New-Item -Path $policyPath -Force | Out-Null

New-ItemProperty -Path $policyPath -Name "UseLocalSymbolConfiguration" -PropertyType String -Value "false" -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "MicrosoftSymbols" -PropertyType String -Value "srv*C:\ProgramData\WorkspaceONE\ws1etlm\MSSymbols*http://msdl.microsoft.com/download/symbols" -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "DeleteSymbolsKeepHours" -PropertyType DWord -Value 168 -Force | Out-Null

自定义符号缓存

定义自定义符号缓存。

$policyPath = "HKLM:\Software\Policies\WorkspaceONE\Endpoint Telemetry\DEEM\Symbol Store Settings"
New-Item -Path $policyPath -Force | Out-Null

New-ItemProperty -Path $policyPath -Name "UseLocalSymbolConfiguration" -PropertyType String -Value "false" -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "MicrosoftSymbols" -PropertyType String -Value "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "AlternativeSymbols" -PropertyType String -Value "C:\PrivateSymbols" -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "SymbolProxy" -PropertyType String -Value "http://proxy.example.com:8080" -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "DeleteSymbolsKeepHours" -PropertyType DWord -Value 168 -Force | Out-Null

本地符号环境变量

定义本地符号环境变量。如果您希望 ExternalDumpAnalyzer 进程使用本地符号环境变量而不是策略符号值,请使用此配置。

$policyPath = "HKLM:\Software\Policies\WorkspaceONE\Endpoint Telemetry\DEEM\Symbol Store Settings"
New-Item -Path $policyPath -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "UseLocalSymbolConfiguration" -PropertyType String -Value "true" -Force | Out-Null

[Environment]::SetEnvironmentVariable("_NT_SYMBOL_PATH", "srv*C:\Symbols-check*http://msdl.microsoft.com/download/symbols", "Machine")
[Environment]::SetEnvironmentVariable("_NT_ALT_SYMBOL_PATH", "C:\PrivateSymbols", "Machine")
[Environment]::SetEnvironmentVariable("_NT_SYMBOL_PROXY", "http://proxy.example.com:8080", "Machine")

GPO 方法

在组策略管理编辑器中配置策略并使用 ADMX 和 ADML 模板文件,以便在组策略管理控制台中以域 GPO 级别使用这些策略进行部署。

配置 ADMX 和 ADML 模板

在域 GPO 策略中配置 ADMX 和 ADML 模板,将增强的操作系统崩溃分析设置部署到 Windows 设备群。

必备条件

如果尚未从 Customer Connect 检索到 etlm_extra_bundle,请立即进行检索,因为其中包含了 ADMX 和 ADML 模板,这些模板被捆绑在 Workspace ONE 端点遥测代理 ZIP 文件中。

过程

  1. 将 wsone_etlm.admx 复制到域中央存储。 \\<domain>\SYSVOL\<domain>\Policies\PolicyDefinitions\wsone_etlm.admx
  2. 将 wsone_etlm.adml 复制到匹配的语言文件夹。 \\<domain>\SYSVOL\<domain>\Policies\PolicyDefinitions\en-US\wsone_etlm.adml
  3. 在 Windows 设备上打开组策略管理控制台。
  4. 编辑目标设备策略。
  5. 转到计算机配置 > 管理模板 > Workspace ONE 端点遥测 > DEEM > 符号存储设置。
  6. 根据您的特定需求,从五个可用选项(本地符号、Microsoft 符号、替代符号、符号代理和删除符号)配置相应的符号策略。
  7. 将策略应用于目标设备。
  8. 运行 gpupdate /force 或等待正常的策略刷新。

将崩溃诊断添加到报告和仪表板

在增强的操作系统崩溃分析功能报告扩充的崩溃诊断字段后,您可以将这些字段作为列添加到任何报告和仪表板小组件中,无需离开已使用的 Intelligence 报告工作流便可分析整个设备群的崩溃根本原因。

报表

  1. 在 Intelligence 中,转到工作区 > 报告。
  2. 打开列出系统崩溃事件的报告。
  3. 选择管理列,从列列表中添加堆栈跟踪、完整堆栈跟踪、归因模块和关联进程 。
  4. 保存报告。

报告表现在显示为每个崩溃事件选择的诊断列。
您的报告现在可以显示崩溃诊断,如完整的堆栈跟踪、归因模块以及关联进程信息。

仪表板小组件

  1. 在 Intelligence 中,转到工作区 > 仪表板。
  2. 将小组件添加到现有仪表板或创建自定义仪表板。
  3. 选择员工体验 > 设备作为数据源。
  4. 您可以将所有必需条目保留为默认值。
  5. 在筛选器区域中,选择属性事件名称等于系统崩溃。
  6. 保存小组件。
  7. 使用小组件中的管理列菜单选项,添加堆栈跟踪、归因模块和关联进程列。

将信息添加为字段,也可以在满足用例要求时将其添加为分组维度。

此页面对您有帮助吗?

对本主题提供反馈

本主题对您有帮助吗?

请勿填写任何个人信息或机密信息。

正在生成链接…