Windows ストア: IL2CPPスクリプトバックエンドでプラグイン
FAQ

Windows Store Apps: IL2CPP スクリプティングバックエンドのデバッグ

今のところ IL2CPP では C# のデバッガーがありませんが、 Visual Studio を使った C++ のコードでデバッグすることが可能です。

生成された C++ コードのクラスとメソッドの名前

IL2CPP のクラスは {ClassName}_t#number のようになります。{ClassName} はクラスのプレーンな名前で、#number はユニークなタイプ番号になります。 #number はいくつかのコアタイプの上に存在しません。例えば、

String_t
Object_t
Type_t
Char_t34
StringBuilder_t26
GuidParser_t1539


GuidParser_ParseHex_m10003
ConfigurationSection_DoDeserializeSection_m1275
String_Format_m4102
Mathf_Sqrt_m289
Thing_Start_m1


StringBuilder_t26_StaticFields
Thing_t24_StaticFields


// 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 では、静的フィールドは TypeInfo インスタンスそのものに保管されます。そのため、静的フィールドを 調査するために、最初に、TypeInfo 構造体に同じタイプのポインターを設定する必要があります。これらのポインターは、それを使用するメソッドのスコープ内にありますが、1 度使用した後、アプリケーションが作動している間は同じメモリアドレスに残ります。TypeInfo 構造体には “static_fields” フィールドがあり、それは、特にこのタイプの静的フィールドを含むメモリーブロックを指すポインターです。実際の値を見るために、このポインターは適当な静的フィールド構造体にキャストされる必要があります。例えば、Thing_t24 クラスの静的フィールドを見てみましょう。

例外の検証

IL2CPP では、ネイティブ C++ 例外を使用し、.NET 例外を実装します。例外を発生させるとき、IL2CPP は Il2CppExceptionWrapper オブジェクトを投げます。それは、以下のように定義します。

struct Il2CppExceptionWrapper
{
    Il2CppException* ex;

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

最後に、例外処理でデバッガブレークを設けておくと便利です。そうすると、例外のソースを、その場で捕らえることができます。そのためには、Visual Studio で CTRL+ALT+E を押し、開いたウィンドウで、C++ の例外のチェックボックスがチェックされているのを確認します。

設定が終了すると、Visual Studio は例外が発生するときはいつでも、自動的に実行を止めます。

IL2CPP のメソッドは {ClassName}_{MethodName}_m#number のようになります。{ClassName} はメソッドを宣言しているプレーンなクラス名で、{MethodName} はプレーンなメソッド名です。#number はユニークなメソッド番号です。例えば、 static フィールド構造は {ClassName}_t#number_StaticFields のようになります。構造名の最初の一部は宣言されたタイプのクラス名です。例えば、 また、それぞれのクラス/メソッドの定義の上に完全なクラス/メソッド名がコメントとして付加されています。例えば、

変数の値を監視する

これらの例外オブジェクトは、簡単にウォッチウィンドウで確認できます。

Windows ストア: IL2CPPスクリプトバックエンドでプラグイン
FAQ