2012-05-16 19 views
5

पृष्ठभूमिविजुअल बेसिक डंप फ़ाइल से 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 ऑब्जेक्ट्स के थ्रेडिंग मॉडल को निर्धारित कर सकता हूं?

+0

क्या सभी वीबी 6 आपका है, या आप तीसरे पक्ष के COM ऑब्जेक्ट्स को भी कॉल कर रहे हैं? – tcarvin

+0

जहां तक ​​मुझे पता है, सभी वीबी 6 COM ऑब्जेक्ट्स हमारी हैं। –

+0

तब मुझे लगता है कि धागे को देखने के लिए इतना कुछ नहीं किया जा रहा है कि वीबी 6 बहु-थ्रेडिंग का समर्थन नहीं करता है। यह निकटतम ActiveX सर्वर में आता है जो एकाधिक पृथक एसटीए (सिंगल थ्रेडेड अपार्टमेंट) का समर्थन करता है। – tcarvin

उत्तर

1

मैं केवल प्रश्न का उत्तर दे सकता हूं 1. सीपीयू का उपभोग करने वाले धागे या धागे को खोजने के लिए !runaway का उपयोग करें। सभी थ्रेड स्टैक प्राप्त करने के लिए ~*kb1000 का उपयोग करें।

+0

मैं भी थ्रेड राज्य की जानकारी देखना चाहता हूं। "पृष्ठभूमि" या "चलने" या "समाप्त" के रूप में थ्रेड स्थिति। –

2

आप कमांड का उपयोग करके धागा राज्य डंप कर सकते हैं:

~* 

यह एक राज्य के रूप में 'पृष्ठभूमि' प्रदर्शित नहीं होगा, आप केवल चल रहा है, देखना होगा जमे हुए या निलंबित कर दिया।

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