本指南介绍如何排查 WSL 中的问题并确定它们来自何处。
有关体系结构的快速说明
为了帮助确定导致问题的原因,我们必须找出它在堆栈中的位置。
在 WSL 中调用 Linux 二进制文件时,它(大致)会经历这些层,每一层都可能是错误来源:
graph TD;
id1["Linux binary in userspace"]-->id2["Linux distro"];
id2["Linux distro"]-->id3["WSL's stack"];
id4["WSL's stack"]-->id5["Physical hardware"];
我们将按顺序浏览此堆栈,并指导你确定错误源是否来自该部分。
userspace 中的 Linux 二进制文件
首先,我们需要检查这是 Linux 二进制文件本身导致的错误。 执行此作的最简单方法是查看此错误是否在真正的 Linux 计算机上重现(首选裸机,或在 Hyper-V 中运行完整的 Ubuntu,以便进行很好的比较)。 如果在真正的 Linux 计算机上以相同的方式出错,则我们知道它是 Linux 二进制文件或发行版。
或者,可以运行 strace 命令来确定发生了什么。 此命令显示 Linux 二进制文件所进行的系统调用,您可以确定它正在尝试访问的内容以及可能失败的地方。 本指南不会提供有关如何调试 strace 堆栈的完整指南(否则会太长),因此让我们看看一个示例:
用户发现 WSL 命令 xeyes 在 WSL 中卡住,但在 Linux 计算机上不会卡住。 运行 strace xeyes 显示该命令在 openat 系统调用时挂起。 这意味着 Linux 内核在尝试运行 openat 调用时停滞不前,并指示问题不在二进制文件中。
如果问题在 Linux 二进制文件中,该怎么办
WSL 中存在的 Linux 二进制文件由各自的所有者提供,不由Microsoft直接拥有。 如果在 Linux 二进制文件中看到问题,请直接将其报告给该二进制文件的所有者。
Linux 发行版
某些错误也可能来自 Linux 分发版本身。 WSL 中的 Linux 发行版实际上只是 Linux 二进制文件的集合,因此上述故障排除步骤与上述步骤相同。 但是,Linux 发行版负责包管理器等关键体验,这会极大地影响二进制文件相互交互的方式。
若要对此进行故障排除,你将使用与上述相同的技术,查看它是否在 Linux 上重现,以及用于 strace 确定导致故障的原因(或任何其他错误代码)并尝试确定它是否来自特定的 Linux 二进制文件。 如果该二进制文件本身由发行版所有,则它是 Linux 发行版问题。
如果问题在 Linux 发行版中,该怎么办
与 Linux 二进制故事类似,WSL 发行版由各自的维护者提供。 请直接向受影响的 Linux 发行版提交问题。
WSL 的堆栈
接下来,错误可能来自 WSL 的逻辑本身。 如果此问题未在裸机 Linux 上重现,或者在机器级别出现故障,那么这些都表明问题来自 WSL 内部。 下面是常见的故障路径以及如何确定并收集日志:
WSL 启动失败或者遇到错误 wsl.exe。
此处最明显的错误是直接来自 wsl.exe 的错误,例如 此 GitHub 问题。 在这种情况下,请 收集 WSL 日志 ,这些日志重现了问题,并在 WSL GitHub 存储库中提出问题。
WSL 挂起
另一个常见错误是 WSL 挂起且不响应任何命令。 在这种情况下,请 遵循此过程报告 WSL 进程崩溃。 可以通过打开任务管理器 -> 进程 -> 右键单击VmmemWSL -> 创建内存转储文件来触发崩溃并收集转储。 请在 WSL GitHub 存储库中包含此故障转储并提交问题。
网络错误
同样,请验证这不是 Linux 二进制问题。 另外,如果可能,请通过尝试该计算机上的 Hyper-V VM 来验证这是否不是一般虚拟化或 VPN 问题,以查看它是否具有受限的网络功能。 如果此问题仅保留在 WSL 中,请在 WSL GitHub 存储库上提出问题。
其他问题
如果您收到另一种您认为与 WSL 直接相关的错误,请< c0>包括日志,并将问题提交至
深入了解 WSL 日志
可以打开 WSL 日志以查看确切的错误。 为此,请先安装 Windows Performance Analyzer 。
然后,当你有 WSL 日志(从 这些说明 收集)时,请获取已创建的 .zip 文件并解压缩。 打开生成的文件夹并查找名为的文件: logs.etl 并双击此文件以在 Windows Performance Analyzer 中打开它。
应用打开后,请执行以下步骤:
- 单击“系统活动”以展开视图
- 将顶部的“通用事件”框拖到主窗口
- 找到“Microsoft.Windows.Lxss.Manager”系列,然后单击箭头将其选中
在此处,可以查看从 WSL 发出的所有诊断事件。 备受关注的一个将被命名为“VerboseLog”,并提供有关确切错误位置及相关信息的更多详细信息。
其他资源
WSL 故障排除文档页中提供了常见问题和解决方案,因此请检查那里是否有可能出现的问题。 此外,请转到 WSL GitHub 存储库,或任何搜索引擎并搜索问题或任何错误代码,以查看其他人是否遇到相同的问题。