2012-03-07 34 views
5

में संकलन समय पर जेआईटी का पता लगाना मैं काफी बड़े मोनो टच एप्लिकेशन के लिए एक बिल्ड सिस्टम पर काम कर रहा हूं जो बहुत सारे क्रॉस-प्लेटफार्म घटकों का उपयोग कर रहा है। नतीजतन, हम अक्सर ऐसी परिस्थिति में भाग लेते हैं जहां उनमें से एक क्रॉस-प्लेटफ़ॉर्म घटक ऐसा कुछ करता है जिसे संकलित नहीं किया जा सकता है। क्या कुछ वास्तव में निष्पादित किया जाना चाहिए, डिवाइस निर्माण दुर्घटनाग्रस्त हो जाएगा। उस समय, हमें यह पता लगाना होगा कि दुर्घटना कहाँ हुई, अपमानजनक विधि ढूंढें, और इसे हैक करें ताकि वह मोनो टच बिल्ड में जेआईटी की कोशिश न करे।मोनो टच

मेरा सवाल है, क्या निर्माण प्रक्रिया के दौरान इन चीजों का पता लगाने का कोई तरीका है? सबसे पहले, हमारे पास एक रेगेक्स था जिसने जेनेरिक आभासी तरीकों का पता लगाने की कोशिश की, लेकिन कुछ प्रकार के LINQ और लैम्बडास भी हैं जो जेआईटी के साथ भी प्रयास करेंगे, और मैं उन्हें पहचानने के लिए अपना खुद का पार्सर लिखने की कोशिश नहीं करता सब। मैंने monodis AssemblyName.dll का उपयोग करने का प्रयास किया है, और यह मुझे बहुत सारी गायब विधि त्रुटियों को देगा, लेकिन उनमें से अधिकतर निर्दोष लगते हैं - और यदि वे नहीं थे, तो यह मुझे नहीं बताता कि कहां कहा गया संदर्भ कहां है कि मैं देख सकता हूं कि क्या किया जाना चाहिए। उस पर, कभी-कभी यह असेंबली के अंत से पहले Abort trap: 6 या Bus error: 10 के साथ दुर्घटनाग्रस्त हो जाएगा, जो काफी अनुपयोगी है। क्या कोई बेहतर तरीका है कि मैं अपनी निर्माण प्रक्रिया में जेआईटी के प्रयासों का पता लगा सकता हूं?

उत्तर

1

मेरे सवाल है, वहाँ निर्माण प्रक्रिया के दौरान इन बातों का पता लगाने के लिए एक रास्ता है?

सं JIT (या अधिक सही अपवाद है कि यह JIT उपयोग करने के लिए कोशिश कर रहा है) का उपयोग करना एक क्रम fallback जब कुछ देशी निष्पादन के अंदर नहीं पाया जाता है।

अपने स्वयं के टूल का उपयोग करके अपवाद की ओर अग्रसर होने वाली कुछ (सबसे अधिक) स्थितियों को पहचानना असंभव नहीं है (न ही आसान) (यह Gendarme नियम भी हो सकता है)। हालांकि यह चल रहा है क्योंकि हम reported समस्याएं ठीक कर रहे हैं, इसलिए आपको प्रत्येक टूलिंग (या उन मुद्दों को ठीक करने में जोखिम खर्च करने का समय जो अब समस्या नहीं है) के साथ अपने टूलिंग को अपडेट करना होगा।

वास्तव में उपयोगी (आपके स्वयं के उपकरण के साथ या बिना) इस तरह के मुद्दों की रिपोर्ट करना है ताकि उन्हें ट्रैक किया जा सके और ज़ैमरिन के टेस्ट सूट का हिस्सा बन सकें।

मैं का उपयोग कर monodis AssemblyName.dll

monodis सभी विधानसभा संदर्भ का उपयोग करने की आवश्यकता है की कोशिश की है, अन्यथा यह काम नहीं करेगा (और दुर्घटना कर सकते हैं)।

+1

इस चलती लक्ष्य के बारे में ... हम इस धारणा के तहत थे कि सामान्य वर्चुअल विधियों जैसी कुछ चीजें समर्थित नहीं थीं क्योंकि वे नहीं हो सकती हैं। क्या वह कुछ बदल सकता है? हम ठीक काम कर रहे हैं जो काम करना चाहिए लेकिन नहीं; मुसीबत उन चीज़ों का ब्रह्मांड है जो कभी काम नहीं करना चाहिए। –

+0

व्यक्तिगत रूप से मुझे नहीं पता (हर संभावनाओं को संकलित करने के अलावा) इसे कैसे हल करें (लेकिन अन्य लोग मुद्दों को देख रहे हैं। इसलिए संदेह में आप बेहतर बग रिपोर्ट भरें - बदतर मामला इसे मौजूदा एक डुप्लिकेट के रूप में बंद कर दिया जाएगा । – poupou

0

"पता लगाने" भाग पर: जब आप समझते हैं कि कौन सी रचनाएं समस्याएं उत्पन्न करती हैं तो FxCop कस्टम नियम (ओं) बनाता है जो इसे पहचानता है और इसे सामान्य असेंबली पर चलाता है। इस तरह आपको अपना खुद का पार्सर लिखने की आवश्यकता नहीं होगी।

लिंक: FxCop - FxCop के लिए http://msdn.microsoft.com/en-us/library/bb429476%28v=VS.80%29.aspx कस्टम नियमों कैसे: http://www.codeproject.com/Articles/30666/7-Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP

+0

यदि मुझे गलत नहीं है, तो FxCop एकमात्र विंडोज़ उपकरण है, और इसलिए हमारे लिए उपलब्ध नहीं है। मोनो में कुछ समान औजारों के साथ भी, यह मुद्दा अधिक है कि कई संरचनाएं हैं जो ऐसा होने का कारण बन सकती हैं, और हम अभी तक नहीं जानते कि वे सभी क्या हैं, इसलिए हम अभी भी कुछ FxCop-like दृष्टिकोण का उपयोग कर याद कर सकते हैं। –

+0

मेरे ज्ञान के लिए हाँ। यह पता होना चाहिए कि monotouch == "आपका स्रोत प्लेटफ़ॉर्म विंडोज नहीं है"। ("यह पता लगाने के लिए कि कैसे एक कंपाइलर विशेष स्रोतों पर सफलतापूर्वक काम करेगा" की समस्या सामान्य रूप से कठिन है (http://en.wikipedia.org/wiki/Halting_problem) :), इसलिए समस्याओं को ढूंढना और फिर विशेष लोगों का पता लगाना स्रोत सुरक्षित दृष्टिकोण हो सकते हैं)। –

+0

यह रोकथाम की समस्या से आसान हो सकता है, उस समय एक विधि को कॉल करने का प्रयास जिसे समय से पहले संकलित नहीं किया जाना चाहिए (सिद्धांत में) उस व्यक्ति से अलग होना चाहिए, कम से कम इस अर्थ में कि बाद वाले के लिए कोड होगा और पूर्व के लिए कोई नहीं। यह सिर्फ तुलना करने की बात है। आदर्श रूप में, जेनरेट किए गए आईएल कोड में हम किसी प्रकार का लाल झंडा पाएंगे। –

संबंधित मुद्दे