2011-10-05 21 views
23

मैं है एक सर्वर है कि मैं निम्नलिखित उत्पादन के साथ मरने के लिए पैदा कर सकता है:,डिबगिंग "अधिकतम कॉल स्टैक आकार से अधिक हो"

events.js:38 
EventEmitter.prototype.emit = function(type) { 
           ^
RangeError: Maximum call stack size exceeded 

हालांकि एक ढेर डंप या निशान के बिना, मैं इस पर कि क्या खोजने का कोई तरीका नहीं है अनंत रिकर्सन या सिर्फ थोड़ी-बड़ी श्रृंखला है, समस्या को हल करने के लिए अकेले रहने दें।

--trace विकल्प के साथ नोड चलाना मेरे परीक्षणों को न केवल धीमी गति से चलने के लिए प्रेरित करता है (जैसा कि कोई उम्मीद करेगा), लेकिन समस्या को पुन: उत्पन्न नहीं करेगा।

किसी के पास इसके निचले हिस्से तक पहुंचने के लिए कोई समाधान या सुझाव हैं?

+0

इस विशेष मुद्दे से पहले और डिफ की तुलना द्वारा हल किया गया था के बाद ऐसा हो, चिपके हुए जाना जाता था प्रत्येक नए/बदले गए 'emit' कॉल द्वारा अतिरिक्त लॉगिंग और' नाली 'घटना पर संयुक्त-पुनरावर्तन की ओर अग्रसर स्कोपिंग त्रुटि की खोज - इसलिए गति संवेदनशीलता। मैं अभी भी सर्वोत्तम सामान्य रणनीति के स्वीकृत उत्तर का पुरस्कार दूंगा जो इसे हल कर लेगा। – OrangeDog

उत्तर

9

ऐसा लगता है इस सवाल का जवाब वर्तमान में है: तंग बैठते हैं और Node.js एक नए वी 8 संस्करण के लिए अद्यतन करने के लिए, या the patch from this Chromium project bug report साथ अपने स्वयं के निर्माण के लिए प्रतीक्षा करें।

This archived thread from the v8-dev mailing list, एक चर्चा है, जिसमें

  • डेव स्मिथ यह बहुत ही इस मुद्दे को लाता है और एक पैच
  • यांग क्रोमियम परियोजना के गुओ यह चर्चा करता है प्रस्ताव से पता चलता मुद्दे के खिलाफ एक क्रोमियम बग फ़ाइलें, और एक पर लागू होता है अलग फिक्स
  • डेव नोट करता है कि नोड (उस समय 0.8) V8 3.11 का उपयोग कर रहा है और पैच का बैकपोर्ट करने के बारे में पूछता है। यांग ने जवाब दिया कि पैच शायद वी 8 3.15 में उतरेगा और उसे वापस नहीं भेजा जाएगा।

ध्यान दें कि Node.js v0.8 V8 3.11 का उपयोग किया गया है; Node.js 0.10 वर्तमान में V8 3.14 का उपयोग कर रहा है। तो इस मुद्दे के लिए क्रोमियम द्वारा स्वीकृत पैच अभी भी "भविष्य में" है जहां तक ​​नोड का संबंध है।

(इस उत्तर, @Coderoshi करने के लिए धन्यवाद देने के बाद से यह उसके जवाब है कि मैं यह सब सीखा से धागा का पालन करते हुए है।)

+0

इस बारे में कोई खबर? मुझे एक ही समस्या है कि मुझे "रेंज एरर: अधिकतम कॉल स्टैक आकार पार हो गया" को डीबग करना होगा। समस्या यह है कि यह कुछ दिनों से अपरिवर्तित वेबप्लिकेशन में होता है और मुझे नहीं पता कि कैसे खोजना है, इसलिए एक स्टैकट्रैक एक बड़ी मदद होगी। –

+0

नोड 0.11 इस स्थिति में स्टैक निशान दिखाने के लिए V8 का एक नया पर्याप्त संस्करण उपयोग कर रहा है। यदि आप अपने वेबपैड को नोड 0.11 के तहत चलाने में सक्षम हैं, तो इसे आज़माएं। – metamatt

+1

बस v.0.11.6 की कोशिश की, हालांकि मैं वेबपैप चलाने में सक्षम था, स्टैक निशान काम नहीं कर पाए। किसी भी तरह से मैंने बग तय किया, लेकिन मैंने सोचा कि यह टिप्पणी स्टैक ट्रेस के लिए खोज रहे समान बग वाले लोगों के लिए उपयोगी हो सकती है। शायद यह किसी के समय बचाता है, अस्थिर संस्करण संकलित नहीं करने के लिए ;-)। –

4

"थोड़ा-बहुत बड़ी श्रृंखला" होने का मौका असंभव लगता है।

शायद यह एक ऐसा फ़ंक्शन है जो स्वयं को ट्रिगर करता है।

तो यदि कोड धीमा करना अनंत रिकर्सन को रोकने के लिए बना रहा है। मेरा अनुमान है कि आपके पास कतार है और धीमे मोड के साथ यह तेजी से भरा नहीं है।

यदि यह मदद नहीं करता है तो मुझे लगता है कि मुझे और जानकारी चाहिए। हालांकि किसी के पास इस के लिए कैच-सब कुछ है।

2

यह पैच आपको समाधान खोजने में मदद कर सकता है। यह स्टैक ट्रेस काफी फैलता है:

https://github.com/dizzyd/node/commit/40434019540ffc17e984ff0653500a3c5db87deb

+0

यह सही दृष्टिकोण की तरह प्रतीत होता है। मैं इस पैच का वर्णन नहीं करता क्योंकि "स्टैक ट्रेस को काफी हद तक फैलाता है"; मैं इसका वर्णन करूंगा "स्टैक ओवरफ़्लो अपवादों के लिए एक स्टैक ट्रेस बनाने के लिए बहुत कठिन प्रयास करता है"।बीटीडब्ल्यू, इस पैच द्वारा संशोधित कोड में TODO (1240995) का संदर्भ है; किसी को भी पता है कि किस बग डेटाबेस का जिक्र है? – metamatt

+0

मुझे कोई भी बग 1240995 नहीं मिला लेकिन मुझे पता चला कि क्या dizzyd के पैच बन गया; http://stackoverflow.com/a/15664576/275581 देखें। – metamatt

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