doc/docs/debugging.md
There are multiple sources of logging in WSL. The main one is the ETL trace that is emitted from Windows processes.
To collect an ETL trace, run (link to wsl.wprp):
wpr -start wsl.wprp -filemode
[reproduce the issue]
wpr -stop logs.ETL
The consolidated wsl.wprp file includes multiple profiles for different scenarios:
WSL - General WSL tracing (default)WSL-Storage - Enhanced storage tracingWSL-Networking - Comprehensive networking tracingWSL-HvSocket - HvSocket-specific tracingTo use a specific profile, append !ProfileName to the wprp file, e.g., wpr -start wsl.wprp!WSL-Networking -filemode
Once the log file is saved, you can use WPA to view the logs.
Notable ETL providers:
Microsoft.Windows.Lxss.Manager: Logs emitted from wslservice.exe
Important events:
GuestLog: Logs from the vm's dmesgError: Unexpected errorsCreateVmBegin, CreateVmEnd: Virtual machine lifetimeCreateNetworkBegin, CreateNetworkEnd: Networking configurationSentMessage, ReceivedMessage: Communication on the hvsocket channels with Linux.Microsoft.Windows.Subsystem.Lxss: Other WSL executables (wsl.exe, wslg.exe, wslconfig.exe, wslrelay.exe, ...)
Important events:
UserVisibleError: An error was displayed to the userMicrosoft.Windows.Plan9.Server: Logs from the Windows plan9 server (used when accessing /mnt/ shares and running Windows)
On the Linux side, the easiest way to access logs is to look at dmesg or use the debug console, which can be enabled by writing:
[wsl2]
debugConsole=true
to %USERPROFILE%/.wslconfig and restarting WSL
Usermode can be attached to WSL Windows processes (wsl.exe, wslservice.exe, wslrelay.exe, ...). The symbols are available under the bin/<platform>/<target> folder.
You can also use this trick to automatically collect crash dumps when processes crash.
gdb can be attached to Linux processes (see man gdb).
The simplest way to debug a WSL process with gdb is to use the /mnt mountpoints to access the code from gdb.
Once started, just use dir /path/to/wsl/source in gdb to connect the source files.
Some WSL processes such as gns or mini_init aren't accessible from within WSL distributions. To attach a debugger to those, use the debug shell via:
wsl --debug-shell
You can then install gdb by running tdnf install gdb and start debugging processes.