2009-07-16 14 views
5

मैंने हाल ही में एक ऐसी समस्या के खिलाफ भाग लिया जो मेरी प्रोग्रामिंग क्षमताओं को चुनौती दे रहा था, और यह एक बहुत ही आकस्मिक अनंत लूप था। मैंने इसे सूखने के लिए कुछ कोड दोबारा लिखे थे और एक फ़ंक्शन को बदल दिया था जिसे बार-बार सही तरीके से बुलाया जा रहा था; एक प्राथमिक मुद्दा, निश्चित रूप से। अपाचे ने दुर्घटनाग्रस्त होने से समस्या को हल करने का फैसला किया, और लॉग ने "बच्चे की प्रक्रिया को जन्म देने" के अलावा कुछ भी नहीं बताया। समस्या यह थी कि मैंने वास्तव में इस मुद्दे को कभी भी डीबग करने को समाप्त नहीं किया, यह दोपहर में उग आया, और इसे आज हल करना पड़ा।PHP में अनंत लूप के खिलाफ डीबग और सुरक्षा कैसे करें?

अंत में, मेरा समाधान सरल था: तर्क को मैन्युअल रूप से लॉग करें और देखें कि क्या हुआ। समस्या तब स्पष्ट थी जब मेरे पास एक लॉग फ़ाइल थी जिसमें दो अद्वितीय रेखाएं थीं, इसके बाद दो पंक्तियां थीं जिन्हें दो सौ बार दोहराया गया था।

अनंत लूप के खिलाफ खुद को बचाने के कुछ तरीके क्या हैं? और, जब यह विफल हो जाता है (और यह होगा), इसे ट्रैक करने का सबसे तेज़ तरीका क्या है? क्या यह वास्तव में लॉग फ़ाइल है जो सबसे प्रभावी है, या कुछ और?

यदि आपका सर्वोत्तम अभ्यास था तो आपका उत्तर भाषा अज्ञेयवादी हो सकता है, लेकिन मैं PHP विशिष्ट तकनीकों और कोड के साथ रहना चाहता हूं।

+1

यह सवाल मुझे सामान्य प्रश्न ... – gahooa

+0

@gahooa "हम कैसे बग-मुक्त सॉफ्टवेयर लिख सकता हूँ" की तुलना में किसी भी अलग अलग रूप में हड़ताल नहीं है, यह सिर्फ तुम नहीं है; मुझे बग-फ्री सॉफ़्टवेयर में रूचि नहीं है क्योंकि यह कभी नहीं मिलेगा। मैं बस इस समस्या को पकड़ने के लिए सुझाव चाहता हूं, जिसने मुझे दूसरे दिन गार्ड से पकड़ा। –

उत्तर

15

आप एक डीबगर जैसे xdebug का उपयोग कर सकते हैं, और अपने कोड के माध्यम से चल सकते हैं जिसमें आपको संदेह है कि अनंत लूप है।

Xdebug - Debugger and Profiler Tool for PHP

तुम भी समय अनंत लूप दुर्घटनाग्रस्त होने से पहले जला सीमित करने के लिए

max_execution_time 

सेट कर सकते हैं।

+0

मैं पूरी तरह से xdebug के बारे में भूल गया था। धन्यवाद! –

0

सरल कोड लिखें, इसलिए बग अधिक स्पष्ट होंगे? मुझे आश्चर्य है कि क्या आपका अनंत पाश नियंत्रण संरचनाओं के कुछ हास्यास्पद यार्न-बॉल के कारण है कि कोई भी मानव संभवतः समझ नहीं सकता है। इस प्रकार आप निश्चित रूप से इसे खत्म कर दिया।

सभी अनंत लूप खराब नहीं हैं (उदा। while (!quit))।

+0

यह 100 लाइन कोडबेस में था; मुझे लटका देने के लिए बहुत कुछ नहीं है। समस्या दिनचर्या की एक इंटरविवाइन जोड़ी की एक दिनचर्या को फिर से लिख रही थी, और कॉल प्रवाह को उलट कर रही थी। 'A-> बी> c'' एक <-> b' बन गया। –

1

यूनिट परीक्षण भी एक अच्छा विचार हो सकता है। आप PHPUnit को आजमा सकते हैं।

+0

अच्छा विचार है, लेकिन मेरे कोड है, जबकि परीक्षण योग्य, इकाई परीक्षण दुर्घटनाग्रस्त हो गया होता। –

3

मुझे कभी-कभी लूप में सीमा जांच को शामिल करने का सबसे सुरक्षित तरीका मिल जाता है। लूप निर्माण का प्रकार कोई फर्क नहीं पड़ता।

$max_loop_iterations = 10000; 
$i=0; 
$test=true; 
while ($test) { 

    if ($i++ == $max_loop_iterations) { 
    echo "too many iterations..."; 
    break; 
    } 

    ... 
} 

$ के लिए एक उचित मूल्य max_loop_iterations पर आधारित हो सकता है:: इस उदाहरण में मैं एक 'जबकि' बयान चुना

  • एक निरंतर मूल्य क्रम
  • एक गणना मूल्य पर आधारित पर सेट एक इनपुट के आकार
  • या शायद एक गणना मूल्य सापेक्ष क्रम गति

आशा टी पर आधारित उसकी मदद करता है, - एन

0

क्या आप निष्पादन का पता लगा सकते हैं और कॉल ग्राफ़ को डंप कर सकते हैं? अनंत लूप स्पष्ट होंगे, और आप आसानी से उन उद्देश्यों को चुन सकते हैं जो उद्देश्य पर हैं (एक विशाल मेनलोप) एक दुर्घटना बनाम (स्थानीय अबाबाबा ...पाश या पाश है कि कभी नहीं mainloop वापस करने के लिए रिटर्न)

मैं सॉफ्टवेयर है कि बड़ी जटिल कार्यक्रमों के लिए ऐसा करता है के बारे में सुना है, लेकिन मैं आप के लिए एक स्क्रीनशॉट नहीं पा सके। किसी ने 3dsmax जैसे प्रोग्राम का पता लगाया और वास्तव में एक सुंदर कॉल ग्राफ को बाहर निकाला।

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