【问题标题】:Xamarin iOS throws System.TypeInitializationException when loading a large native libraryXamarin iOS 在加载大型本机库时抛出 System.TypeInitializationException
【发布时间】:2013-08-21 18:45:39
【问题描述】:

我有一个使用 Xamarin iOS 构建的 iOS 应用程序,在加载具有用于 PInvoke 调用的 DllImport 属性的类时崩溃。例外是:

Unhandled managed exception: An exception was thrown by the type initializer for Pazanga.Native.ZzPINVOKE (System.TypeInitializationException)

该应用运行良好,但在原生库变大时开始崩溃。裁剪库的某些部分后它再次工作,但在链接一个新库后它又开始崩溃。崩溃发生在对本机库进行任何实际调用之前。

这是崩溃后的设备日志:http://pastebin.com/vW3CMXHq

内部异常是:

Aug 23 10:33:40 Outboxs-iPod pazanga[4216] <Warning>: System.TypeInitializationException: An exception was thrown by the type initializer for Pazanga.Native.ZzPINVOKE ---> System.TypeInitializationException: An exception was thrown by the type initializer for SWIGStringHelper ---> System.ExecutionEngineException: Attempting to JIT compile method '(wrapper native-to-managed) Pazanga.Native.ZzPINVOKE/SWIGStringHelper:CreateString (intptr)' while running with --aot-only. See http://docs.xamarin.com/ios/about/limitations for more information.
at (wrapper managed-to-native) object:__icall_wrapper_mono_delegate_to_ftnptr (object)
at (wrapper managed-to-native) Pazanga.Native.ZzPINVOKE/SWIGStringHelper:SWIGRegisterStringCallback_Zz (Pazanga.Native.ZzPINVOKE/SWIGStringHelper/SWIGStringDelegate)
at Pazanga.Native.ZzPINVOKE+SWIGStringHelper..cctor () [0x00017] in /Users/max/Code/pazanga/mobile/ios/bindings/ZzPINVOKE.cs:229
--- End of inner exception stack trace ---
at Pazanga.Native.ZzPINVOKE..cctor () [0x0000a] in /Users/max/Code/pazanga/mobile/ios/bindings/ZzPINVOKE.cs:233
--- End of inner exception stack trace ---
at Pazanga.Native.Zz.locate (System.Byte[] image, image_format format, Int32 width, Int32 height, Int32 x, Int32 y) [0x00009] in /Users/max/Code/pazanga/mobile/ios/bindings/Zz.cs:16
at Pazanga.CaptureDecode.ProcessFrame (System.Byte[] data, Int32 dataWidth, Int32 dataHeight, Boolean isPicture) [0x000cf] in /Users/max/Code/pazanga/mobile/common/CaptureDecode.cs:95
at Pazanga.iOS.CaptureViewController.HandleNewFrame (System.Byte[] data, Int32 width, Int32 height) [0x0003b] in /Users/max/Code/pazanga/mobile/ios/App/CaptureViewController.cs:128
at Pazanga.iOS.CaptureManager.OnNewFrame (System.Byte[] array, Int32 width, Int32 height) [0x00015] in /Users/max/Code/pazanga/mobile/ios/App/CaptureManager.cs:126
at Pazanga.iOS.CaptureManager+OutputDelegate.DidOutputSampleBuffer (MonoTouch.AVFoundation.AVCaptureOutput captureOutput, MonoTouch.CoreMedia.CMSampleBuffer sampleBuffer, MonoTouch.AVFoundation.AVCaptureConnection connection) [0x000c6] in /Users/max/Code/pazanga/mobile/ios/App/CaptureManager.cs:110
Aug 23 10:33:40 Outboxs-iPod pazanga[4216] <Warning>: System.TypeInitializationException: An exception was thrown by the type initializer for SWIGStringHelper ---> System.ExecutionEngineException: Attempting to JIT compile method '(wrapper native-to-managed) Pazanga.Native.ZzPINVOKE/SWIGStringHelper:CreateString (intptr)' while running with --aot-only. See http://docs.xamarin.com/ios/about/limitations for more information.
at (wrapper managed-to-native) object:__icall_wrapper_mono_delegate_to_ftnptr (object)
at (wrapper managed-to-native) Pazanga.Native.ZzPINVOKE/SWIGStringHelper:SWIGRegisterStringCallback_Zz (Pazanga.Native.ZzPINVOKE/SWIGStringHelper/SWIGStringDelegate)
at Pazanga.Native.ZzPINVOKE+SWIGStringHelper..cctor () [0x00017] in /Users/max/Code/pazanga/mobile/ios/bindings/ZzPINVOKE.cs:229
--- End of inner exception stack trace ---
at Pazanga.Native.ZzPINVOKE..cctor () [0x0000a] in /Users/max/Code/pazanga/mobile/ios/bindings/ZzPINVOKE.cs:233
Aug 23 10:33:40 Outboxs-iPod pazanga[4216] <Warning>: System.ExecutionEngineException: Attempting to JIT compile method '(wrapper native-to-managed) Pazanga.Native.ZzPINVOKE/SWIGStringHelper:CreateString (intptr)' while running with --aot-only. See http://docs.xamarin.com/ios/about/limitations for more information.
at (wrapper managed-to-native) object:__icall_wrapper_mono_delegate_to_ftnptr (object)
at (wrapper managed-to-native) Pazanga.Native.ZzPINVOKE/SWIGStringHelper:SWIGRegisterStringCallback_Zz (Pazanga.Native.ZzPINVOKE/SWIGStringHelper/SWIGStringDelegate)
at Pazanga.Native.ZzPINVOKE+SWIGStringHelper..cctor () [0x00017] in /Users/max/Code/pazanga/mobile/ios/bindings/ZzPINVOKE.cs:229

这里是出现在异常中的 SWIGStringHelper 类(由 SWIG 生成):

protected class SWIGStringHelper {

  public delegate string SWIGStringDelegate(string message);   
  static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString);

  [DllImport("__Internal", EntryPoint="SWIGRegisterStringCallback_Zz")]   
  public static extern void SWIGRegisterStringCallback_Zz(SWIGStringDelegate stringDelegate);

  [MonoTouch.MonoPInvokeCallback(typeof(SWIGStringDelegate))]
  static string CreateString(string cString) {
    return cString;   
  }

  static SWIGStringHelper() {
    SWIGRegisterStringCallback_Zz(stringDelegate);   
  } 
}

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 请在 Xamarin Studio 的应用程序输出和/或设备日志中发布完整的输出。您可能可以通过在 Main 方法中添加一个 try/catch 处理程序来打印更好的消息,该处理程序将捕获此异常(并且您可以迭代 InnerExceptions 直到到达原始异常)。
  • 感谢@RolfBjarneKvinge!我添加了设备日志。我无法在 Main 中使用 try/catch 捕获异常,它没有从处理程序中打印任何内容,并且断点也不起作用。
  • Main 中的 try/catch 不起作用,因为您没有在主线程中崩溃,因此 Main 不在堆栈中。尝试在您获得的堆栈跟踪中的一种方法中添加 try/catch(例如 [...]/CaptureManager.cs:111 中的 OutputDelegate.DidOutputSampleBuffer [...])
  • @RolfBjarneKvinge 再次感谢。我发现了异常,它提到了 aot 编译器的问题。但是我在限制文档中没有找到任何可能导致问题的内容。对原生库看似无关的更改也会导致崩溃,这也很奇怪。
  • 这看起来像一个错误。你能在这里提交一个测试项目的错误吗:bugzilla.xamarin.com

标签: exception xamarin.ios


【解决方案1】:

关闭循环...原来是bug 14194的副本(使用字符串进行反向回调)。

抛出了TypeInitializationException,因为异常发生在静态构造函数中。

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多