5

我正在为使用大量跨平台组件的相当大的 MonoTouch 应用程序开发构建系统。结果,我们经常遇到这样一种情况,其中一个跨平台组件执行了一些无法编译的操作。如果实际执行了某些操作,则设备构建将崩溃。那时,我们必须追踪崩溃发生的位置,找到有问题的方法,然后破解它,这样它就不会在 MonoTouch 构建中尝试 JIT。

我的问题是,有没有办法在构建过程中检测到这些东西?起初,我们有一个正则表达式,它试图检测通用虚拟方法,但某些类型的 LINQ 和 lambda 也存在问题,它们也会尝试 JIT,我宁愿不尝试编写自己的解析器来检测它们全部。我试过使用monodis AssemblyName.dll,它会给我很多丢失的方法错误,但它们中的大多数似乎是无害的——即使它们不是,它也没有告诉我对所述方法的引用在哪里所以我可以看到需要做什么。最重要的是,有时它会在组装结束时Abort trap: 6Bus error: 10之前崩溃,这是非常无益的。有没有更好的方法可以检测构建过程中的 JIT 尝试?

4

2 回答 2

1

我的问题是,有没有办法在构建过程中检测到这些东西?

否。当在本机可执行文件中找不到某些内容时,使用 JIT(或更准确地说是它尝试使用 JIT 的例外)是运行时回退。

使用您自己的工具(甚至可能是宪兵规则)检测(一些/大多数)导致异常的条件并非不可能(也不容易)。然而,这是一个不断变化的目标,因为我们正在修复报告问题,因此您必须使用每个新版本更新您的工具(或者冒着花费时间修复不再是问题的风险)。

真正有用的(有或没有您自己的工具)是报告此类问题,以便可以跟踪它们并成为 Xamarin 测试套件的一部分。

我试过使用 monodis AssemblyName.dll

monodis需要访问所有程序集引用,否则它将无法工作(并且可能会崩溃)。

于 2012-03-07T20:55:52.883 回答
0

在“检测”部分:当您找出导致问题的构造时,创建 FxCop 自定义规则来检测它并在正常程序集上运行它。这样您就不需要编写自己的解析器。

链接:FxCop - http://msdn.microsoft.com/en-us/library/bb429476%28v=VS.80%29.aspx FxCop 操作方法的自定义规则:http: //www.codeproject.com/Articles /30666/7-Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP

于 2012-03-07T18:56:32.280 回答