gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:08:33 24 4
gpt4 key购买 nike

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

我追踪到了它,发现它是在调用通过 mono_method_get_unmanagement_thunk 获取的函数指针时发生的。导致此问题的配置之间的一个差异是发布中的优化 /O2 与调试中的 /Od 。据我观察,崩溃发生在托管方法离开后。关于这些优化是否有一些已知的考虑因素?

我的场景如下:

在 native 代码中,我正在获取函数指针以跳转到托管区域:

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

在托管端,该方法是非静态方法,因此第一个参数是 this:

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

在初始化 native 端时,我正在获取这样的指针:

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,要么为有效的托管对象。

该方法的主体实际上什么也不做,在当前情况下,在进行一次 bool 检查后,它只是留下 false。

单声道运行时:2.10.8

最佳答案

我得到了答案 - mono_method_get_unmanagement_thunk 返回的函数指针是 __stdcall 约定,而我的编译器的默认值是 cdecl,因此我更改了:

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

进入

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

现在执行调用不会崩溃。

似乎调试设置正在调整堆栈指针或某些寄存器(不知道到底是什么,我对这件事不是很了解),这就是它运行没有问题的原因,因为stdcallcdecl 非常不同,这种不匹配可能会导致两种配置崩溃。

关于mono_method_get_unmanagement_thunk - 使用/O2编译器设置崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11707899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com