2

最近、モノランタイムを特定のアプリに統合しており、Debug構成を使用してほとんどのテストを行っていました。最近、に切り替えたところRelease、クラッシュし始めたことに気付きました。(msvs2010 コンパイラを使用しています)。

追跡したところ、 経由で取得した関数ポインタを呼び出すときに発生していることがわかりましたmono_method_get_unmanaged_thunk。それを引き起こした構成の違いの 1 つは/O2、リリース/Odとデバッグでの最適化でした。私が観察したところ、マネージ メソッドが終了した直後にクラッシュが発生しました。これらの最適化に関する既知の考慮事項はありますか?

私のシナリオは次のとおりです。

ネイティブ コードでは、マネージド ランドにジャンプするための関数ポインターを取得しています。

bool (*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**);

マネージド側では、メソッドは非静的メソッドであるため、最初の引数はthis次のとおりです。

bool Managed_Method(int, SomeType a2, SomeType a3, SomeType a4)

ネイティブ側を初期化している間、私はそのようなポインターをフェッチしています:

Some_Method = (bool(*)(MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)) mono_method_get_unmanaged_thunk(method)

そして、取得したポインターを使用してマネージド メソッドを呼び出しています。

bool result = Some_Method(v, o1, o2, o3) 

ここで、o1、o2、o3 は null または有効な管理対象オブジェクトです。

メソッドの本体は実際には何もしません。現在のシナリオでは、1 つのブール値チェックを実行した後、false のままになります。

モノランタイム:2.10.8

4

1 に答える 1

3

私は答えを得ました - によって返される関数ポインタmono_method_get_unmanaged_thunk__stdcall慣例ですが、私のコンパイラのデフォルトは ですcdecl。したがって、次のように変更しました:

bool (*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)

の中へ

bool (__stdcall*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)

そして今、呼び出しはクラッシュすることなく実行されます。

設定がスタック ポインターまたはいくつかのレジスターを調整していたようDebugです (正確にはわかりませんが、私はその問題についてあまり詳しくありません)。これが問題なく実行されていた理由stdcallですcdecl。両方の構成。

于 2012-07-29T12:48:29.083 に答える