Introduce a new kernel command line argument to collect hvsocket event logs during boot (#13537)
* Introduce a new kernel command line argument to collect hvsocket event logs during boot * Cleanup diff * unset env * Add test coverage * Fix format * Remove prefix
Blue committed
Oct 1, 2025 at 15:35 UTC
8313d50f2eeffd0bfa85957a054708f0779d8366
3 files changed
+99
-19
src/linux/init/main.cpp
+88
-19
@@ -3875,6 +3875,63 @@ Return Value:
3875
3876
int WslEntryPoint(int Argc, char* Argv[]);
3877
3878
+void EnableDebugMode(const std::string& Mode)
3879
+{
3880
+ if (Mode == "hvsocket")
3881
+ {
3882
+ // Mount the debugfs.
3883
+ THROW_LAST_ERROR_IF(UtilMount("none", "/sys/kernel/debug", "debugfs", 0, nullptr) < 0);
3884
+
3885
+ // Enable hvsocket events.
3886
+ std::vector<const char*> files{
3887
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_on_msg_dpc/enable",
3888
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_on_message/enable",
3889
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_onoffer/enable",
3890
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_onoffer_rescind/enable",
3891
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_onopen_result/enable",
3892
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_ongpadl_created/enable",
3893
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_ongpadl_torndown/enable",
3894
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_open/enable",
3895
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_close_internal/enable",
3896
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_establish_gpadl_header/enable",
3897
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_establish_gpadl_body/enable",
3898
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_teardown_gpadl/enable",
3899
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_release_relid/enable",
3900
+ "/sys/kernel/debug/tracing/events/hyperv/vmbus_send_tl_connect_request/enable"};
3901
+
3902
+ for (auto* e : files)
3903
+ {
3904
+ WriteToFile(e, "1");
3905
+ }
3906
+
3907
+ // Relay logs to the host.
3908
+ std::thread relayThread{[]() {
3909
+ constexpr auto path = "/sys/kernel/debug/tracing/trace_pipe";
3910
+ std::ifstream file(path);
3911
+
3912
+ if (!file)
3913
+ {
3914
+ LOG_ERROR("Failed to open {}, {}", path, errno);
3915
+ return;
3916
+ }
3917
+
3918
+ std::string line;
3919
+ while (std::getline(file, line))
3920
+ {
3921
+ LOG_INFO("{}", line);
3922
+ }
3923
+
3924
+ LOG_ERROR("{}: closed", path);
3925
+ }};
3926
+
3927
+ relayThread.detach();
3928
+ }
3929
+ else
3930
+ {
3931
+ LOG_ERROR("Unknown debugging mode: '{}'", Mode);
3932
+ }
3933
+}
3934
+
3935
int main(int Argc, char* Argv[])
3936
{
3937
std::vector<gsl::byte> Buffer;
@@ -3997,6 +4054,37 @@ int main(int Argc, char* Argv[])
4054
}
4055
}
4056
4057
+ //
4058
+ // Create the etc directory and mount procfs and sysfs.
4059
+ //
4060
+
4061
+ if (UtilMkdir(ETC_PATH, 0755) < 0)
4062
+ {
4063
+ return -1;
4064
+ }
4065
+
4066
+ if (UtilMount(nullptr, PROCFS_PATH, "proc", 0, nullptr) < 0)
4067
+ {
4068
+ return -1;
4069
+ }
4070
+
4071
+ if (UtilMount(nullptr, SYSFS_PATH, "sysfs", 0, nullptr) < 0)
4072
+ {
4073
+ return -1;
4074
+ }
4075
+
4076
+ //
4077
+ // Enable debug mode, if specified.
4078
+ //
4079
+
4080
+ if (const auto* debugMode = getenv(WSL_DEBUG_ENV))
4081
+ {
4082
+ LOG_ERROR("Running in debug mode: '{}'", debugMode);
4083
+ EnableDebugMode(debugMode);
4084
+
4085
+ unsetenv(WSL_DEBUG_ENV);
4086
+ }
4087
+
4088
//
4089
// Establish the message channel with the service via hvsocket.
4090
//
@@ -4024,25 +4112,6 @@ int main(int Argc, char* Argv[])
4112
goto ErrorExit;
4113
}
4114
4027
- //
4028
- // Create the etc directory and mount procfs and sysfs.
4029
- //
4030
-
4031
- if (UtilMkdir(ETC_PATH, 0755) < 0)
4032
- {
4033
- return -1;
4034
- }
4035
-
4036
- if (UtilMount(nullptr, PROCFS_PATH, "proc", 0, nullptr) < 0)
4037
- {
4038
- return -1;
4039
- }
4040
-
4041
- if (UtilMount(nullptr, SYSFS_PATH, "sysfs", 0, nullptr) < 0)
4042
- {
4043
- return -1;
4044
- }
4045
-
4115
if (getenv(WSL_ENABLE_CRASH_DUMP_ENV))
4116
{
4117
Config.EnableCrashDumpCollection = true;
src/shared/inc/lxinitshared.h
+2
@@ -191,6 +191,8 @@ Abstract:
191
192
#define WSL_ENABLE_CRASH_DUMP_ENV "WSL_ENABLE_CRASH_DUMP"
193
194
+#define WSL_DEBUG_ENV "WSL_DEBUG"
195
+
196
#define WSL_DISTRIBUTION_CONF "/etc/wsl-distribution.conf"
197
198
//
test/windows/UnitTests.cpp
+9
@@ -6147,5 +6147,14 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n",
6147
VERIFY_ARE_EQUAL(err, L"");
6148
}
6149
6150
+ TEST_METHOD(WslDebug)
6151
+ {
6152
+ WSL2_TEST_ONLY();
6153
+
6154
+ // Verify that hvsocket debug events are logged to dmesg.
6155
+ WslConfigChange config(LxssGenerateTestConfig({.kernelCommandLine = L"WSL_DEBUG=hvsocket"}));
6156
+ VERIFY_ARE_EQUAL(LxsstuLaunchWsl(L"dmesg | grep -iF 'vmbus_send_tl_connect_request'"), 0L);
6157
+ }
6158
+
6159
}; // namespace UnitTests
6160
} // namespace UnitTests