Отладка кода C#
Для отладки кода C# с помощью IL2CPPразработанной в Unity серверной части сценариев, которую можно использовать в качестве альтернативы Mono при создание проектов для некоторых платформ. Подробнее
См. в Словарь, включите Отладку скриптов в настройках сборки перед сборкой проекта и включите InternetClient, InternetClientServer и PrivateNetworkClientServer в настройках проигрывателянастройках, которые позволяют устанавливать различные финальная игра, созданная Unity. Подробнее
См. в Словарь или в манифесте. Манифест не перезаписывается при сборке поверх предыдущей сборки, поэтому, если вы хотите изменить возможности, вам нужно сделать это в редакторе манифеста Visual Studio.
Процедура отладки такая же, как и на любой другой платформе Unity. Дополнительную информацию см. в разделе Отладка кода C# в Unity.
Отладка сгенерированного кода C++
Помимо отладки кода C#, вы можете отлаживать сгенерированный код C++ с помощью Visual Studio.
Именование классов и методов в сгенерированном коде C++
Класс IL2CPP выглядит следующим образом:
, где
— простое имя класса. , а #number — уникальный номер типа. #number отсутствует в некоторых основных типах. Например:
String_t
Object_t
Type_t
Char_t34
StringBuilder_t26
GuidParser_t1539
Методы IL2CPP выглядят следующим образом:
, где
— это простое имя класса методов, объявляющих тип,
– это простое имя метода, а #number
– уникальный номер метода. Например:
GuidParser_ParseHex_m10003
ConfigurationSection_DoDeserializeSection_m1275
String_Format_m4102
Mathf_Sqrt_m289
Thing_Start_m1
Структуры статических полей именуются следующим образом:
, где первая часть имени структуры идентична объявляющему типу, например: р>
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