2012-08-23 5 views
5

मैं समझने की कोशिश कर रहा हूं कि कोड प्रोफाइलर (इस मामले में Drone Profiler) एक .NET ऐप को सीधे इसे सीधे चलाने से अलग करता है। कारण मुझे यह जानने की आवश्यकता है क्योंकि मेरे पास मेरे देव कंप्यूटर के .NET इंस्टॉल के साथ एक बहुत ही अजीब समस्या/भ्रष्टाचार है जो खुद को प्रोफाइलर के बाहर प्रकट करता है लेकिन बहुत अजीब तरह से अंदर नहीं है और अगर मैं समझ सकता हूं कि मैं शायद अपने कंप्यूटर के मुद्दे को क्यों ठीक कर सकता हूं।एक कोड प्रोफाइलर के अंदर चल रहे सी # एप कैसे एक कोड कोड प्रोफाइलर चलाने से अलग है?

समस्या केवल सिस्टम.Net.NetworkInformation के तरीकों पर कॉल को प्रभावित करती है (और केवल .NET 3.5 से 2.0 के भीतर, अगर मैं 4 के खिलाफ कुछ बनाता हूं तो ठीक है)। मैंने एक छोटा परीक्षण ऐप बनाया जो केवल एक चीज करता है, यह System.Net.NetworkInformation.IsNetworkAvailable() को कॉल करता है। प्रोफाइलर के बाहर मुझे System.dll में "घातक निष्पादन इंजन त्रुटि" मिली, और यह वह सारी जानकारी है जो यह देता है। जो मैं समझता हूं कि त्रुटि आमतौर पर देशी विधि कॉल से होती है, जो संभावित रूप से तब होती है जब System.dll कुछ मूल DLL को IsNetworkAvailable() तर्क निष्पादित करने देता है।

  • मैं अंदर और Process Monitor का उपयोग कर प्रोफाइलर अंतर के बाहर यह पता लगाने की कोशिश की, दोनों स्थितियों से घटनाओं की रिकॉर्डिंग और उनकी तुलना। Iphlpapi.dll और winnsi.dll के बाद बस एक पल तक दोनों लॉग समान थे और dnsapi.dll नामक प्रोफाइलर-रन कोड से पहले और गैर-प्रोफाइलर कोड क्रैश रिपोर्टिंग से संबंधित सामग्री लोड करना शुरू कर दिया। उस पल में जब यह गलत लगता था तो प्रोफाइलर रन कोड ने 4-6 नए धागे बनाए और गैर-प्रोफाइलर (क्रैशिंग) कोड केवल 1 या 2 बनाया। मुझे नहीं पता कि इसका मतलब क्या है, अगर कुछ भी हो।

यकीनन अनावश्यक पृष्ठभूमि

मेरे विंडोज 7 नेट स्थापना (2.0 करने के लिए 3.5) शामिल ठीक काम कर रहा था, जब तक मेरी हार्ड ड्राइव कुछ भ्रष्टाचार का सामना करना पड़ा और checkdisk बुरा समूहों की खोज शुरू कर दिया। मैंने ड्राइव को एक नए से इमेज किया और सबकुछ ठीक से काम करता है, इस मुद्दे को .NET के साथ छोड़कर।

मुझे इस समस्या को विंडोज़ को पुनर्स्थापित करने या छवि बैकअप पर वापस लाने की आवश्यकता है।

  • मैं फ़ाइलों diffed किये जाने वाले है/निर्देशिका जो सबसे अधिक प्रासंगिक (Windows और प्रोग्राम फ़ाइलें के तहत नेट सामान) पूर्व और पोस्ट डिस्क लग रहा था:

    यहाँ से कुछ चीजों के मैं देखा है कर रहे हैं परेशानी और कोई बदलाव नहीं देखा जहां मैंने किसी की उम्मीद नहीं की थी (कोई स्पष्ट फ़ाइल भ्रष्टाचार नहीं)।

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

मुझे लगता है कि मुझे अपनी .NET स्थापना की मरम्मत करने की आवश्यकता है, लेकिन विंडोज 7 में .NET 3.5 - 2.0 शामिल है, इसलिए आप इसे फिर से करने के लिए .NET इंस्टॉलर को फिर से चला नहीं सकते हैं।मेरे पास Windows डिस्क को फिर से इंस्टॉल करने का प्रयास करने के लिए Windows डिस्क तक पहुंच नहीं है (कंप्यूटर में रिकवरी विभाजन है लेकिन यह अनुपयोगी है); ड्राइव भी एक पूर्ण डिस्क एन्क्रिप्शन समाधान का उपयोग करता है और पुनः स्थापित करना मुश्किल होगा।

मैं बिल्कुल यहां स्क्रैच से शुरू नहीं करना चाहता हूं और एक ताजा विंडोज स्थापित करना चाहता हूं, दर्जनों सॉफ़्टवेयर पैकेजों को पुनर्स्थापित करना, विकास-संबंधित अनुकूलन/आदि के दर्जनों को आजमाएं और याद रखें।

यह सब देखते हुए ... क्या किसी के पास कोई सहायक सलाह है? मुझे .NET 3.5 - 2.0 की आवश्यकता है क्योंकि मैं एक डेवलपर हूं और इसके खिलाफ निर्माण और परीक्षण करने की आवश्यकता है।

धन्यवाद!

Quinxy

उत्तर

1

संक्षिप्त उत्तर यह है कि मेरी System.ni.dll फ़ाइल क्षतिग्रस्त हो गई, मैंने इसे बदल दिया और सब ठीक है।

विस्तृत उत्तर समाधान के प्रति अपनी सोच के माध्यम से किसी और को मदद कर सकता है ...

मेरे नेट से संबंधित समस्या इस तरह से कि क्षुधा एक प्रोफाइलर के माध्यम से छोड़कर नहीं चला जाएगा में क्षतिग्रस्त किया जा रहा। मैंने SlimTune open source profiler के लिए स्रोत डाउनलोड किया, इसे स्थानीय रूप से बनाया, और प्रक्रिया से पहले ब्रेक पॉइंट सेट करें। स्टार्ट()। इसके बाद मैंने मैन्युअल रूप से प्रोफाइलर बनाम मैन्युअल रूप से ऐप शुरू करने में शामिल सभी पैरामीटर की तुलना की।

  • cor_enable_profiling = 1
  • cor_profiler = {38A7EA35-B221-425a-AD07-D058C581611D}
: केवल सार्थक फर्क मैंने पाया वातावरण चर को जोड़ा गया नेट प्रोफाइल पैरामीटर्स को जोड़ने था

मैंने फिर इन्हें अपने उपयोगकर्ता के पर्यावरण और वॉयला में स्थापित करने का प्रयास किया! अब मैन्युअल रूप से चलाने वाला कोई भी ऐप काम करेगा। (मैंने वास्तव में कुछ घंटों पहले एक ही काम करने की कोशिश की थी, लेकिन मैंने एक GUID का उपयोग किया जो कि एक उदाहरण में शामिल था और जो वास्तविक प्रोफाइलर को इंगित नहीं करता था और स्पष्ट रूप से .NET जानता था कि मैंने इसे एक फर्जी GUID दिया था और नहीं किया था प्रोफाइलिंग मोड में चलाएं।)

अब मैं वापस गया और सीएलआर द्वारा पीई फ़ाइल को कैसे निष्पादित किया गया है, यह जानने के लिए कि यह क्यों लगाया गया कि मेरा ऐप प्रोफाइलिंग सक्षम के साथ चलाया गया था।मैंने बहुत कुछ सीखा लेकिन कुछ भी जो लागू नहीं हुआ।

मुझे हालांकि याद आया कि मुझे chkdsk लॉग को दोबारा जांचना चाहिए, जिसे मैंने ड्राइव विफलता से क्षतिग्रस्त फ़ाइलों को सूचीबद्ध किया था। विफलता के बाद मैंने सभी सूचीबद्ध फाइल आईडी को फ़ाइल पथ/नामों में बदल दिया था और मैंने बैकअप से प्राप्त होने वाली सभी 100+ फ़ाइलों को प्रतिस्थापित कर दिया था, लेकिन जब मैं वापस गया तो मुझे यकीन था कि मैंने देखा कि मुझे एक नोट मिला है कि जब मैंने 4 या 5 .NET संबंधित फाइलें सफलतापूर्वक एक ऐसी फाइल थीं जिसे मैं प्रतिस्थापित करने में सक्षम नहीं था क्योंकि यह "उपयोग में" था। वह फाइल? System.ni.dll !!! अब मैं बैकअप से इस फ़ाइल को प्रतिस्थापित करने में सक्षम था और वॉयला मेरा .NET इंस्टॉल सामान्य पर वापस आ गया है, ऐप्स काम करते हैं या नहीं।

निराशाजनक बात यह है कि जब यह घटना पहली बार हुई तो मुझे पूरी तरह से क्षतिग्रस्त फ़ाइल से संबंधित समस्या की उम्मीद थी, और विशेष रूप से System.dll नामक एक फ़ाइल में जो असफल विधियों को रखता था। और इसलिए मैंने System.dll नामक सभी फ़ाइलों को अलग किया और फिर से भर दिया। लेकिन मुझे उस समय एहसास नहीं हुआ कि System.ni.dll System.dll (या somesuch) का देशी संकलित अभिव्यक्ति था। और क्योंकि मैंने .NET से संबंधित निर्देशिकाओं को अलग किया है और इसे फिर से जोड़ा है और यह नहीं देखा है (मुझे नहीं पता कि मुझे यह कैसे याद आया) मैं उस दृष्टिकोण को छोड़ दूंगा।

वैसे भी ... लंबी कहानी छोटी, यह एक क्षतिग्रस्त System.ni.dll था जिसने मेरी समस्याओं का कारण बना दिया, इसके अंदर एक या एक से अधिक क्लस्टरों ने उनकी सामग्री 0x0 के साथ बदल दी थी और यह अजीब समस्या के रूप में प्रकट होने के लिए ऐसा हुआ। देखे गए।

0

यह एक समय मुद्दा की तरह लगता है, जो प्रोफाइलर "तय" यह सिर्फ थोड़ी धीमी करके।

कई प्रोफाइलर उपकरण (more info here) का उपयोग करते हैं, जो एप्लिकेशन को थोड़ा धीमा कर देता है। जाहिर है, यह एक धागा को इतना धीमा कर देता है कि एक और धागा थोड़ा और काम कर सकता है, जो उस दुर्घटना को रोकता है। इन तरह की त्रुटियां अक्सर डेवलपर्स मशीन पर सीधे प्रकट नहीं होती हैं, लेकिन जैसे ही वे प्रोसेसर पर अधिक कोर या हाइपर-थ्रेडिंग के साथ चलती हैं। कभी-कभी वे केवल रिलीज बिल्ड (या डीबग बिल्ड में इसके विपरीत) में होते हैं। समय के मुद्दों को ट्रैक करना मुश्किल हो सकता है क्योंकि एक ही कोड विभिन्न स्थितियों (प्रोफाइलर या डीबगर में) में अलग-अलग परिणाम दे सकता है।

अपने विवरण से मैं यह कैसे तय किया जा सकता है पर एक जंगली अनुमान करने का प्रयास करेंगे:

कोशिश स्रोत जहां नई धागे शुरू कर रहे हैं खोजने के लिए। फिर वे पैदा होने के बाद मुख्य थ्रेड को रोकने के लिए System.Threading.Thread.Sleep(500); लाइन जोड़ें और नए धागे को शुरू करने के लिए कुछ समय दें।

स्रोत कोड और क्रैश के कुछ ढेर निशान के बिना, यह अनुमान का थोड़ा सा हिस्सा है।

+0

मैं वास्तव में विचार और टिप्पणी की सराहना करता हूं। यह एक बहुत ही रोचक परिकल्पना है। मेरा मानना ​​है कि आप जो कहते हैं उसका हिस्सा इस मामले में लागू नहीं हो सकता है, यह देखते हुए कि मेरा डेमो प्रोग्राम जो इस मुद्दे को प्रकट करता है वह सचमुच एक पंक्ति (डिफ़ॉल्ट विंडोज फॉर्म प्रोजेक्ट फॉर्म के साथ) पिंग() फ़ंक्शन को कॉल करता है, और सबकुछ ठीक से पहले काम करता है डिस्क मुद्दा मैं था। लेकिन जिस भाग का आप वाद्ययंत्र के बारे में उल्लेख करते हैं वह बहुत महत्वपूर्ण हो सकता है, विशेष रूप से क्योंकि जब मैंने काम करने वाले और गैर-कार्यरत राज्यों के बीच रजिस्ट्री की तुलना की तो मैंने प्रदर्शन मॉनीटर/आदि से संबंधित कुछ बदलावों को देखा। –

+0

तो मुझे लगता है कि मुझे प्रदर्शन काउंटर से संबंधित रजिस्ट्री परिवर्तनों पर एक और नज़र डालना चाहिए और देखें कि क्या उन्हें बदलना कुछ भी है। –

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