- Вопрос или проблема
- Ответ или решение
- Решение проблемы подключения между WSL2 и Windows с использованием профайлера Tracy
- Теория
- Пример
- Применение
- Шаг 1: Получение IP-адреса Windows
- Шаг 2: Настройка программы на отправку данных на правильный IP
- Шаг 3: (Необязательно) Настройка порта в Windows Firewall
- Шаг 4: Запуск профайлера на Windows
- Заключение
Вопрос или проблема
Я пытаюсь научиться использовать Tracy profiler.
Кратко говоря, профилирование вашей программы состоит в том, чтобы включить заголовок Tracy, добавить несколько макросов Tracy в ваш код в местах, которые имеют отношение к вашему профилированию, и собрать ваш проект с определенными флагами компиляции Tracy.
Мои знания о сетевом взаимодействии не очень прочные, но если я правильно понимаю, ваша скомпилированная программа (с макросами профилирования Tracy) отправляет “объявления присутствия” через UDP-сообщения на 127.0.0.1:8086, и сервер Tracy прослушивает UDP-сообщения по этому адресу, затем подключается к клиенту по TCP (да: сервер подключается к клиенту).
Я скомпилировал свою программу на Linux, конкретно, Ubuntu WSL2, работающей на Windows 10. Когда я запускаю Tracy Profiler, tracy-profiler.exe
в среде Windows (я думаю, это синоним “сервера Tracy”, но я не уверен на 100%), подключаясь к 127.0.0.1, и запускаю свою программу в экземпляре Ubuntu WSL, профайлер застревает на этапе “Ожидание подключения…” (скриншот ниже)
Я думаю, что внедрил Tracy в свой код правильно, поэтому считаю, что это не проблема с интеграцией клиента Tracy в мой код или использованием профайлера Tracy, а скорее проблема с “сетевым взаимодействием” между Ubuntu WSL и “нативной”/содержащей средой Windows. Я не очень хорошо это понимаю, но мне кажется, что 127.0.0.1
с точки зрения Ubuntu WSL “отличается” от точки зрения Windows(?) Поэтому я думаю, даже если мой внедренный Tracy программой отправляет на “127.0.0.1:8086
“, а мой профайлер Tracy слушает на “127.0.0.1:8086
“, они на самом деле не ссылаются на один и тот же IP/порт(?).
Если это правильно, не могли бы вы посоветовать, как я могу заставить клиент и сервер Tracy транслировать/слушать на “одном” адресе/порту, чтобы профайлер Tracy мог действительно профилировать, что отправляет мое приложение?
Ответ или решение
Решение проблемы подключения между WSL2 и Windows с использованием профайлера Tracy
Теория
Профайлинг является важной частью процесса разработки программного обеспечения, позволяя детально измерять производительность программы и оптимизировать узкие места. В данном случае, вы используете Tracy — популярный инструмент для профайлинга, который предоставляет мощные функции для анализа работы вашего кода.
Вам необходимо настроить сеть между Windows Subsystem for Linux (WSL2) и вашим Windows-хостом. Главное понимание, которое нужно вынести из вашего вопроса, заключается в особенностях взаимодействия IP-адресов внутри WSL2 и в Windows. В WSL2, каждая сессия запускается с собственным виртуализированным сетевым интерфейсом, и фактически она находится в своей изолированной сети, что делает доступ к 127.0.0.1
из Windows невозможным, так как это локальный адрес только в среде WSL2.
Когда вы запускаете приложение с профайлингом в WSL2, оно пытается отправлять UDP-сообщения на 127.0.0.1:8086
, однако, это сообщение никогда не достигает вашего хоста Windows, так как на Windows под этим адресом находится другая сетевая изоляция.
Пример
Представьте, что WSL2 и ваш ПК на Windows — это две разные квартиры в одном многоквартирном доме. Заказанный вами почтовый адрес 127.0.0.1
— это адрес почтового ящика прямо внутри вашей квартиры, и он не доступен снаружи. Таким образом, даже если вы отправляете письма с этого адреса, они не могут попасть в другую квартиру, если вы не делаете явных действий по пересылке.
Для вашего случая с Tracy сервером, вам нужно, чтобы отправка данных с вашей программы из WSL2 достигала вашего Windows-хоста. Это можно организовать путём использования IP-адреса вашего Windows-хоста в сети, в которой находится WSL2, что требует некоторых дополнительных настроек.
Применение
Шаг 1: Получение IP-адреса Windows
Чтобы профайлер смог принимать сетевые сообщения из WSL2, вам требуется использовать IP-адрес Windows-хоста, который доступен из среды WSL2. Вы можете узнать текущий IP-адрес вашего Windows-хоста, на который WSL2 сможет отправить данные, выполнив команду в WSL2:
cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
Эта команда выводит IP-адрес вашего Windows-хоста, к которому можно будет обратиться из WSL.
Шаг 2: Настройка программы на отправку данных на правильный IP
Теперь, зная IP-адрес хоста, вам нужно убедиться, что ваша программа отправляет данные на нужный адрес и порт. В коде, где происходит отправка UDP сообщений, вместо использования 127.0.0.1
, прописывайте IP-адрес, полученный на первом шаге, с тем же портом 8086
.
Шаг 3: (Необязательно) Настройка порта в Windows Firewall
Если после выполнения первых двух шагов соединение не удаётся, убедитесь, что порт 8086
открыт в вашем Windows Firewall. Для этого вам нужно либо временно отключить все правила безопасности, либо создать специальное правило для разрешения трафика на этом порту.
Шаг 4: Запуск профайлера на Windows
Только после того, как всё вышеописанное будет настроено, запускайте ваш tracy-profiler.exe
из среды Windows и убедитесь, что он ждёт подключения на том же IP-адресе и порту, которые вы использовали в коде WSL2. Это, как правило, IP вашего Windows-хоста, полученный ранее.
Заключение
Таким образом, ключом к разрешению проблемы является правильная настройка сетевого взаимодействия между WSL2 и Windows. Понимание того, что 127.0.0.1
в WSL2 это не то же самое, что 127.0.0.1
в Windows — важнейший шаг к решению. Используйте адрес вашего Windows-хоста в сети WSL2 для обеспечения корректного обмена данными между вашей программой и профайлером Tracy.