IL2CPP で C# コードをデバッグするには、プロジェクトをビルドする前に Build Settings の Script Debugging を有効にし、Player 設定 またはマニフェストの InternetClient、InternetClientServer、PrivateNetworkClientServer の各機能を有効にします。マニフェストは、前のビルドの上にビルドするときにオーバーライトされません。そのため、機能を変更したい場合は、Visual Studio マニフェストエディターから行う必要があります。
デバッグの手順は他の Unity プラットフォームと同じです。詳細は、Unity での C# コードのデバッグ を参照してください。
C# コードのデバッグに加えて、Visual Studio を使用して生成された C++ コードをデバッグできます。
IL2CPP のクラスは <ClassName>_t#number
のようになります。<ClassName>
はクラスの名前で、#number は一意の型番号になります。 #number はいくつかの基本的な型にはありません。以下はその例です。
String_t
Object_t
Type_t
Char_t34
StringBuilder_t26
GuidParser_t1539
IL2CPP のメソッドは <ClassName>_<MethodName>_m#number
のようになります。<ClassName>
はメソッドの宣言型のクラス名、<MethodName>
はメソッド名、#number
は一意のメソッド番号です。以下はその例です。
GuidParser_ParseHex_m10003
ConfigurationSection_DoDeserializeSection_m1275
String_Format_m4102
Mathf_Sqrt_m289
Thing_Start_m1
static フィールド構造体は <ClassName>_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” フィールドを持っています。“static_fields” フィールドは、その特定の型の静的フィールドを含むメモリブロックへのポインターです。 実際の値を表示するには、このポインターを各型がそれぞれ持つ適切な静的フィールド構造体にキャストする必要があります。 以下の例は、クラス Thing_t24
の静的フィールドを監視しています。
IL2CPP では、ネイティブ C++ 例外を使用し、.NET 例外を実装します。例外を発生させる必要があるとき、IL2CPP は Il2CppExceptionWrapper オブジェクトを投げます。それは、以下のように定義されます。
struct Il2CppExceptionWrapper
{
Il2CppException* ex;
Il2CppExceptionWrapper (Il2CppException* ex) : ex (ex) {}
};
これらの例外オブジェクトは、簡単に Watch ウィンドウで確認できます。
最後に、例外処理でデバッガーのブレークを設けておくと便利です。そうすると、例外のソースを、その場で捕らえることができます。そのためには、Visual Studio で CTRL+ALT+E を押し、開いたウィンドウで、C++ Exceptions のチェックボックスがチェックされているのを確認します。
設定が終了すると、Visual Studio は例外が発生するといつでも、自動的に実行を止めます。
2018–10–18 編集レビュー 無しに修正されたページ - ページのフィードバックを残す
ユニバーサル Windows プラットフォームの IL2CPP 用の C#デバッグは 2018.2 で追加 NewIn20182
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.