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
使用事件查看器启用分析通道
启动 Windows 事件查看器
单击“查看”并选中“显示分析和调试日志”。 这将显示livedump的分析通道。
右键单击并启用 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 管理,并在使用适当的权限触发转储时创建。