From 7d34f668b9db0d303055eb50c4cb62ff4bf9d9e0 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 26 Oct 2025 17:07:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B5=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20RimWorld,=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=B1=D1=8B=D1=81=D1=82=D1=80=D1=8B=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D1=82=20=D0=B8=20=D0=BF=D0=BE=D0=B4=D1=80=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D1=8B=D0=B5=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8,=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20?= =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8=D1=82=D1=8C=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=83=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B8=20=D0=B8=D0=B7=D0=B1=D0=B5?= =?UTF-8?q?=D0=B6=D0=B0=D1=82=D1=8C=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEBUGGING_QUICKSTART_RU.txt | 170 -------------- DEBUGGING_RU.md | 444 ------------------------------------ 2 files changed, 614 deletions(-) delete mode 100644 DEBUGGING_QUICKSTART_RU.txt delete mode 100644 DEBUGGING_RU.md diff --git a/DEBUGGING_QUICKSTART_RU.txt b/DEBUGGING_QUICKSTART_RU.txt deleted file mode 100644 index 44b6e82..0000000 --- a/DEBUGGING_QUICKSTART_RU.txt +++ /dev/null @@ -1,170 +0,0 @@ -╔══════════════════════════════════════════════════════════════════════════╗ -║ 🐛 БЫСТРЫЙ СТАРТ - ОТЛАДКА МОДА ║ -╚══════════════════════════════════════════════════════════════════════════╝ - - -═══════════════════════════════════════════════════════════════════════════ - СПОСОБ 1: ATTACH TO PROCESS (С BREAKPOINTS) ⭐ -═══════════════════════════════════════════════════════════════════════════ - - ✅ Проект уже настроен для отладки! - ✅ .pdb файл создаётся автоматически при сборке - - 📋 ШАГИ: - - 1️⃣ Откройте проект в Visual Studio или Rider: - Source/AIImages/AIImages.csproj - - 2️⃣ Соберите в Debug режиме (уже собрано): - cd Source/AIImages - dotnet build -c Debug - - 3️⃣ Запустите RimWorld (через Steam или напрямую) - - 4️⃣ В Visual Studio: - • Debug → Attach to Process... (Ctrl+Alt+P) - • Найдите "RimWorldWin64.exe" - • Нажмите "Attach" - - В Rider: - • Run → Attach to Process... - • Найдите "RimWorldWin64" - • Нажмите OK - - 5️⃣ Откройте файл с кодом (например PawnGizmoPatch.cs) - - 6️⃣ Поставьте breakpoint: - • Кликните слева от номера строки - • Появится красная точка 🔴 - - 7️⃣ В игре выберите пешку - → Код остановится на breakpoint! - → Можно смотреть значения переменных - - -═══════════════════════════════════════════════════════════════════════════ - СПОСОБ 2: ЛОГИРОВАНИЕ (ПРОСТОЙ) 📝 -═══════════════════════════════════════════════════════════════════════════ - - 1️⃣ Добавьте в код Log.Message(): - - Log.Message("[AI Images] Pawn selected: " + __instance.Name); - - 2️⃣ Соберите проект: - dotnet build - - 3️⃣ Запустите RimWorld - - 4️⃣ В игре нажмите Ctrl+F12 → окно логов - - 5️⃣ Выберите пешку → увидите сообщение в логе! - - -═══════════════════════════════════════════════════════════════════════════ - ГОТОВЫЕ ПРИМЕРЫ ДЛЯ ВСТАВКИ -═══════════════════════════════════════════════════════════════════════════ - - 📍 В PawnGizmoPatch.cs (строка 16): - - Log.Message($"[AI Images] GetGizmos for: {__instance.Name}"); - - 📍 В Window_AIImage.cs (в DoWindowContents, строка 25): - - Log.Message($"[AI Images] Drawing window for: {pawn.Name}"); - - 📍 При нажатии кнопки (PawnGizmoPatch.cs, строка 34): - - Log.Message("[AI Images] Button clicked!"); - - -═══════════════════════════════════════════════════════════════════════════ - ГДЕ НАХОДЯТСЯ ЛОГИ -═══════════════════════════════════════════════════════════════════════════ - - В игре: - Ctrl+F12 → окно с логами в реальном времени - - Файл лога: - C:\Users\mrleo1nid\AppData\LocalLow\Ludeon Studios\ - RimWorld by Ludeon Studios\Player.log - - -═══════════════════════════════════════════════════════════════════════════ - ПОЛЕЗНЫЕ КОМАНДЫ -═══════════════════════════════════════════════════════════════════════════ - - Сборка в Debug (с .pdb): - cd Source/AIImages - dotnet build -c Debug - - Сборка в Release (без .pdb, для публикации): - dotnet build -c Release - - Очистка и пересборка: - dotnet clean - dotnet build -c Debug - - -═══════════════════════════════════════════════════════════════════════════ - СОВЕТЫ -═══════════════════════════════════════════════════════════════════════════ - - ✅ Используйте префикс [AI Images] в логах - легче искать - - ✅ Dev Mode в игре (Options → Settings → Development mode) - Даёт доступ к Debug Actions и Debug Inspector - - ✅ Логируйте важные моменты: - • Когда метод вызывается - • Значения переменных - • Успех/неудачу операций - - ✅ Try-Catch для отлова ошибок: - - try { - // Ваш код - } catch (Exception ex) { - Log.Error($"[AI Images] Error: {ex}"); - } - - -═══════════════════════════════════════════════════════════════════════════ - TROUBLESHOOTING -═══════════════════════════════════════════════════════════════════════════ - - ❓ Breakpoint не срабатывает? - → Убедитесь, что собрано в Debug (не Release) - → Проверьте, что .pdb файл есть в Assemblies/ - → Код действительно выполняется? (добавьте Log.Message) - - ❓ Не видите свой мод в Process List? - → Убедитесь, что мод загружен в игре - → Попробуйте перезапустить игру - - ❓ "Symbols not loaded"? - → Удалите все из Assemblies/ - → Пересоберите: dotnet clean && dotnet build -c Debug - - -═══════════════════════════════════════════════════════════════════════════ - ДОПОЛНИТЕЛЬНАЯ ДОКУМЕНТАЦИЯ -═══════════════════════════════════════════════════════════════════════════ - - 📖 Полная инструкция: DEBUGGING_RU.md - 📖 Примеры кода: DEV_CHEATSHEET.txt - - -╔══════════════════════════════════════════════════════════════════════════╗ -║ ✅ ВСЁ ГОТОВО ДЛЯ ОТЛАДКИ! ║ -║ ║ -║ Файлы в Assemblies/: ║ -║ • AIImages.dll ✅ ║ -║ • AIImages.pdb ✅ (отладочные символы) ║ -║ • 0Harmony.dll ✅ ║ -║ ║ -║ Запустите RimWorld и подключите отладчик! ║ -╚══════════════════════════════════════════════════════════════════════════╝ - - - Удачной отладки! 🐛→✨ - diff --git a/DEBUGGING_RU.md b/DEBUGGING_RU.md deleted file mode 100644 index 3d846c5..0000000 --- a/DEBUGGING_RU.md +++ /dev/null @@ -1,444 +0,0 @@ -# 🐛 Отладка мода RimWorld - -## Способы отладки - -### 1. 🔴 Attach to Process (Рекомендуется) - -Это самый удобный способ для отладки модов RimWorld. - -#### Visual Studio - -1. **Измените .csproj для включения отладочных символов:** - -```xml - - net472 - latest - ..\..\Assemblies - false - portable - true - -``` - -2. **Соберите проект в Debug режиме:** -```bash -cd Source/AIImages -dotnet build -c Debug -``` - -3. **Запустите RimWorld** - -4. **В Visual Studio:** - - Меню: `Debug` → `Attach to Process...` (или `Ctrl+Alt+P`) - - Найдите процесс `RimWorldWin64.exe` - - Нажмите `Attach` - -5. **Установите breakpoint:** - - Откройте файл с кодом (например, `PawnGizmoPatch.cs`) - - Кликните слева от номера строки (появится красная точка) - -6. **Триггерьте код в игре:** - - Выберите пешку → код остановится на breakpoint! - -#### JetBrains Rider - -1. **Настройте Run Configuration:** - - `Run` → `Edit Configurations...` - - `+` → `.NET Executable` - - Имя: `RimWorld Debug` - - Exe path: `D:\SteamLibrary\steamapps\common\RimWorld\RimWorldWin64.exe` - - Working directory: `D:\SteamLibrary\steamapps\common\RimWorld` - -2. **Соберите проект в Debug:** -```bash -dotnet build -c Debug -``` - -3. **Запустите через Rider:** - - `Run` → `Debug 'RimWorld Debug'` (или `Shift+F9`) - - Игра запустится с подключенным отладчиком - -4. **Breakpoints:** - - Работают так же, как в Visual Studio - ---- - -### 2. 📝 Логирование (Простой способ) - -Если не нужна полная отладка, используйте логирование. - -#### Добавьте в код: - -```csharp -using Verse; - -// Информационное сообщение -Log.Message("[AI Images] Pawn selected: " + __instance.Name); - -// Предупреждение -Log.Warning("[AI Images] Something suspicious"); - -// Ошибка -Log.Error("[AI Images] Something went wrong!"); -``` - -#### Просмотр логов: - -**В игре:** -- Нажмите `Ctrl+F12` → откроется окно логов -- Ищите строки с `[AI Images]` - -**Файл лога:** -- Windows: `C:\Users\YourName\AppData\LocalLow\Ludeon Studios\RimWorld by Ludeon Studios\Player.log` -- Или в папке RimWorld: `RimWorld\LogOutput\` - ---- - -### 3. 🎮 Dev Mode в игре - -Включите режим разработчика для дополнительных инструментов. - -#### Как включить: - -1. Запустите RimWorld -2. `Options` → `Settings` → включите `Development mode` -3. Перезапустите игру - -#### Что даёт Dev Mode: - -**Debug Actions Menu** (верхняя панель): -- Можно создавать своих debug actions -- Быстрое тестирование функций - -**Debug Inspector** (`Top bar` → `Tools` → `Debug inspector`): -- Кликните на любой объект -- Просмотр всех полей и свойств в реальном времени - -**Debug Log** (`Ctrl+F12`): -- Расширенная информация -- Трассировка стека - -#### Создание Debug Action: - -```csharp -using Verse; -using RimWorld; - -namespace AIImages -{ - public static class DebugActions - { - [DebugAction( - "AI Images", - "Test Window", - actionType = DebugActionType.ToolMapForPawns, - allowedGameStates = AllowedGameStates.PlayingOnMap - )] - public static void TestWindow(Pawn pawn) - { - Find.WindowStack.Add(new Window_AIImage(pawn)); - Log.Message($"[AI Images] Opened window for {pawn.Name}"); - } - } -} -``` - -Теперь в игре: -- Верхняя панель → `Debug Actions` -- Категория `AI Images` → `Test Window` -- Кликните на пешку → окно откроется - ---- - -### 4. 🔍 Продвинутая отладка - -#### dnSpy - декомпилятор с отладчиком - -**Установка:** -1. Скачайте dnSpy: https://github.com/dnSpy/dnSpy/releases -2. Распакуйте и запустите `dnSpy.exe` - -**Использование:** -1. `File` → `Open` → выберите `RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll` -2. Изучайте код RimWorld! -3. Можно ставить breakpoints прямо в коде игры - -**Attach to Process:** -1. Запустите RimWorld -2. В dnSpy: `Debug` → `Attach to Process` -3. Выберите `RimWorldWin64.exe` -4. Ставьте breakpoints в коде игры или вашего мода - ---- - -## ⚙️ Настройка проекта для отладки - -### Обновите AIImages.csproj: - -```xml - - - net472 - latest - ..\..\Assemblies - false - - - portable - true - false - - - - - None - false - true - - - - - - - -``` - -### Создайте .pdb файлы: - -После сборки в Debug режиме в папке `Assemblies/` появится: -- `AIImages.dll` - ваш мод -- `AIImages.pdb` - отладочные символы ✨ - ---- - -## 🎯 Практические примеры - -### Пример 1: Отладка Harmony патча - -**PawnGizmoPatch.cs:** - -```csharp -[HarmonyPostfix] -public static IEnumerable Postfix(IEnumerable __result, Pawn __instance) -{ - Log.Message($"[AI Images] GetGizmos called for: {__instance.Name}"); // 👈 Лог - - foreach (Gizmo gizmo in __result) - { - yield return gizmo; - } - - if (__instance.IsColonist && __instance.Spawned && __instance.Faction == Faction.OfPlayer) - { - Log.Message($"[AI Images] Adding button for: {__instance.Name}"); // 👈 Лог - - yield return new Command_Action - { - defaultLabel = "AI Image", - defaultDesc = "Open AI Image window", - icon = ContentFinder.Get("UI/Commands/AttackMelee", true), - action = delegate() - { - Log.Message($"[AI Images] Button clicked!"); // 👈 Лог - Find.WindowStack.Add(new Window_AIImage(__instance)); - } - }; - } -} -``` - -### Пример 2: Отладка окна - -**Window_AIImage.cs:** - -```csharp -public override void DoWindowContents(Rect inRect) -{ - try - { - Log.Message($"[AI Images] Drawing window for: {pawn.Name}"); // 👈 Лог - - Text.Font = GameFont.Medium; - Widgets.Label(new Rect(0f, 0f, inRect.width, 40f), "AI Image Window"); - - Text.Font = GameFont.Small; - Widgets.Label(new Rect(0f, 50f, inRect.width, 30f), "Pawn: " + pawn.NameShortColored.Resolve()); - - Widgets.DrawBoxSolid( - new Rect(10f, 100f, inRect.width - 20f, inRect.height - 150f), - new Color(0.2f, 0.2f, 0.2f, 0.5f) - ); - - Log.Message("[AI Images] Window drawn successfully"); // 👈 Лог - } - catch (System.Exception ex) - { - Log.Error($"[AI Images] Error drawing window: {ex}"); // 👈 Отлов ошибок - } -} -``` - -### Пример 3: Try-Catch для отлова ошибок - -```csharp -public static IEnumerable Postfix(IEnumerable __result, Pawn __instance) -{ - foreach (Gizmo gizmo in __result) - { - yield return gizmo; - } - - if (__instance.IsColonist && __instance.Spawned) - { - Command_Action button = null; - - try - { - button = new Command_Action - { - defaultLabel = "AI Image", - defaultDesc = "Open AI Image window", - icon = ContentFinder.Get("UI/Commands/AttackMelee", true), - action = delegate() - { - try - { - Find.WindowStack.Add(new Window_AIImage(__instance)); - } - catch (System.Exception ex) - { - Log.Error($"[AI Images] Failed to open window: {ex}"); - } - } - }; - } - catch (System.Exception ex) - { - Log.Error($"[AI Images] Failed to create button: {ex}"); - } - - if (button != null) - { - yield return button; - } - } -} -``` - ---- - -## 🚀 Быстрая отладка - Workflow - -### Вариант 1: С Breakpoints (Visual Studio/Rider) - -```bash -# 1. Сборка в Debug -cd Source/AIImages -dotnet build -c Debug - -# 2. Запустите RimWorld - -# 3. Attach отладчик (Ctrl+Alt+P в VS) - -# 4. Поставьте breakpoint в коде - -# 5. Триггерьте код в игре → останавливается на breakpoint -``` - -### Вариант 2: С логированием (быстрый) - -```bash -# 1. Добавьте Log.Message() в код - -# 2. Соберите -dotnet build - -# 3. Запустите RimWorld - -# 4. Ctrl+F12 → смотрите логи в реальном времени -``` - ---- - -## 📊 Полезные советы - -### 1. Используйте префикс в логах - -```csharp -Log.Message("[AI Images] Your message"); -``` - -Так проще искать в логе: `Ctrl+F` → `[AI Images]` - -### 2. Логируйте важные переменные - -```csharp -Log.Message($"[AI Images] Pawn: {pawn.Name}, Age: {pawn.ageTracker.AgeBiologicalYears}"); -``` - -### 3. Conditional compilation - -```csharp -#if DEBUG - Log.Message("[AI Images] Debug info"); -#endif -``` - -Эти строки будут работать только в Debug сборке! - -### 4. Проверяйте null - -```csharp -if (pawn?.health?.hediffSet != null) -{ - // Безопасно использовать -} -``` - -### 5. Используйте Debug Actions для тестирования - -Создавайте тестовые функции с `[DebugAction]` - это быстрее, чем играть вручную. - ---- - -## ⚠️ Частые проблемы - -### Breakpoint не срабатывает - -✅ Убедитесь, что: -- Проект собран в Debug (`dotnet build -c Debug`) -- Файл `.pdb` существует рядом с `.dll` -- Отладчик подключен к правильному процессу -- Код действительно выполняется (добавьте Log.Message для проверки) - -### "Symbols not loaded" - -✅ Решение: -- Удалите `Assemblies/*.dll` и `Assemblies/*.pdb` -- Пересоберите: `dotnet clean && dotnet build -c Debug` - -### Игра тормозит с отладчиком - -✅ Это нормально. Отладчик замедляет выполнение. - ---- - -## 🎓 Дополнительные материалы - -- **Visual Studio Debugging Guide**: https://docs.microsoft.com/en-us/visualstudio/debugger/ -- **Rider Debugging**: https://www.jetbrains.com/help/rider/Debugging_Code.html -- **dnSpy**: https://github.com/dnSpy/dnSpy - ---- - -## ✅ Готово! - -Теперь вы можете: -- ✅ Подключать отладчик к RimWorld -- ✅ Ставить breakpoints и смотреть переменные -- ✅ Использовать логирование -- ✅ Создавать Debug Actions для тестирования - -**Удачной отладки! 🐛→✨** -