C# GC收集';钉住';在Xamarin.iOS中调用绑定时的数组

C# GC收集';钉住';在Xamarin.iOS中调用绑定时的数组,c#,objective-c,xamarin,xamarin.ios,accelerate-framework,C#,Objective C,Xamarin,Xamarin.ios,Accelerate Framework,下午, 我已经将相同的Xamarin.iOS绑定到本机代码大约3年了,工作得完美无缺,但最近我注意到一种崩溃行为,这种行为可能从一开始就存在。我处理大型(也包括小型)数组的绑定,如图像等 问题:GC似乎正在收集一些结构,而对本机的非托管调用正在运行。我用不安全的固定语句“固定”涉及的数据和方法绑定调用 fixed (double* px = _px) { fixed (double* py = _py) { fixed (double* param = param

下午,

我已经将相同的Xamarin.iOS绑定到本机代码大约3年了,工作得完美无缺,但最近我注意到一种崩溃行为,这种行为可能从一开始就存在。我处理大型(也包括小型)数组的绑定,如图像等

问题:GC似乎正在收集一些结构,而对本机的非托管调用正在运行。我用不安全的固定语句“固定”涉及的数据和方法绑定调用

fixed (double* px = _px)
{
    fixed (double* py = _py)
    {
        fixed (double* param = parameters)
        {
            fixed (int* distMap = _distMap)
            {
                IntPtr dataPxPtr = new IntPtr((void*)px);
                IntPtr dataPyPtr = new IntPtr((void*)py);
                IntPtr parametersPtr = new IntPtr((void*)param);
                IntPtr distMapPtr = new IntPtr((void*)distMap);
                _bindings.Initiate(dataPxPtr, dataPyPtr, parametersPtr, distMapPtr, 1E-4, Size.Width);
                _bindings.Iterate();
            }
        }
    }
}
理论上,嵌套的固定语句应该在绑定方法运行时固定内存地址。但事实似乎并非如此

Xamarin侧堆叠跟踪

Warning (239) / iOSApp: critical:   at <unknown> <0xffffffff>
Warning (239) / iOSApp: critical:   at (wrapper managed-to-native) ...Messaging.void_objc_msgSend (intptr,intptr) <0x00007>
Warning (239) / iOSApp: critical:   at ...Bindings.Iterate () <0x00047>
Exception Type:  EXC_BAD_ACCESS (SIGABRT)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000001088fc018
Triggered by Thread:  4

Thread 4 name:  tid_681f
Thread 4 Crashed:
0   libsystem_kernel.dylib          0x0000000182cac11c __pthread_kill + 8
1   libsystem_pthread.dylib         0x0000000182d78ef8 pthread_kill + 112
2   libsystem_c.dylib               0x0000000182c1ddc8 abort + 140
3   iOSApp                          0x0000000100ed26cc mono_handle_native_sigsegv (mini-exceptions.c:2462)
4   iOSApp                          0x0000000100eddccc mono_sigsegv_signal_handler (mini-runtime.c:2906)
5   libsystem_platform.dylib        0x0000000182d7194c _sigtramp + 68
6   iOSApp                          0x00000001000ed77c lmdif_ (lmdif_.c:468)
7   iOSApp                          0x00000001000f1e44 lmdif1_ (lmdif1_.c:153)
8   iOSApp                          0x00000001000ec3c8 -[Bindings iterate] (Bindings.m:403)
9   iOSApp                          0x0000000101bf1698 wrapper_managed_to_native_Bindings_Messaging_void_objc_msgSend_intptr_intptr (/<unknown>:1)
10  iOSApp                          0x0000000101bf0428 Bindings_Iterate (/<unknown>:1)
警告(239)/iOSApp:critical:at
警告(239)/iOSApp:critical:at(包装器管理为本机)…Messaging.void\u objc\u msgSend(intptr,intptr)
警告(239)/iOSApp:critical:at…Bindings.Iterate()
XCode Stacktrace

Warning (239) / iOSApp: critical:   at <unknown> <0xffffffff>
Warning (239) / iOSApp: critical:   at (wrapper managed-to-native) ...Messaging.void_objc_msgSend (intptr,intptr) <0x00007>
Warning (239) / iOSApp: critical:   at ...Bindings.Iterate () <0x00047>
Exception Type:  EXC_BAD_ACCESS (SIGABRT)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000001088fc018
Triggered by Thread:  4

Thread 4 name:  tid_681f
Thread 4 Crashed:
0   libsystem_kernel.dylib          0x0000000182cac11c __pthread_kill + 8
1   libsystem_pthread.dylib         0x0000000182d78ef8 pthread_kill + 112
2   libsystem_c.dylib               0x0000000182c1ddc8 abort + 140
3   iOSApp                          0x0000000100ed26cc mono_handle_native_sigsegv (mini-exceptions.c:2462)
4   iOSApp                          0x0000000100eddccc mono_sigsegv_signal_handler (mini-runtime.c:2906)
5   libsystem_platform.dylib        0x0000000182d7194c _sigtramp + 68
6   iOSApp                          0x00000001000ed77c lmdif_ (lmdif_.c:468)
7   iOSApp                          0x00000001000f1e44 lmdif1_ (lmdif1_.c:153)
8   iOSApp                          0x00000001000ec3c8 -[Bindings iterate] (Bindings.m:403)
9   iOSApp                          0x0000000101bf1698 wrapper_managed_to_native_Bindings_Messaging_void_objc_msgSend_intptr_intptr (/<unknown>:1)
10  iOSApp                          0x0000000101bf0428 Bindings_Iterate (/<unknown>:1)
异常类型:EXC\u坏访问(SIGABRT)
异常子类型:0x00000001088fc018处的内核地址无效
由线程触发:4
螺纹4名称:tid_681f
线程4崩溃:
0 libsystem\u kernel.dylib 0x0000000182cac11c\uu pthread\u kill+8
1 libsystem\u pthread.dylib 0x0000000182d78ef8 pthread\u kill+112
2 libsystem\u c.dylib 0x0000000182c1ddc8中止+140
3 iOSApp 0x0000000100ed26cc单声道句柄本机sigsegv(小型例外。c:2462)
4 iOSApp 0x0000000100EDDCC单信号信号处理器(mini-runtime.c:2906)
5 libsystem\u platform.dylib 0x0000000182d7194c\u sigtramp+68
6 iOSApp 0x00000001000ed77c lmdif(lmdif.c:468)
7 iOSApp 0x00000001000f1e44 lmdif1(lmdif1.c:153)
8 iOSApp 0x00000001000ec3c8-[绑定迭代](Bindings.m:403)
9 iOSApp 0x0000000101bf1698包装器\u托管\u到\u本机\u绑定\u消息传递\u无效\u对象jc\u msgSend\u intptr\u intptr(/:1)
10 iOSApp 0x0000000101bf0428绑定迭代(/:1)
我试过了,但没有成功:

  • 试图将C#中的深度副本复制到IntPtr并将其传递给绑定
  • 试图在obj-c中将深度副本传递给绑定后立即在obj-c中创建深度副本
  • 正在尝试将数组固定在C#托管端(GCHandle),并使用它们传递给BING(obv后的GCHandle.free())
  • 其他的我不记得了
任何帮助都将不胜感激,因为我快发疯了

谢谢

安东尼奥