十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL ProcessCrashInformation 详解:通过 WSL 容器 SDK 捕获 Linux 进程崩溃与 dump 信息

WSL ProcessCrashInformation 详解:通过 WSL 容器 SDK 捕获 Linux 进程崩溃与 dump 信息 WSL ProcessCrashInformation 详解通过 WSL 容器 SDK 捕获 Linux 进程崩溃与 dump 信息【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL导读ProcessCrashInformation是 WSL 容器 SDKWSL Containers SDK简称 WSLC SDK中用于描述容器内 Linux 进程崩溃事件的数据类。当容器会话Session内的进程因信号signal异常终止并生成崩溃转储crash dump时宿主应用可通过订阅Session.ProcessCrashed事件获得一个只读的ProcessCrashInformation对象从而拿到崩溃进程的名称、PID、触发信号、dump 文件路径与时间戳实现对容器内故障的监控、告警与自动化收集。阅读完本文你将掌握该数据类的全部属性语义、事件订阅方式、底层 C 接口与 WinRT 包装的完整数据流并能据此在自己的宿主程序中实现 Linux 进程崩溃监控。类定义与属性一览ProcessCrashInformation是一个sealed密封类由 WSL 容器 SDK 的 WinRT 投影对外暴露其所有属性均为只读实例由 SDK 在崩溃事件触发时自动构造宿主代码无法直接 new。public sealed class ProcessCrashInformation { public string DumpPath { get; } public string ProcessName { get; } public uint Pid { get; } public uint Signal { get; } public DateTimeOffset Timestamp { get; } }属性类型含义DumpPathstring崩溃转储crash dump文件的完整路径宿主应用可据此收集 dump 用于事后分析ProcessNamestring发生崩溃的 Linux 进程名称Piduint崩溃进程在容器会话内的进程 IDSignaluint导致进程终止的 Linux 信号编号如 SIGSEGV11、SIGABRT6 等TimestampDateTimeOffset崩溃事件发生的时间戳在 WinRT 投影层wslcsdk.idl中该类型被定义为只读属性的 runtimeclass并通过ProcessCrashHandler委托与Session.ProcessCrashed事件关联runtimeclass ProcessCrashInformation { String DumpPath { get; }; String ProcessName { get; }; UInt32 Pid { get; }; UInt32 Signal { get; }; Windows.Foundation.DateTime Timestamp { get; }; }; delegate void ProcessCrashHandler(ProcessCrashInformation information);订阅崩溃事件核心使用示例ProcessCrashInformation的唯一来源是Session.ProcessCrashed事件。SDK 官方 API 文档给出的最小示例展示了事件的完整用法session.ProcessCrashed information Console.WriteLine(${information.ProcessName} ({information.Pid}) crashed at {information.Timestamp});在此基础上结合属性语义可以编写更实用的崩溃监控逻辑例如按信号分类处理并归档 dumpsession.ProcessCrashed information { Console.WriteLine( $[CRASH] {information.ProcessName} (PID {information.Pid}) $terminated by signal {information.Signal} at {information.Timestamp}); // 将崩溃转储文件复制到宿主侧归档目录避免容器回收后丢失 if (!string.IsNullOrEmpty(information.DumpPath)) { File.Copy(information.DumpPath, Path.Combine(archiveDir, ${information.ProcessName}-{information.Pid}.core)); } };与事件订阅配套的还有两个基础设施 API在 wslcsdk.idl 中声明event SessionTerminationHandler Terminated;—— 会话整体终止正常关闭或崩溃通知event ProcessCrashHandler ProcessCrashed;—— 单个 Linux 进程崩溃通知即本文主题。底层数据流从 C 回调到 WinRT 事件ProcessCrashInformation并不是凭空构造的它由 WinRT 层把底层 C 接口的崩溃回调数据封装而来。理解这条数据链有助于排查崩溃监控不生效的问题。1. C 层回调数据结构与注册 API底层 C 接口wslcsdk.h使用WslcSessionCrashDumpInfo结构体承载崩溃信息并提供了注册/注销回调的 APItypedef struct WslcSessionCrashDumpInfo { _Field_z_ PCWSTR dumpPath; _Field_z_ PCSTR processName; uint32_t pid; uint32_t signal; uint64_t timestamp; } WslcSessionCrashDumpInfo; typedef __callback void(CALLBACK* WslcSessionCrashDumpCallback)(_In_ const WslcSessionCrashDumpInfo* info, _In_opt_ PVOID context); STDAPI WslcRegisterSessionCrashDumpCallback( _In_ WslcSession session, _In_ WslcSessionCrashDumpCallback crashDumpCallback, _In_opt_ PVOID crashDumpContext, _Out_ WslcCrashDumpSubscription* subscription, _Outptr_opt_result_z_ PWSTR* errorMessage); STDAPI WslcReleaseCrashDumpSubscription(_In_ WslcCrashDumpSubscription subscription);从源码注释可以确认的关键语义只要调用方持有live session存活会话即可注册回调回调在会话内任意 Linux 进程发生崩溃并写出 dump 后被调用返回的WslcCrashDumpSubscription句柄负责保持订阅存活将其传给WslcReleaseCrashDumpSubscription即完成退订同一会话可以注册多个订阅互不影响。2. 回调适配C 结构体 → WinRT 对象WslcSessionCrashDumpInfo与ProcessCrashInformation字段一一对应。在 CrashDumpCallback.cpp 中IWSLCCompatCrashDumpCallback的 COM 实现把收到的各参数DumpPath、ProcessName、Pid、Signal、Timestamp逐项填充进结构体再转发给用户注册的回调HRESULT STDMETHODCALLTYPE CrashDumpCallback::OnCrashDump(_In_ LPCWSTR DumpPath, _In_opt_ LPCSTR ProcessName, _In_ ULONG Pid, _In_ ULONG Signal, _In_ ULONGLONG Timestamp) { WslcSessionCrashDumpInfo info{}; info.dumpPath DumpPath; info.processName ProcessName ? ProcessName : ; info.pid Pid; info.signal Signal; info.timestamp Timestamp; m_callback(info, m_context); return S_OK; }注意这里对ProcessName的空指针防护当进程名不可用时结构体中被填充为空字符串而非空指针避免上层解引用崩溃。3. WinRT 包装属性值如何被固化ProcessCrashInformation.cpp 展示了 WinRT 类的构造过程——构造时一次性从 C 结构体拷贝所有字段此后对象完全不可变ProcessCrashInformation::ProcessCrashInformation(const WslcSessionCrashDumpInfo* info) { m_dumpPath info-dumpPath; m_processName winrt::to_hstring(info-processName); m_pid info-pid; m_signal info-signal; m_timestamp winrt::clock::from_time_t(static_casttime_t(info-timestamp)); }值得注意的实现细节底层时间戳是uint64_tUnix 时间此处通过winrt::clock::from_time_t转换为Windows::Foundation::DateTime而在 C# 投影层进一步呈现为DateTimeOffset方便宿主直接格式化输出。4. 事件派发回调 → 事件委托最后Session.cpp 中的静态回调把构造好的对象派发给用户的ProcessCrashed事件处理器void CALLBACK Session::OnCrashDump(const WslcSessionCrashDumpInfo* info, PVOID context) noexcept { try { auto session static_castSession*(context); auto information winrt::make_selfimplementation::ProcessCrashInformation(info); session-m_crashDumpEvent(*information); } CATCH_LOG(); }事件注册与退订的入口则在 Session.cppwinrt::event_token Session::ProcessCrashed(winrt::Microsoft::WSL::Containers::ProcessCrashHandler const handler) { return m_crashDumpEvent.add(handler); } void Session::ProcessCrashed(winrt::event_token const token) noexcept { m_crashDumpEvent.remove(token); }整体数据流可概括为Linux 进程崩溃收到信号 → SDK 内部生成 crash dump 并触发 C 层回调 → CrashDumpCallback 填充 WslcSessionCrashDumpInfo → WinRT 包装为 ProcessCrashInformation → Session.ProcessCrashed 事件派发 → 宿主应用读取属性做监控/归档属性字段的底层语义与使用建议结合 C 层结构与 WinRT 实现各字段的工程语义如下DumpPath指向崩溃转储文件的字符串宽字符。它是_Field_z_标注的以\0结尾的路径可直接用于File.Copy等宿主侧文件操作。建议在事件处理中立即归档因为容器会话后续可能被回收dump 文件有丢失风险。ProcessName崩溃进程名ANSI 字符串构造时经to_hstring转为 UTF-16。由于底层做了空指针防护该属性永远不为 null为空字符串即表示进程名不可用。Pid会话命名空间内的进程 ID用于与session中的其他进程信息如通过容器的 ps 输出做关联。Signal触发崩溃的 Linux 信号编号。常见取值如SIGSEGV11段错误、SIGABRT6abort、SIGILL4非法指令等可据此对崩溃类型做初步分类。Timestamp崩溃发生时刻经clock::from_time_t转换后在 C# 层呈现为DateTimeOffset可直接输出或用于日志时序对齐。适用前提与限制本文所述能力来自当前仓库中的 WSL 容器 SDKWSLC SDKSDK 的 WinRT 投影定义见 wslcsdk.idlC 接口定义见 wslcsdk.h实现参考 ProcessCrashInformation.cpp 与 Session.cpp。崩溃事件仅在已启动Started且存活的会话上有效会话关闭后见Session::Close对 crash dump 订阅的清理事件将不再派发。ProcessCrashInformation为 SDK 自动构造的只读快照属性反映的是崩溃发生瞬间的状态不随后续会话变化而更新。本文 API 形态以当前仓库代码为准具体数值能力如 dump 文件大小上限、可收集的信号范围由 SDK 实现与容器配置决定仓库中未提供对应常量不应臆测为固定保证。【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表