【问题标题】:Monotouch JIT error on device with LINQ使用 LINQ 的设备上的 Monotouch JIT 错误
【发布时间】:2011-12-13 20:57:06
【问题描述】:

我正在尝试通过 MonoTouch 中的 Debug|iPhone 选项在 iOS 设备上运行我们的应用程序。然而,我们很快就遇到了一个问题。应用程序崩溃并出现以下异常

Attempting to JIT compile method "System.Linq.Enumerable:<FirstOfDefault`1>m_13<int> (int)" while running with aot-only.

现在我知道这个问题来自通用部分是 JIT,这在实际的 iOS 设备上是不允许的。但我不知道如何解决它。

下面是它崩溃的代码:

int nextTag = (from tag in _cellControllers.Keys
    where tag > currentTag
    select tag).FirstOrDefault();

_cellControllers 是一个

Dictionary <int, UITableViewSource>

如何防止此错误发生?

【问题讨论】:

  • 究竟是哪种通用字典?
  • 见我最初的帖子。必须编辑它,所以它会显示类型,因为在 stackoverflow 上格式化。呵呵 :)

标签: iphone linq xamarin.ios jit aot


【解决方案1】:

问题在于将值类型作为字典中的键,如 here 所述。将字典更改为没有值类型作为键可能会使这种情况正常工作(不幸的是,在某些情况下 LINQ 将自己使用字典,在这种情况下需要重写查询)。

我们正在努力在使用 LINQ 的同时解决这些问题,因此我还建议 filing a bug 使用可编译的测试用例,以便我们确保您的用例在未来能够正常工作。

【讨论】:

  • 你好。我重写了代码以使用列表而不是字典,因为我可以通过其他方式检索标签。这解决了我的问题,LINQ 代码现在可以正常工作。非常感谢!
【解决方案2】:

您可能会遇到AOTlimitation(如one),其中 AOT 编译器无法提前正确确定要编译的类型,以确保代码可以在运行时工作。

如何防止此错误发生?

解决方案取决于遇到的确切限制。 LINQ 查询会生成大量 IL 代码,因此开发人员(或 apt 编译器)并不总是清楚生成了什么。这使得解决这个问题变得更加困难。

要查明此类问题的根源,我们需要相当多的信息,因此在 http://bugzilla.xamarin.com 上填写错误报告会好很多。例如

最重要的部分是设备日志,您可以通过在终端窗口中运行以下命令获得:

/Developer/MonoTouch/usr/bin/mtouch --logdev

然后执行/崩溃您的应用程序并将终端上的输出复制粘贴到错误报告中(或将其添加为附件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多