पृष्ठभूमिविजुअल बेसिक डंप फ़ाइल से COM ऑब्जेक्ट का निरीक्षण कैसे करें?
हम सी # है कि एक सांत्वना आवेदन के माध्यम से एक हाथ की दुकान स्कैनर के इंटरफेस में लिखा एक .NET WinForms आवेदन किया है। कंसोल एप्लिकेशन अच्छी ओएल 'वीबी 6 में लिखा गया है - वहां कोई प्रबंधित कोड नहीं है। वीबी 6 आवेदन में कई COM ऑब्जेक्ट होते हैं।
.NET WinForms एप्लिकेशन कंसोल अनुप्रयोग को सही पैरामीटर के साथ आविष्कार करके स्कैनर में डेटा को रीफ्रेश करता है। जब कंसोल एप्लिकेशन शुरू होता है, तो यह उपयोगकर्ता को हैंडहेल्ड डिवाइस को अपने पालना में रखने के लिए याद दिलाने वाला एक मॉडल फॉर्म पॉप अप करता है।
समस्या
एक ग्राहक एक विचित्र स्थिति है जिसमें कॉल सांत्वना आवेदन से पहले यह याद दिलाते प्रपत्र प्रदर्शित करता है लटका दिखाई देता है शुरू करने के लिए है। यदि उपयोगकर्ता कोई कुंजी दबाता है - यहां तक कि कुछ शिफ्ट या Alt जैसे निर्दोष - एप्लिकेशन unfreezes, और अनुस्मारक प्रपत्र प्रकट होता है। जबकि यह लटका हुआ है, कंसोल अनुप्रयोग का सीपीयू उपयोग बहुत अधिक है।
हमने ProcDump का उपयोग कर कमांड लाइन एप्लिकेशन से मेमोरी डंप प्राप्त किया है। मेरे पास कुछ डबगिंग प्रबंधित डंप फाइलें हैं, लेकिन यह वीबी 6 डंप मेरे लिए अजीब है।
हमने एक पंक्ति में कई पूर्ण मेमोरी डंप पर कब्जा कर लिया। उनमें से कुछ में, COM गोंद ढेर लगता है।
msvbm60!BASIC_DISPINTERFACE_GetTICount
msvbm60!_vbaStrToAnsi
msvbm60!IIDIVbaHost
msvbm60!rtcDoEvents
msvbm60!IIDIVbaHost
msvbm60!BASICCLASS_QueryInterface
[our code which I think is trying to create and invoke a COM object]
यह मदद नहीं करता है कि केवल प्रतीकों मैं हमारे कोड से कर रहे हैं: उदाहरण के लिए, कई डंप फ़ाइलों को इस तरह एक कॉल स्टैक दिखा। माइक्रोसॉफ्ट प्रतीक सर्वर में msvbm60.dll के लिए पीडीबी फ़ाइल नहीं है (या कम से कम उनके संस्करण से नहीं जो 6.0.98.2 है)।
प्रश्न
मैं कुछ कॉम सूत्रण मुद्दा यह है कि केवल अपने सिस्टम पर हो रहा है हो सकता है पर शक कर रहा हूँ।
1) मैं डंप फ़ाइल में प्रत्येक थ्रेड की थ्रेड स्थिति कैसे निर्धारित कर सकता हूं? यदि यह एक प्रबंधित डंप फ़ाइल थी, तो मैं थ्रेड स्टेटस को जानने के लिए !threads
और फिर !threadstate
पर देखता हूं। कोई प्रबंधित कोड नहीं है, इसलिए मैं sos.dll का उपयोग नहीं कर सकता। मुझे ~
और !teb
का उपयोग करके कोई संकेत नहीं मिला।
2) क्या यह देखने का कोई तरीका है कि डंप फ़ाइल में COM ऑब्जेक्ट्स क्या बनाए गए हैं? फिर, एक प्रबंधित डंप में, मैं प्रबंधित वस्तुओं की सूची प्राप्त करने के लिए !dumpheap
कर सकता हूं। क्या COM वस्तुओं के लिए मुझे कुछ मिल सकता है?
3) क्या मैं डंप फ़ाइल में COM ऑब्जेक्ट्स के थ्रेडिंग मॉडल को निर्धारित कर सकता हूं?
क्या सभी वीबी 6 आपका है, या आप तीसरे पक्ष के COM ऑब्जेक्ट्स को भी कॉल कर रहे हैं? – tcarvin
जहां तक मुझे पता है, सभी वीबी 6 COM ऑब्जेक्ट्स हमारी हैं। –
तब मुझे लगता है कि धागे को देखने के लिए इतना कुछ नहीं किया जा रहा है कि वीबी 6 बहु-थ्रेडिंग का समर्थन नहीं करता है। यह निकटतम ActiveX सर्वर में आता है जो एकाधिक पृथक एसटीए (सिंगल थ्रेडेड अपार्टमेंट) का समर्थन करता है। – tcarvin