WSL 如何收集 WSL 侧 ETL 跟踪日志并用 WPA 分析 Windows 进程行为?
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
排查 WSL 问题时,debugging.md 给出的第一个日志来源是 ETL trace:它由 WSL 的 Windows 侧进程(wslservice.exe、wsl.exe 等)发出,文档明确说这是 WSL 日志的主要来源。本文按仓库文档走一遍完整路径:用随仓库提供的 diagnostics/wsl.wprp 配置文件和 Windows Performance Recorder(wpr)采集 ETL 跟踪,再把生成的.ETL文件放进 Windows Performance Analyzer(WPA)里定位 Windows 进程行为。前提是你在一台安装了 WSL 的 Windows 机器上,并且已安装 WPR(CONTRIBUTING.md 中给出了 WPR 的安装入口说明),同时能从本仓库拿到wsl.wprp文件。
先明确 ETL 日志的覆盖范围
ETL trace 只来自 Windows 侧进程,Linux 侧的运行日志不在这份跟踪里。文档同时给出了 Linux 侧的对应手段,方便你判断当前问题该看哪一路日志:
- 查看
dmesg; - 或启用 debug console:在
%USERPROFILE%/.wslconfig中写入下面的配置,然后重启 WSL。
[wsl2] debugConsole=true所以本文的 ETL + WPA 路径适用于要分析 Windows 侧组件行为(wslservice.exe、wsl.exe、wslrelay.exe、plan9 服务端等)的场景。
从 wsl.wprp 中选择跟踪配置
仓库中的diagnostics/wsl.wprp是一个 Windows Performance Recorder 配置文件,里面整合了多个针对 WSL 场景的 profile:
| Profile | 用途(文档原文) |
|---|---|
WSL | General WSL tracing(默认) |
WSL-Storage | Enhanced storage tracing(增强存储跟踪) |
WSL-Networking | Comprehensive networking tracing(全面网络跟踪) |
WSL-HvSocket | HvSocket-specific tracing(HvSocket 专项跟踪) |
从配置文件内容看,这些 profile 都是DetailLevel="Verbose"、LoggingMode="File",因此采集命令需要带-filemode。默认使用WSLprofile;要使用其他 profile,在文件名后追加!ProfileName即可,文档给出的示例是wpr -start wsl.wprp!WSL-Networking -filemode。排查存储、网络或 hvsocket 相关问题时选对应 profile,能让跟踪包含相应子系统的事件提供程序;一般问题用默认 profile 即可。
用 wpr 采集 ETL 跟踪
先把diagnostics/wsl.wprp复制到本地工作目录(例如从仓库检出后复制该文件),然后在该目录下按文档给出的命令操作:
wpr -start wsl.wprp -filemode [reproduce the issue] wpr -stop logs.ETL中间一行是文档原样的占位说明,意思是:启动跟踪后,在这里复现你要排查的问题,再执行停止命令。ETL 记录的就是这段时间窗口内 Windows 进程发出的事件。
如果只需要某个子系统的跟踪,把第一条命令换成带 profile 的写法,例如:
wpr -start wsl.wprp!WSL-Networking -filemode执行wpr -stop logs.ETL后,当前目录会生成logs.ETL,这就是下一步 WPA 分析要打开的文件。
在 WPA 中打开 logs.ETL,按 ETL provider 定位行为
文档说明:日志文件保存后,即可用 WPA 查看(文档提供了 WPA 的 Microsoft Store 入口)。打开logs.ETL后,文档列出了几个值得关注的 ETL provider 及其重要事件,可以直接作为 WPA 中过滤和检索的依据:
| ETL provider | 来源与范围 | 重要事件(文档原文含义) |
|---|---|---|
Microsoft.Windows.Lxss.Manager | 由 wslservice.exe 发出的日志 | GuestLog:来自虚拟机 dmesg 的日志;Error:意外错误;CreateVmBegin/CreateVmEnd:虚拟机生命周期;CreateNetworkBegin/CreateNetworkEnd:网络配置;SentMessage/ReceivedMessage:与 Linux 之间 hvsocket 通道上的通信 |
Microsoft.Windows.Subsystem.Lxss | 其他 WSL 可执行文件(wsl.exe、wslg.exe、wslconfig.exe、wslrelay.exe 等) | UserVisibleError:向用户展示了一个错误 |
Microsoft.Windows.Plan9.Server | Windows plan9 服务器 | 用于访问/mnt/共享(以及运行 Windows 程序)时的日志 |
据此可以判断问题落点:虚拟机创建异常看CreateVmBegin/CreateNetworkEnd这类成对事件;想知道 Linux 内核侧输出,看GuestLog;怀疑 hvsocket 通道异常,看SentMessage/ReceivedMessage序列;访问/mnt/下文件异常则查Microsoft.Windows.Plan9.Server。如果怀疑网络问题而默认 profile 里的信息不够,可以按上一节的方式改用WSL-Networkingprofile 重新采集一轮。
可选路径:用 collect-wsl-logs.ps1 一键采集日志包
如果目标是给问题报告准备完整日志,而不是只拿一份 ETL,仓库提供了 diagnostics/collect-wsl-logs.ps1。脚本内部同样是wpr.exe -start ... -filemode配合wsl.wprp采集 ETL(产物为logs.etl),脚本要求管理员权限(脚本头部声明#Requires -RunAsAdministrator,CONTRIBUTING.md 也要求用管理员 PowerShell 运行)。
把collect-wsl-logs.ps1从仓库复制到本地目录运行即可;脚本会优先使用同目录下的本地wsl.wprp与networking.sh,避免联网下载。基本用法:
# 管理员 PowerShell 中执行 .\collect-wsl-logs.ps1也可以指定 profile,例如.\collect-wsl-logs.ps1 -LogProfile storage(可选值:storage、networking、hvsocket或自定义.wprp路径)。
需要清楚脚本的副作用,它做的远不止采集一份 ETL:
- 导出多个注册表项(HKCU/HKLM 的 Lxss 键、P9NP、WinSock2 等)到文件,收集服务状态、
.wslconfig副本、安装日志等; - 运行期间暂停等待你按键,然后停止跟踪;
- 默认 profile 之外,
networkingprofile 会额外启动 pktmon、netsh wfp capture和 WSL 内的 tcpdump;-RestartWslReproMode会删除 WSL 的 HNS 网络并停止 WSL 服务,副作用最大,只在明确要采集网络创建日志时使用; -Dump会为当前正在运行的 WSL 进程(wsl、wslservice、wslhost、wslcsession、wslrelay、wslg 等)写出崩溃转储,注意这些内容可能随日志包公开;- 最后把整个目录压缩为
.tar.gz(失败时退回 zip)并删除中间目录,脚本打印Logs saved in: <路径>表示日志包生成完成。
只想要一份可分析的 ETL 文件时,上面手动的wpr三步就够了;这个脚本适合需要完整诊断包的场景。
完成判断与边界
采集与分析的收尾判断来自文档本身:wpr -stop后生成的logs.ETL能被 WPA 打开,并且在上表的 provider(如Microsoft.Windows.Lxss.Manager)下能看到对应事件,说明跟踪链路是通的;事件内容则用于回答具体行为问题。再次注意边界:这份 ETL 只覆盖 Windows 侧进程,问题若发生在 Linux 用户态或内核态,应转向dmesg或前文提到的 debug console 路径,而不是继续在 ETL 里找。
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考