mono_method_get_unmanaged_thunk - 使用/ O2编译器设置崩溃

时间:2012-07-29 08:45:20

标签: mono crash

我最近一直在将单声道运行时与某些应用集成在一起,而我正在使用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

1 个答案:

答案 0 :(得分: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设置正在调整堆栈指针或一些寄存器(不知道究竟是什么,我对此并不是很了解),这就是为什么它运行没有问题,因为{{1} }和stdcall非常不同,这种不匹配可能会导致两种配置崩溃。