Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

Введение в отладку Unity в Windows

Для отладки приложений Unity на Windows, а также для выявления и решения проблем во время выполнения можно использовать различные инструменты и методы.

В этом руководстве рассматриваются практические типы отладки, такие как отладка в реальном времени и судебная отладка. В нем также рассматриваются важные концепции, такие как символы и управляемые исключения, которые поддерживают и улучшают процесс отладки.

Символы Unity

Символы предоставляют отладочную информацию, включая имена функций, имена переменных и номера строк исходного кода. Эта информация помогает отладчику (например, WinDbg или Visual Studio) отображать адреса памяти низкого уровня обратно в читаемые, удобные для человека данные.

Хранилище символов Unity (http://symbolserver.unity3d.com/) предоставляет символы отладки, специфичные для приложений и разработки Unity. Вы можете настроить отладчик Windows (WinDbg) или Visual Studio (2019 и более поздние версии) для автоматической загрузки и разрешения этих символов, чтобы помочь вам отладывать приложения Unity.

Инструкции по настройке WinDbg или Visual Studio для разрешения символов Unity см. в Настройка отладчика для отладки Unity в Windows.

Примечание: По своей конструкции Unity Symbol Store URL не является веб-страницей, которую можно просматривать. Если вы посетите ссылку непосредственно в браузере, она не отображает никакого содержимого. Символы доступны только с помощью инструментов отладки.

Встроенные инструменты отладки

В разработке Unity, встроенная отладка относится к процессу отладки неуправляемого кода, который является кодом, написанным на низкоуровневых языках, таких как C, C++ или Ассемблер. Этот тип отладки обычно необходим для кода движка Unity, встроенных плагинов или внешних библиотек.

На Windows отладчики используют файлы Program Database (PDB) (с расширением .pdb). В этих файлах хранится информация о символах, например, имена функций и номера строк, для соответствующих двоичных файлов, таких как исполняемые файлы (.exe) или библиотеки (.dll).

Этот тип отладки используется для анализа низкоуровневых проблем, таких как повреждение памяти, нарушения доступа или проблемы, связанные с производительностью.

Чтобы эффективно использовать встроенные средства отладки для Unity, необходимо настроить их на работу с символами Unity, которые обеспечивают дополнительную видимость неуправляемого кода, специфичного для Unity. Инструкции см. в разделе Настройка отладчика для отладки Unity в Windows.

C# управляемая отладка

Управляемая отладка относится к отладке высокоуровневого кода, который запускается в управляемой среде исполнения. В Unity это в первую очередь включает отладку логики C# скриптов, написанных для расширения поведения игры с помощью MonoBehaviour классов и других Unity APIs.

Для отладки управляемого кода Unity можно использовать такие средства отладки, как Visual Studio, но также можно использовать окно консоли Unity. В окне консоли отображаются ошибки, предупреждения и сообщения консоли, если в Unity Editor перейти в режим воспроизведения.

Отладка в реальном времени

Отладка в реальном времени — это процесс, в котором отладчик подключается к уже запущенному процессу или к процессу, в котором обнаружено исключение. Чтобы отладчик обнаружил проблему, необходимо настроить средство отладки на использование символов Unity в сборки. Инструкции см. в разделе Настройка Visual Studio для отладки Unity.

Инструкции по использованию отладки в режиме реального времени в Unity см. в Настройка отладки в режиме реального времени для Unity.

Примечание: Если исполняемый файл вашей игры имеет то же имя, что и название вашей игры, отладчику может быть трудно найти правильный файл .pdb. Это особенно верно, если отладчик не имеет доступа к переименованному исполняемому файлу.

Судебная отладка

Когда приложения заканчивают работу из-за сбоя, они иногда создают файл с дамом сбоя. Судебная отладка (или отладка после сбоя) — это анализ этого файла для выяснения причины сбоя.

По умолчанию, Windows настроен для отправки отчетов о сбоях приложений в Microsoft Dr. Watson или Windows Службы отчетов об ошибках. Однако, если у вас есть Visual Studio или WinDbg установленный, Майкрософт обеспечивает вариант к отладка сбоев.

Windows обеспечивает возможности для исследования файлов дампов аварий (.dmp или .mdmp). В зависимости от дампов аварий, вы можете найти либо информацию о стеке, либо всю память процесса. Файл дампов аварий содержит информацию, которая помогает определить причину аварии. Он обычно включает в себя след стек, при условии, что стек неповрежден и допустим для анализа.

Для исследования файла дампа, вы можете загрузить его в Visual Studio или WinDbg. Хотя Visual Studio проще в использовании, WinDbg предоставляет дополнительные возможности, что делает его предпочтительным средством отладки.

Чтобы узнать, как заставить приложение создавать файл дампа, см. Настройка криминалистической отладки для Unity.

Плагин UnityMixedCallstack

При запуске Visual Studio можно использовать расширение UnityMixedCallstack для Visual Studio Code от Unity. Это расширение переводит нечитаемые рамки стеков, управляемые Mono, в читаемые, что упрощает отладку встроенного кода.

Управляемые исключения в Unity

Управляемые исключения возникают, когда ошибки происходят в управляемом коде, например в коде C#, выполняемом в Mono или в режиме выполнения .NET. Эти исключения обрабатываются механизмом обработки исключений управляемого режима выполнения.

Например, ошибка NullReferenceException возникает, когда код пытается получить доступ к члену в ссылке на нулевой объект.

Пример: Отладка исключения нулевого указателя

В следующих примерах показано, как может выглядеть нулевая ссылка с подключенным встроенным отладчиком.

В этом примере показан скрипт Unity C#, который вызывает исключение нулевой ссылки:

    private string name = null;

    void Start()
    {
        Debug.Log(name.Length);
    }

Когда этот код запускается с помощью встроенного отладчика (например, Visual Studio), окно вывода отображает:

Exception thrown at 0x00000142725F6438 in Unity.exe: 0xC0000005: Access violation reading location 0x0000000000000010.

При использовании Visual Studio с включенным плагином UnityMixedCallstack кадры управляемого стека становятся читаемыми, как показано на следующем стеке вызова:

    [Assembly-CSharp.dll] SpinMe:Start ()   Unknown
    [mscorlib.dll] (wrapper runtime-invoke) object:runtime_invoke_void__this__ (object,intptr,intptr,intptr)    Unknown
    mono-2.0-bdwgc.dll!mono_jit_runtime_invoke(_MonoMethod * method, void * obj, void * * params, _MonoObject * * exc, _MonoError * error) Line 3445    C
    mono-2.0-bdwgc.dll!do_runtime_invoke(_MonoMethod * method, void * obj, void * * params, _MonoObject * * exc, _MonoError * error) Line 3068  C
    [Inline Frame] mono-2.0-bdwgc.dll!mono_runtime_try_invoke(_MonoMethod *) Line 3175  C
    mono-2.0-bdwgc.dll!mono_runtime_invoke(_MonoMethod * method, void * obj, void * * params, _MonoObject * * exc) Line 3115    

SpinMe:Start() появляется в стеке вызовов из-за плагина смешанного стека вызовов. Без плагина имя метода нечитаемо.

Разрешение нечитаемых управляемых кадров

Управляемые кадры — это строки трассировки стека, в которых отсутствует подробная информация, например, имена файлов или номера строк. Вместо этого они отображают Unknown.

Чтобы получить более подробную информацию, вы можете использовать встроенный mono_pmip функция. Эта функция принимает адрес кадра стека и возвращает char* с информацией. Вы можете вызвать mono_pmip в Visual Studio Немедленно окно (Отладка > Windows > Немедленно) для отладки. Дополнительные сведения об этой функции см. в Отладка с Visual Studio на Windows (Mono).

> `?(char*){,,mono-2.0-bdwgc.dll}mono_pmip((void*)0x1b45558c)`  
0x26a296c0 " Tiles:OnPostRender () + 0x1e4 (1B4553A8 1B4555DC) [065C6BD0 - Unity Child Domain]"`

Примечание: Это работает только тогда, когда символы mono-2.0-bdwgc.dll загружены полностью.

Дополнительные ресурсы