Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Универсальная платформа Windows: отладка на IL2CPP Scripting Backend

Отладка кода C#

Для отладки кода C# с помощью IL2CPPразработанной в Unity серверной части сценариев, которую можно использовать в качестве альтернативы Mono при создание проектов для некоторых платформ. Подробнее
См. в Словарь
, включите Отладку скриптов в настройках сборки перед сборкой проекта и включите InternetClient, InternetClientServer и PrivateNetworkClientServer в настройках проигрывателянастройках, которые позволяют устанавливать различные финальная игра, созданная Unity. Подробнее
См. в Словарь
или в манифесте. Манифест не перезаписывается при сборке поверх предыдущей сборки, поэтому, если вы хотите изменить возможности, вам нужно сделать это в редакторе манифеста Visual Studio.

Процедура отладки такая же, как и на любой другой платформе Unity. Дополнительную информацию см. в разделе Отладка кода C# в Unity.

Отладка сгенерированного кода C++

Помимо отладки кода C#, вы можете отлаживать сгенерированный код C++ с помощью Visual Studio.

Именование классов и методов в сгенерированном коде C++

Класс IL2CPP выглядит следующим образом: _t#number, где  — простое имя класса. , а #number — уникальный номер типа. #number отсутствует в некоторых основных типах. Например:

String_t Object_t Type_t Char_t34 StringBuilder_t26 GuidParser_t1539

Методы IL2CPP выглядят следующим образом: __m#number, где — это простое имя класса методов, объявляющих тип,  – это простое имя метода, а #number – уникальный номер метода. Например:

GuidParser_ParseHex_m10003 ConfigurationSection_DoDeserializeSection_m1275 String_Format_m4102 Mathf_Sqrt_m289 Thing_Start_m1

Структуры статических полей именуются следующим образом: _t#number_StaticFields, где первая часть имени структуры идентична объявляющему типу, например: StringBuilder_t26_StaticFields Thing_t24_StaticFields

Кроме того, над каждым определением класса/метода есть комментарий C++ с указанием полного имени класса/метода. Например:

// System.String struct String_t : public Object_t { // System.Int32 System.String::length int32_t _length_0; // System.Char System.String::start_char uint16_t _start_char_1; }; // System.Text.StringBuilder struct StringBuilder_t26 : public Object_t { // System.Int32 System.Text.StringBuilder::_length int32_t length_1; // System.String System.Text.StringBuilder::_str String_t* str_2; // System.String System.Text.StringBuilder::_cached_str String_t* cached_str_3; // System.Int32 System.Text.StringBuilder::_maxCapacity int32_t maxCapacity_4; }; // System.Void MyData::.ctor() extern "C" void MyData_ctor_m0 (MyData_t2 * this, const MethodInfo* method) { ... } // Thing struct Thing_t24 : public MonoBehaviour_t25 { // MyData Thing::m_Data MyData_t2 * _m_Data_2; // System.Text.StringBuilder Thing::m_Builder StringBuilder_t26 * _m_Builder_3; }; struct Thing_t24_StaticFields { // System.Int32 Thing::s_SomeStaticField int32_t _s_SomeStaticField_4; };

Наблюдение за значениями переменных

Одной из наиболее важных частей отладки является наблюдение за значениями различных переменных. Visual Studio позволяет сделать это относительно легко, либо наведя указатель мыши на переменную, либо добавив ее в окно просмотра. Например:

Наблюдение за статическими полями немного сложнее. В IL2CPP статические поля хранятся в самом экземпляре Il2CppClass. Итак, чтобы наблюдать за статическим полем, нам сначала понадобится указатель на структуру Il2CppClass этого типа. Эти указатели относятся к методам, которые их используют, но после однократного наблюдения они останутся по тому же адресу памяти на время выполнения приложения. Структура Il2CppClass имеет поле «static_fields», которое является указателем на блок памяти, содержащий статические поля для этого конкретного типа. Чтобы просмотреть фактические значения, этот указатель должен быть приведен к соответствующей структуре статического поля: у каждого типа она своя. Например, посмотрим на статические поля класса Thing_t24:

Исследование исключений

IL2CPP использует собственные исключения C++ для реализации исключений .NET. Когда предполагается создание какого-либо исключения, IL2CPP генерирует объект Il2CppExceptionWrapper, который определяется следующим образом:

struct Il2CppExceptionWrapper { Il2CppException* ex; Il2CppExceptionWrapper (Il2CppException* ex) : ex (ex) {} };

Эти объекты-исключения можно легко исследовать в окне просмотра:

Наконец, может быть полезно включить прерывание отладчика при исключении, чтобы можно было поймать источник исключения с поличным. Для этого нажмите CTRL+ALT+E в Visual Studio и убедитесь, что в открывшемся окне установлен флажок Исключения C++:

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


  • Отладка C# для IL2CPP на универсальной платформе Windows добавлена в 2018.2
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3