2

我最近一直在将单声道运行时与某些应用程序集成,并且我正在使用Debug配置进行大部分测试。最近,我切换到Release,我注意到它开始崩溃。(我正在使用 msvs2010 编译器)。

我追踪了它,发现它是在调用通过mono_method_get_unmanaged_thunk. 导致它的配置之间的一个区别是/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 要么是空值,要么是有效的托管对象。

该方法的主体实际上什么也没做,在当前情况下,在进行一次布尔检查后,它只是以 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设置正在调整堆栈指针或一些寄存器(不知道到底是什么,我对这件事不是很了解),这就是为什么它运行没有问题,因为stdcallcdecl非常不同,这种不匹配可能导致崩溃两种配置。

于 2012-07-29T12:48:29.083 回答