2009-11-05 30 views
5

मेरी सी # सेवा में एक आंतरिक .net निष्पादन त्रुटि मिली जो रिकर्सन समस्या (जैसे स्टैक ओवरफ़्लो) को इंगित करती है। समस्या यह है कि सेवा बहुत बड़ी है, इसलिए मुझे यह पता चल रहा है कि रिकर्सन वास्तव में कहां होता है।अपने ऐप में रिकर्सन कैसे खोजें?

क्या बड़े पैमाने पर रेगेक्स मोोजो वाला कोई मुझे खोज स्ट्रिंग के साथ जोड़ सकता है जो मुझे चाहिए?

method1() { 
    method2() 
} 

method2() { 
    method1() 
} 

तो एक regex शायद यह पता लगाने के लिए जब तक यह एक छोटी सी बात है आपकी मदद नहीं करेंगे:

+0

कोई स्टैक ट्रेस नहीं है? –

+0

नहीं, एकमात्र कारण मुझे यह भी पता है कि ऐप क्रैश हो गया है कि इवेंट लॉग में एक प्रविष्टि है कि यह घोषणा कर रहा है कि एक आंतरिक .net फ्रेमवर्क त्रुटि आई है और कोड देता है, जिसे मैंने ओवरफ्लो मुद्दों को ढेर करने के लिए पता लगाया है। – AngryHacker

+1

क्या आपको कभी यह समस्या मिली? यदि हां, तो कैसे?मुझे लगता है कि यहां पर अधिकांश लोगों को यह समझ में नहीं आया कि प्रोग्राम इवेंट लॉग में सामान्य स्टैक ओवरफ़्लो त्रुटि को छोड़कर प्रोग्राम लॉग इन नहीं करता है। –

उत्तर

5

एक प्रत्यावर्तन की तरह कुछ स्थितियों में खोजने के लिए आसान नहीं है।

+1

हाँ। कॉल ग्राफ़ बनाएं और चक्र देखें। – ephemient

+0

और उम्मीद है कि रिकर्सन में कोई ओएस कॉलबैक शामिल नहीं है;) – Cogwheel

4

RedGate's Ants profiler या dotTrace जैसे प्रोफाइलिंग टूल का उपयोग करने के बारे में कैसे?

वे दोनों मुफ्त परीक्षण प्रदान करते हैं। बस प्रोफाइलर के साथ कोड चलाएं और यह आपको तुरंत दिखाएगा कि आपका समय/स्मृति खर्च किया जा रहा है।

मैं शर्त लगाता हूं कि आपकी समस्या रिकर्सिव फ़ंक्शन काफी हद तक चिपक जाएगी।

इसके अतिरिक्त, आप किस त्रुटि लॉगिंग फ्रेमवर्क का उपयोग कर रहे हैं? यदि उत्तर कोई नहीं है, तो एक को अपनाने पर विचार करें। This Question deals with the options. एक अच्छी प्रणाली के साथ, आपको स्टैक ट्रेस प्राप्त करने में सक्षम होना चाहिए, यदि आप भाग्यशाली हैं, तो आपको यह संकेत मिल सकता है कि अपवाद कहां हो रहा है।

+0

मेरे पास अमेरिका के आसपास सैकड़ों इंस्टॉलेशन हैं, यह एकमात्र उदाहरण है जो मुझे फिट बैठ रहा है। मैं समस्या को दोहराना नहीं कर सकता, लेकिन रिकर्सन – AngryHacker

6

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

यह halting problem का एक उदाहरण है।

+1

हां - बहुत सच है, मैं कम से कम इसके करीब आना चाहता हूं। डीबगिंग सेवाएं सामान्य अनुप्रयोगों की तुलना में अधिक कठिन होती हैं, हालांकि, वे क्यों पूछ रहे हैं। –

+0

मुझे लगता है कि आप इसे थोड़ा अधिक कर रहे हैं। ज्यादातर मामलों में मुझे लगता है कि कुछ स्थैतिक विश्लेषण कुछ चक्र ढूंढते हैं - यह मुश्किल नहीं होगा। क्या यह पूर्ण होगा? नहीं, लेकिन मुझे लगता है कि इसके लिए एक व्यावहारिक जांच करना इतना मुश्किल नहीं होगा। हालांकि रेगेक्स का उपयोग नहीं होने वाला है। – Tim

+1

मुझे लगता है कि "कुछ चक्र" "सबसे तुच्छ उदाहरण" के साथ फिट बैठते हैं, जिसे मैं पार करने की कोशिश कर रहा था। लेकिन हाँ, फिर भी आपको शुरू करने के लिए एक पूर्ण पार्सर की आवश्यकता होगी। – Cogwheel

2

the service in the debugger से जुड़ा हुआ है और इसे ठीक से डीबग करें। किसी भी उचित आकार के प्रोजेक्ट के कोड को खोजने की कोशिश करने से आपको यह इतना आसान लगेगा।

4

मैं मानता हूं कि एक regexp इसे यहां काटने वाला नहीं है।

एक डंप फ़ाइल प्राप्त करने के लिए एक और सीधा तरीका होगा और यह देखने के लिए कि अपवाद कहाँ फेंक दिया गया था।

या आप प्रोग्राम्स प्रवाह की जांच के लिए NDepend जैसे स्थिर विश्लेषण टूल को देख सकते हैं।

1

ऐसा करने का सबसे आसान तरीका यह है कि क्रैश होने वाली चीज़ का एक स्टैक ट्रेस प्राप्त करना। स्टैक ट्रेस इस तरह दिखेगा:

Blah 
Foo 
Baz 
Hello 
... 
Frob 
Frob 
Frob 
Frob 
[several hundred more Frobs] 
Frob 
Frob 
... 
Frob 
Something -- crash! 

"फ्रोब" रिकर्सिव फ़ंक्शन है। :-)

0

मैं तुम्हें उत्साहजनक नहीं कर रहा हूँ वाणिज्यिक उपकरण पर पैसा खर्च करने के लिए, लेकिन तुम सिर्फ मैनुअल जांच कर सकते हैं कि वे किस तरह से नीचे यह आम तौर पर करते हैं, क्या कारकों को ध्यान में रखा जाता है को देखने के लिए, आदि

http://www.klocwork.com/products/documentation/current/Finding_potential_stack_overflow_errors

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