Удалены файлы документации по отладке мода RimWorld, включая быстрый старт и подробные инструкции, чтобы улучшить структуру проекта и избежать дублирования информации.
This commit is contained in:
@@ -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 и подключите отладчик! ║
|
|
||||||
╚══════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
|
|
||||||
Удачной отладки! 🐛→✨
|
|
||||||
|
|
||||||
444
DEBUGGING_RU.md
444
DEBUGGING_RU.md
@@ -1,444 +0,0 @@
|
|||||||
# 🐛 Отладка мода RimWorld
|
|
||||||
|
|
||||||
## Способы отладки
|
|
||||||
|
|
||||||
### 1. 🔴 Attach to Process (Рекомендуется)
|
|
||||||
|
|
||||||
Это самый удобный способ для отладки модов RimWorld.
|
|
||||||
|
|
||||||
#### Visual Studio
|
|
||||||
|
|
||||||
1. **Измените .csproj для включения отладочных символов:**
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net472</TargetFramework>
|
|
||||||
<LangVersion>latest</LangVersion>
|
|
||||||
<OutputPath>..\..\Assemblies</OutputPath>
|
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
|
||||||
<DebugType>portable</DebugType>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
</PropertyGroup>
|
|
||||||
```
|
|
||||||
|
|
||||||
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
|
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net472</TargetFramework>
|
|
||||||
<LangVersion>latest</LangVersion>
|
|
||||||
<OutputPath>..\..\Assemblies</OutputPath>
|
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
|
||||||
|
|
||||||
<!-- Настройки отладки -->
|
|
||||||
<DebugType>portable</DebugType>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<!-- Release конфигурация (без отладочных символов) -->
|
|
||||||
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
|
||||||
<DebugType>None</DebugType>
|
|
||||||
<DebugSymbols>false</DebugSymbols>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Krafs.Rimworld.Ref" Version="1.5.4104" />
|
|
||||||
<PackageReference Include="Lib.Harmony" Version="2.3.3" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Создайте .pdb файлы:
|
|
||||||
|
|
||||||
После сборки в Debug режиме в папке `Assemblies/` появится:
|
|
||||||
- `AIImages.dll` - ваш мод
|
|
||||||
- `AIImages.pdb` - отладочные символы ✨
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Практические примеры
|
|
||||||
|
|
||||||
### Пример 1: Отладка Harmony патча
|
|
||||||
|
|
||||||
**PawnGizmoPatch.cs:**
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
[HarmonyPostfix]
|
|
||||||
public static IEnumerable<Gizmo> Postfix(IEnumerable<Gizmo> __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<Texture2D>.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<Gizmo> Postfix(IEnumerable<Gizmo> __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<Texture2D>.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 для тестирования
|
|
||||||
|
|
||||||
**Удачной отладки! 🐛→✨**
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user