2012-03-07 115 views
5

我正在使用大量跨平臺組件的相當大的MonoTouch應用程序的構建系統。因此,我們經常遇到這樣一種情況:其中一種跨平臺組件做了一些無法編譯的情況。如果某件事實際上得到執行,設備構建將會崩潰。那時,我們必須追蹤崩潰發生的位置,找到違規方法,並將其破解,以便它不會嘗試在MonoTouch構建中進行JIT。在MonoTouch中編譯時檢測JIT

我的問題是,有沒有辦法在構建過程中檢測這些東西?起初,我們有一個試圖檢測通用虛擬方法的正則表達式,但是某些類型的LINQ和lambda也會嘗試JIT,我也不想嘗試編寫自己的解析器來檢測它們所有。我試過使用monodis AssemblyName.dll,它會給我很多缺失的方法錯誤,但其中大多數似乎是無害的 - 即使它們不是,它也不會告訴我對所述方法的引用在哪裏我可以看到需要做什麼。最重要的是,在程序集結束之前它有時會崩潰Abort trap: 6Bus error: 10,這非常無益。有沒有更好的方法可以檢測到在構建過程中嘗試JIT?

回答

1

我的問題是,有沒有辦法在構建過程中檢測到這些東西呢?

不。使用JIT(或者更準確地說,它試圖使用JIT的異常)是在本機可執行文件中找不到內容時的運行時後備。

使用您自己的工具(它甚至可能是Gendarme規則)檢測導致異常的(某些/大部分)情況並非不可能(也不容易)。但是,這是一個移動目標,因爲我們正在修復reported問題,因此您必須更新每個新版本的工具(或花費時間修復不再有問題的事情)。

什麼是真正有用的(帶或不帶自己的工具)是報告這些問題,以便他們可以跟蹤併成爲Xamarin測試套件的一部分。

我使用monodis AssemblyName.dll

monodis要求訪問所有程序集引用試過,否則將無法正常工作(並可能會崩潰)。

+1

關於這個移動目標......我們的印象是,像通用虛擬方法這樣的東西不被支持,因爲它們不可以。那是可以改變的嗎?我們沒關係報告應該工作,但不要;麻煩的是那些不應該工作的宇宙。 – 2012-03-07 21:17:04

+0

我個人並不知道(除了編譯每一種可能性)如何解決它(但其他人正在研究這些問題,所以如果有人懷疑你最好填寫一個錯誤報告 - 更糟糕的情況是,它會作爲現有的一個副本關閉。 – poupou 2012-03-07 22:21:20

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

+0

如果我沒有弄錯,FxCop是一個僅限Windows的工具,因此我們無法使用。即使Mono中有一些類似的工具,問題更多的是有很多構造可能導致這種情況發生,我們還不知道它們是什麼,所以我們仍然可能會錯過一些使用類似FxCop的方法。 – 2012-03-07 19:06:42

+0

是的,據我所知。應該已經知道那個monotouch ==「你的源代碼平臺不是Windows」。 (還有一個問題,「如何檢測編譯器是否可以在特定源代碼上成功運行」通常很難(http://en.wikipedia.org/wiki/Halting_problem):),因此需要查找問題然後檢測特定源代碼來源可能是更安全的方法)。 – 2012-03-07 19:19:08

+0

這可能比暫停問題更容易,因爲嘗試調用未提前編譯的方法應該(在理論上)與可以區分的方法是不同的,至少在後一種情況下會存在代碼而前者則沒有。這只是做這樣一個比較的問題。理想情況下,我們可以在生成的IL代碼中找到某種紅旗。 – 2012-03-07 19:27:19