LogHelp_TerminateOnAssert क्या है?
एक दशक पहले से ऐसा ही सवाल है, लेकिन कोई अच्छा जवाब नहीं था - उम्मीद है कि तब से चीजें बदल गई हैं।
मेरे पास .NET 4.72 पर आधारित एक काफी मल्टीथ्रेडेड विनफॉर्म एप्लिकेशन है। मैं इसे प्रोसेस एक्सप्लोरर थ्रेड्स व्यू के साथ देख रहा हूं और इसमें बहुत सारे clr.dll!LogHelp_TerminateOnAssert+0x6835टाइप कॉल हैं। मैंने सिंबल्स पथ को सेटअप किया है लेकिन यह वास्तव में मेरे लिए कुछ भी स्पष्ट नहीं करता है।
मैंने एप्लिकेशन का एक डंप लिया और इसे डिबगडिआग और विनडबग के माध्यम से चलाया और कुछ भी संदिग्ध नहीं देखा जो बाहर खड़ा था।
तो मेरे सवाल:
- क्या मुझे बड़ी संख्या में LogHelp_TerminateOnAssert कॉल्स से संबंधित होना चाहिए?
- क्या एप्लिकेशन लीक मेमोरी है?
- क्या मेरे पास विजुअल स्टूडियो में ऐप चलाने पर अपवादों की एक अत्यधिक संख्या है जो फ़िल्टर नहीं करती है?
यहाँ मेरे कोड से केवल प्रविष्टि है !get_FrameReceivedऔर उस धागे के लिए स्टैक निम्नानुसार है:
सबसे अधिक चक्र के साथ धागे के लिए स्टैक इस तरह है:
जवाब
बड़े ऑफसेट हैं
clr.dll!LogHelp_TerminateOnAssert+0x6835
इसका अर्थ है कि उस विधि में वास्तविक निष्पादन 0x6835 = 26661 बाइट्स इसकी शुरुआत से दूर है। यह संभव नहीं है कि एक तरीका इतना बड़ा हो। (जैसा @blabb बताते हैं, यह 1 बाइट विधि है)।
आमतौर पर आप देखते हैं कि जब आपने प्रतीकों को सही ढंग से सेट नहीं किया है (जैसे कि लिंक किए गए मूल प्रश्न में), लेकिन आपने इसे ठीक कर लिया है।
संभावना है कि Microsoft ने केवल clr.dllनिजी लोगों के सार्वजनिक प्रतीकों को जारी किया है और नहीं। उस स्थिति में, आप केवल अंतिम ज्ञात सार्वजनिक विधि देखेंगे।
पता शुरू करें
कृपया ध्यान दें कि कॉलम का नाम "प्रारंभ पता" है। प्रक्रिया एक्सप्लोरर स्टैक पर पहली प्रविष्टि दिखाएगा।
तो यहीं से सब कुछ शुरू होता है। आप चिंतित लग रहे हैं कि यह वह जगह है जहां सब कुछ समाप्त होता है।
ध्यान दें: कुछ ज्ञात आंतरिक विधियाँ जैसे RtlUserThreadStartऔर BaseThreadInitThunkप्रारंभ पता प्रदर्शित करते समय छोड़ दिया जाएगा। अन्यथा वे शायद सभी एक जैसे दिखते।
थ्रेड वास्तव में क्या कर रहा है, सूची के शीर्ष पर है ZwRemoveIoCompletion, इसलिए, यह कुछ IO ऑपरेशन करने के लिए लगता है।
आपके सवाल
क्या मुझे बड़ी संख्या में LogHelp_TerminateOnAssert कॉल्स से संबंधित होना चाहिए?
नहीं, ये कुछ अच्छे के लिए सिर्फ शुरुआती बिंदु हैं। ऐसा GetQueuedCompletionStatus()लगता है कि कुछ IO चल रहा है और .NET आपके लिए IO कम्प्लीशन पोर्ट्स (IOCP) का उपयोग करता है।
क्या एप्लिकेशन लीक मेमोरी है?
आप कॉल स्टैक पर एक नज़र से नहीं बताते हैं। आप समय के साथ स्मृति को देखकर बताएं।
यदि आपके पास बहुत अधिक नेटवर्क है IO चल रहा है और नेटवर्क इसके साथ नहीं रख सकता है, तो .NET में कतार में अधिक से अधिक आइटम हो सकते हैं, इसलिए यह एक मेमोरी लीक की तरह लग सकता है।
क्या मेरे पास विजुअल स्टूडियो में ऐप चलाने पर अपवादों की एक अत्यधिक संख्या है जो फ़िल्टर नहीं करती है?
आप यह भी नहीं बताएंगे कि कॉल स्टैक से। sxe clrयदि आप Visual Studio पर भरोसा नहीं करते हैं, तो आप डिबगर (जैसे WinDbg) संलग्न करेंगे और अपवादों (जैसे ) की जाँच करेंगे ।
रिलीज पर बिल्ड इन सभी ऐसर्टों को एक साधारण रिटेल में संकलित किया जाता है, जिसके समान
ifdef ( debug ) { function body here } elseif { ret } endif
इसलिए इस तरह के शानदार ऑफसेट वाले प्रतीक फर्जी हैं
इसलिए आपको समझदार कॉलस्टैक के लिए उस पते के लिए वास्तविक प्रतीकों को लोड करने की आवश्यकता हो सकती है
आप clr 4.0.30319 में फ़ंक्शन का आकार देख सकते हैं। clr.dll सिर्फ 1 बाइट है
0:000> x /v /t clr!LogHelp_TerminateOnAssert
pub func 100115a0 0 <NoType> clr!LogHelp_TerminateOnAssert (<no parameter info>)
0:000> .fnent clr!LogHelp_TerminateOnAssert
Debugger function entry 01bad5e0 for:
(100115a0) clr!RtlUnwindCallback | (100115a1) clr!memset
Exact matches:
clr!RtlUnwindCallback (void)
clr!_TlgDefineProvider_annotation__Tlgg_hClrProviderProv (void)
OffStart: 000115a0
ProcSize: 0x1
Prologue: 0x0
Params: 0n0 (0x0 bytes)
Locals: 0n0 (0x0 bytes)
Registers: 0n0
0:000> u clr!LogHelp_TerminateOnAssert l1
clr!RtlUnwindCallback:
100115a0 c3 ret