DTrace 实时转储

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

DTrace 实时转储能够在发生错误的确切点触发转储。 例如,错误可能是返回错误的函数。 可以使用 DTrace 挂接到此函数返回,并在返回值为“error”时触发实时转储。

注意

版本 18980 和 Windows Server 内部版本 18975 之后的 Windows 预览体验成员版本支持 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 -错误文本:实时转储写入延迟转储数据 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 代码示例