2010-09-07 10 views
6

मैं PHP में एक बड़े (विरासत में) कोडबेस पर काम कर रहा हूं, और त्रुटि Exception thrown without a stack frame in Unknown on line 0 प्रत्येक पृष्ठ के नीचे दिखाई दे रही है। मैं समझता हूं कि त्रुटि का अर्थ क्या है: किसी अपवाद को किसी जगह फेंक दिया जा रहा है इसे फेंक नहीं दिया जा सकता है। मैंने कुछ हद तक इसे ट्रैक करने में भी कामयाब रहा है-यह बंद होने के दौरान बंद हो रहा है।PHP में अज्ञात लाइन 0 पर अज्ञात में एक स्टैक फ्रेम के बिना फेंक दिया गया अपवाद कैसे ट्रैक करूं?

मैंने register_shutdown_function के साथ पंजीकृत सभी कार्यों में लॉगिंग डाली है, और यह उनमें से किसी भी में नहीं हो रहा है। दुर्भाग्य से, मुझे उससे अधिक जानकारी नहीं मिल रही है; मुझे पता है कि आखिरी शट डाउन फ़ंक्शन सफलतापूर्वक कहने के लिए क्या है, लेकिन मुझे नहीं पता कि उस कोड और उस बिंदु के बीच कौन सा कोड निष्पादित किया जाता है जहां त्रुटि होती है। मुझे यह भी नहीं पता कि PHP मशीनरी का कौन सा हिस्सा अंतिम शट डाउन फ़ंक्शन को कॉल कर रहा है। यह लॉगिंग फ्रेमवर्क, या सत्र ढांचे, या आधा दर्जन चीजों के साथ कुछ हो सकता है।

क्या कोई यह जानता है कि त्रुटि कहां हो रही है, यह निर्धारित करने के लिए कैसे?

+0

क्या विरासत कोड set_error_handler() या set_exception_handler() फ़ंक्शंस का उपयोग करता है? – Fosco

+0

मुझे ऐसा नहीं लगता है। ज़ेन फ्रेमवर्क में, उस फ़ंक्शन का एकमात्र संदर्भ एक डॉकस्ट्रिंग में है। –

+1

PHP 5.3.6 इस समस्या को हल करता है "थोड़ा" कहता है। विवरण के लिए http://www.php.net/archive/2011.php#id2011-03-17-1 देखें। – eisberg

उत्तर

6

यह विनाशकों और अपवाद हैंडलर में हो सकता है जिनमें स्टैक फ्रेम नहीं है। लेकिन चूंकि संदेश बहुत उपयोगी है, इसलिए आपका एकमात्र विकल्प बग (और शायद ob_end_flush()) खोजने के लिए echo का उपयोग करने का प्रयास करना है। ऐसा हो सकता है कि एक विनाशक अपवाद फेंक रहा हो, या एक ऐसा कार्य बुला रहा है जो अपवाद फेंकता है। एक बार जब आप बग्गी फ़ंक्शन को ढूंढ लेते हैं, तो कोशिश करें ... अपवाद फेंकने के हिस्से को पकड़ें।

ध्यान दें कि यदि आपका ढांचा अपनी त्रुटि प्रबंधन का उपयोग करता है, तो आपको PHP कॉन्फ़िगरेशन में चेतावनियां और नोटिस बंद करना होगा। विशेष रूप से यदि आपके पास ErrorException जैसा कुछ है, क्योंकि यह अपवादों में चेतावनियां बदलता है।

5

यह संदेश दिखाई देता में एक अपवाद अपने अपवाद संचालक या अपने त्रुटि हैंडलर (और शायद यह भी बंद कार्यों में)

आप शोध करे तरीकों देखें कि क्या यहाँ में कुछ भी नहीं अजीब appens के लिए दिखना चाहिए के भीतर फेंक दिया जब।

0

यूबींटू 11.04 सर्वर पर तैनात वेब अनुप्रयोग में एक ही त्रुटि का सामना करने के बाद बस अपना प्रश्न मिला, PHP 5.3.5 चला रहा है। मैं @Eisberg से सहमत हूं कि यह मुद्दा PHP 5.3-संस्करण के साथ विशेष रूप से एक मुद्दा प्रतीत होता है, क्योंकि त्रुटि पिछले वातावरण के साथ मौजूद नहीं है, अन्य वातावरण पर अन्य PHP संस्करण, जहां मेरा एप्लिकेशन तैनात किया गया है।

@jmz उल्लेख के रूप में, मैंने एक त्रुटि हैंडलर का भी उपयोग किया है जो मेरे स्टेजिंग सर्वर पर आसान डीबगिंग के लिए अपवादों में त्रुटियों को बदल देता है।

पता लगाने के लिए क्या इस रहस्यमय व्यवहार के कारण होता है, मैं Xdebug & मेरी आईडीई (ग्रहण) का उपयोग कर आवेदन डिबग और पता चला कि मेरी पुस्तकालयों में से एक का उपयोग करने के & वैश्विक $_SESSION चर, संशोधित करने की कोशिश की जब कोई सत्र-डेटा स्थापित किए गए थे । Iff स्टेटमेंट isset($_SESSION) में मेरे कोड को लपेटने से समस्या गायब हो गई।

अपवाद क्यों ब्राउज़र के लिए पूरी तरह से बुलबुला नहीं हुआ, क्योंकि गैर-सेट चरों तक पहुंचने का प्रयास करते समय अन्य त्रुटियों ने किया है, मेरे लिए एक पूर्ण रहस्य है, खासकर जब मैं त्रुटि सेटिंग्स सेट से नीचे हूं, लेकिन शायद error_reporting() में सेटिंग को बदलना एक फर्क पड़ता।

त्रुटि निवारण सेटिंग्स, संदर्भ के लिए:

error_reporting(E_ALL | E_STRICT); 
ini_set("display_errors", 1); 
ini_set("html_errors", 1); 
+0

मेरे पास एक ही समस्या है और इसे एक ($ foo) स्थिति में तोड़ दिया जिसने त्रुटि उत्पन्न की। ऐसा इसलिए होता है क्योंकि $ foo सेट नहीं किया गया है। यदि (! खाली ($ foo)) का उपयोग समस्या का समाधान करेगा। कुछ कारणों से एक ही कोड को एक ही सर्वर पर एक विरासत ऐप में अपवाद नहीं फेंक दिया जाता है। नया ऐप - त्रुटि के साथ - सिम्फनी घटक का उपयोग होता है। मैं PHP5.3 (हाँ, अभी भी इसका उपयोग करना होगा) मुद्दे पर एक नज़र डालेगा। लेकिन ऐसा लगता है कि सिम्फनी भी कुछ विशेष त्रुटि_ रिपोर्टिंग कर रहा है? – webDEVILopers

0

मैं भी वही त्रुटि संदेश मिलता है। MySQL डेटाबेस कोटा को पुरस्कार स्थान द्वारा 50 एमबी के रूप में सेट किया गया था।फ़ाइलों को अनुकूलित करने के लिए PHPmyAdmin का उपयोग 34 एमबी का आकार दिखाया गया लेकिन सीपीनल पर आकार 57 एमबी के रूप में दिखाया गया था। हर बार जब मैं अपनी वेबसाइट पर जाता हूं और यह त्रुटि संदेश हुआ, तो मुझे केवल पुरस्कार स्थान में लॉगिन करना, डेटाबेस, प्रबंधन और फ़ाइल अनुमतियों को रीसेट करना था। फिर त्रुटि संदेश दूर चला जाता है, और मेरी वेबसाइट का बैक अप है।

0

मुझे यह समस्या PHPUnit में मिल रही थी। मैंने function tearDown में कोड नीचे जोड़ा है और मुझे वास्तविक त्रुटि प्राप्त करने में मदद करता है। आपको एक प्रयास-पकड़ ब्लॉक के अंदर विनाशक को लपेटना चाहिए, क्योंकि जैसे ही अपवादकर्ता के बाहर अपवाद हो रहा है, स्टैक-फ्रेम केवल खो जाता है। हो सकता है कि यह किसी और की मदद कर सके। Source

function __destruct() 
{ 
    try 
    { 
    /* 
    your code 
    */ 
    } 
    catch(Exception $e) 
    { 
    echo $e->__toString(); 
    } 
} 
संबंधित मुद्दे