DTrace 实时转储

DTrace 提供了一种使用 lkd() 从 D-script 中捕获实时内存转储的功能。 内存转储文件用于使用 Windows 调试器调试 Windows 中的复杂问题。 有关详细信息,请参阅 使用 WinDbg 分析故障转储文件。 若要下载调试器,请参阅 “下载并安装 WinDbg Windows 调试器”。

DTrace 实时转储具备在错误发生的确切位置触发转储的功能。 例如,错误可能是由于一个函数返回了错误。 可以使用 DTrace 挂钩到此函数的返回,当返回值为“error”时触发实时转储操作。

注释

Windows 和 Windows Server 的内部版本在 18980 版本之后以及 18975 版本之后支持 DTrace。

有关在 Windows 上使用 DTrace 的常规信息,请参阅 DTrace

DTrace 实时转储功能使用

用法: lkd(参数):

可以设置以下选项来更改实时微型转储中包含的信息。

0x0 - 完整内核转储(默认值)

0x1 - 用户页 + 内核页面(仅适用于 KD 附加)

0x2 - 小型转储

0x4 - Hyper-V 页 + 内核页)

0x5 - 用户、内核和管理程序页。

实时转储示例代码

#pragma D option destructive

inline uint32_t STATUS_UNSUCCESSFUL = 0xc0000001UL;

syscall:::return
{ 
	this->status = (uint32_t)arg0;

	if (this->status == STATUS_UNSUCCESSFUL)
	{ 
		printf ("Return value arg0:%x \n", this->status);
		printf ("Triggering LiveDump \n");
		lkd(0);
		exit(0);
	}
}

将文件另存为 livedumpstatuscheck.d。

以管理员身份打开命令提示符,并使用 -s 选项运行脚本。

C:\Windows\System32>dtrace -s livedumpstatuscheck.d
dtrace: script 'livedumpstatuscheck.d' matched 1881 probes
dtrace: allowing destructive actions
CPU     ID                    FUNCTION:NAME
  0     93 NtAlpcSendWaitReceivePort:return Return value arg0:c0000001
Triggering LiveDump

创建的转储文件通常位于 C:\Windows\LiveKernelReports

如果转储文件位置已更改,该值将存储在此注册表项中: hklm\system\currentcontrolset\control\crashcontrol\livekernelreports

使用 WinDbg 处理转储文件,如上所述。

故障排除

打开 Windows 事件查看器:转到:应用程序和服务日志->Microsoft->Windows->Kernel-Livedump-Operational>

如果未找到任何日志,请从命令提示符或事件查看器启用分析通道,如下所示。

从命令提示符启用分析通道

使用此命令从管理员命令提示符启用分析通道。

wevtutil sl Microsoft-Windows-Kernel-LiveDump/Analytic /e:true

使用事件查看器启用分析通道

  1. 启动 Windows 事件查看器

  2. 单击“查看”并选中“显示分析和调试日志”。 这将显示livedump的分析通道。

  3. 右键单击并启用 Microsoft-Windows-Kernel-LiveDump/Analytic

启用完整实时转储

以下示例设置,显示将磁盘上可能在任何给定时间的最大完整实时转储数设置为 10,并存储完整内存转储,而不仅仅是小型转储。

reg add "HKLM\System\CurrentControlSet\Control\CrashControl\FullLiveKernelReports" /f /t REG_DWORD /v FullLiveReportsMax /d 10

reg add "HKLM\System\CurrentControlSet\Control\CrashControl" /f /t REG_DWORD /v AlwaysKeepMemoryDump /d 1

有关这些设置的详细信息,请参阅 WER 设置

禁用限流

限制功能是一项功能,可防止转储和日志系统影响Windows系统的正常使用。 此功能可能会在某些资源受限的环境中干扰实时转储的创建。

通过将 SystemThrottleThreshold 和 ComponentThrottleThreshold 密钥设置为零来禁用限制,检查实时转储限制设置,并在必要时重试,如下所示。

reg add "HKLM\System\CurrentControlSet\Control\CrashControl\FullLiveKernelReports" /f /t REG_DWORD /v SystemThrottleThreshold /d 0
reg add "HKLM\System\CurrentControlSet\Control\CrashControl\FullLiveKernelReports" /f /t REG_DWORD /v ComponentThrottleThreshold /d 0

磁盘空间问题(事件 ID 202 -Error 文本:实时转储写入延迟转储数据 API 已结束。NT 状态:0xC000007F。)

这意味着磁盘空间不足。 更新下面显示的注册表项,以更改事件转储创建的路径。例如,将路径更改为具有额外存储空间的 d盘。

reg add hklm\system\currentcontrolset\control\crashcontrol\livekernelreports /v "LiveKernelReportsPath" /t reg_sz /d "\??\d:\livedumps"

此命令将实时转储根路径设置为 d:\livedumps (例如)。

不要手动创建文件夹,因为它由 OS 管理,并在使用适当的权限触发转储时创建。

另请参阅

Windows 上的 DTrace

DTrace Windows 编程

DTrace Windows 代码示例