WinDbg

2012-07-10 10 views
10

में प्रबंधित थ्रेड पर स्विच नहीं कर सकता है मैं एसओएस का उपयोग करते हुए WinDbg के साथ एक एएसपी.NET प्रक्रिया का एक मिनीडम्प खोज रहा हूं। अगर मैं कामयाब धागे की सूची मैं धागे की एक सामान्य लग रही सूची देखें:WinDbg

0:000> !threads 
ThreadCount: 8 
UnstartedThread: 0 
BackgroundThread: 8 
PendingThread: 0 
DeadThread: 0 
Hosted Runtime: no 
               PreEmptive            Lock 
     ID OSID  ThreadOBJ  State GC  GC Alloc Context     Domain   Count APT Exception 
XXXX 1 12bc 00000000001441f0 1808220 Disabled 0000000140b10fc8:0000000140b12f20 000000000017f6e0  0 Ukn (Threadpool Worker) 
XXXX 2 1334 0000000000152f90  b220 Enabled 0000000000000000:0000000000000000 0000000000121b90  0 Ukn (Finalizer) 
XXXX 3 138c 000000000017b100 80a220 Enabled 0000000000000000:0000000000000000 0000000000121b90  0 Ukn (Threadpool Completion Port) 
XXXX 4 81c 000000000017eb40  1220 Enabled 0000000000000000:0000000000000000 0000000000121b90  0 Ukn 
XXXX 5 5e4 00000000001bccd0 880a220 Enabled 0000000000000000:0000000000000000 0000000000121b90  0 Ukn (Threadpool Completion Port) 
XXXX 6 11e4 0000000004bee280 180b220 Disabled 0000000000000000:0000000000000000 0000000000121b90  0 Ukn (Threadpool Worker) 
XXXX 7 73c 0000000004c267e0 180b220 Disabled 0000000140b0f158:0000000140b10f20 000000000017f6e0  3 Ukn (Threadpool Worker) System.StackOverflowException (000000007fff0138) (nested exceptions) 
XXXX 8 21c 00000000001ad1c0 180b220 Enabled 0000000000000000:0000000000000000 0000000000121b90  0 Ukn (Threadpool Worker) 

हालांकि, अगर मैं सूत्र में बाँधना 7 (अपवाद के साथ एक) स्विच करने का प्रयास है, मैं इस मिल:

0:000> ~7s 
     ^Illegal thread error in '~7s' 

यह तब होता है जब किसी भी प्रबंधित थ्रेड पर स्विच करने का प्रयास किया जाता है। मुझे यकीन नहीं है कि यहां से कहाँ से आगे बढ़ना है। मुझे वास्तव में ऐसा करने की ज़रूरत है कि उस प्रबंधित थ्रेड से स्टैक ट्रेस देखें।

उत्तर

9

!threads से आउटपुट थ्रेड के लिए तीन अलग-अलग आईडी दिखाता है (WinDbg की आईडी, प्रबंधित आईडी और मूल आईडी)। जिसकी आपको आवश्यकता है वह सबसे बाएं है। जैसा कि आप डंप में सभी थ्रेड देख सकते हैं XXXX के रूप में चिह्नित किया गया है जिसका अर्थ है कि वे अब उपलब्ध नहीं हैं। यह सामान्य है, लेकिन मुझे यह अजीब लगता है कि सभी धागे इस तरह चिह्नित हैं। प्रक्रिया बंद होने के दौरान लिया गया डंप था?

अद्यतन टिप्पणी

के आधार पर आप निश्चित रूप से adplus -crash साथ एक उपयोगी डंप प्राप्त करने में सक्षम होना चाहिए, लेकिन स्पष्ट रूप से सब कुछ एक सा यहाँ में गड़बड़ के बाद भी finalizer धागा समाप्त किया जा रहा है। मैंने देखा कि धागे में से एक में स्टैकओवरफ्लो एक्सेप्शन है, जो शायद आप बाद में हो। इसे प्राप्त करने के लिए आप पहले अवसर अपवादों पर डंप बना सकते हैं और देख सकते हैं कि क्या आपको इस तरह कुछ और उपयोगी लगता है। एडप्लस के लिए FullOnFirst ध्वज है।

अतिरिक्त अद्यतन

ठीक है, कि अजीब है। कोशिश करने के लिए कुछ और चीजें।

  • दुर्घटना से पहले की प्रक्रिया के लिए संलग्न करें और बस इसे g करते हैं। इसे अपवादों पर डीबगर में तोड़ना चाहिए। यदि आप चाहते हैं, तो आप कंसोल में किसी भी अपवाद को मुद्रित करने के लिए एक ईवेंट सेट अप कर सकते हैं। sxe -c "!pe; !clrstack; gn" clr का उपयोग करें।

  • एडप्लस एक वीबीएस स्क्रिप्ट होता था लेकिन इसे थोड़ी देर पहले निष्पादन योग्य के रूप में लिखा गया था। मैंने नए संस्करण के साथ कुछ मामूली मुद्दों को देखा है, लेकिन ऐसा कुछ नहीं। आप पुरानी लिपि को आजमा सकते हैं जो अभी भी adplus_old.vbs के रूप में उपलब्ध है।

  • sysinternals से procdump आज़माएं। यह एडप्लस के रूप में उसी प्रकार के डंप विकल्पों का समर्थन करता है (साथ ही कुछ और)।

+0

हां, एक दुर्घटना के दौरान डंप लिया गया था ('ADPlus -rrash' चलाकर)। क्या इसका मतलब यह है कि मैं उन धागे को बिल्कुल नहीं देख सकता? – andypaxo

+0

आपकी स्पष्ट व्याख्या के लिए धन्यवाद! मैंने अभी-अभी कोशिश की, '-फुलोनफर्स्ट' का उपयोग करके, और एक पूर्ण डंप बनाया गया था। दुर्भाग्यवश परिणाम वही था, सभी धागे अनुपलब्ध थे। मैंने सीधे ढेर से अपवाद प्राप्त करने का भी प्रयास किया, लेकिन संदेश, स्टैक ट्रेस इत्यादि सभी शून्य थे। क्या आपको कोई जानकारी है कि इतनी छोटी जानकारी क्यों उपलब्ध है? – andypaxo

+0

@Brian, आपके sxe कमांड में 'gn' का उपयोग नहीं किया जाना चाहिए? –

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