2011-01-11 10 views
48

मर जाता है मैं आशा करती हूं किसी को यहाँ मेरी मदद कर सकते हैं, मैं बहुत किस्मत अपने आप को इस का पता लगाना होने नहीं कर रहा हूँ। मैं सिग्विन पर node.js संस्करण 0.3.1 चला रहा हूँ। मैं कनेक्ट और सॉकेट.io का उपयोग कर रहा हूँ। मुझे लगता है कि DNS या कुछ के साथ कुछ यादृच्छिक समस्याएं हैं, मैंने इसे बिल्कुल नहीं समझा है। अंत परिणाम यह है कि मैं सर्वर ठीक चल रहा है, लेकिन जब कोई ब्राउज़र उससे कनेक्ट करने का प्रयास करता है तो प्रारंभिक HTTP अनुरोध काम करता है, सॉकेट.ओ कनेक्ट होता है, और फिर सर्वर मर जाता है (नीचे आउटपुट)।Node.js, Cygwin और Socket.io एक बार में चलना ... Node.js ENOBUFS फेंकता है और हर किसी को

मुझे नहीं लगता कि यह क्योंकि सर्वर एक बहुत डेटा इसे करने के लिए तैनात हो जाता है HTTP अनुरोध से कोई लेना देना है, और यह अनुरोध प्राप्त और मेरे कनेक्शन है कि यह मार डाला तक जवाब था। मैंने चारों ओर गुमराह किया है और मुझे मिली सबसे नज़दीकी चीज है जो DNS को अनुचित तरीके से सेट किया जा रहा है। यह एक आंतरिक नेटवर्क पर केवल चलाने के लिए मतलब एक नेटवर्क कार्यक्रम है, तो मैं आंतरिक DNS करने के लिए अपने /etc/resolv.conf में nameserver x.x.x.x निर्धारित किया है। मैंने इसके अलावा nameserver 8.8.8.8 भी जोड़ा है। मुझे यकीन नहीं है कि और क्या जांचना है, लेकिन किसी भी मदद से आभारी होंगे।

node.exe.stackdump में

Exception: STATUS_ACCESS_VIOLATION at eip=610C51B9 
eax=00000000 ebx=00000001 ecx=00000000 edx=00000308 esi=00000000 edi=010FCCB0 
ebp=010FCAEC esp=010FCAC4 program=\\?\E:\cygwin\usr\local\bin\node.exe, pid 3296, thread unknown (0xBEC) 
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B 
Stack trace: 
Frame  Function Args 
010FCAEC 610C51B9 (00000000, 00000000, 00000000, 00000000) 
010FCBFC 610C5B55 (00000000, 00000000, 00000000, 00000000) 
010FCCBC 610C693A (FFFFFFFF, FFFFFFFF, 750334F3, FFFFFFFE) 
010FCD0C 61027CB2 (00000002, F4B994D5, 010FCE64, 00000002) 
010FCD98 76306B59 (00000002, 010FCDD4, 763069A4, 00000002) 
End of stack trace 

नोड आउटपुट:

node.js:50 
    throw e; // process.nextTick error, or 'error' event on first tick 
    ^
Error: ENOBUFS, No buffer space available 
    at doConnect (net.js:642:19) 
    at net.js:803:9 
    at dns.js:166:30 
    at IOWatcher.callback (dns.js:48:15) 

संपादित

मैं http.createClient के तुरंत बाद एक ग्राहक जानकारी पाने के लिए जोड़ता है का उपयोग करते हुए एक LDAP सर्वर मार कर रहा हूँ, और कहा कि लगता है जहां समस्या यह है कि ईएनओबीयूएफएस पैदा कर रहा है। मैं स्रोत to include && errno != ENOBUFS जो अब मरने से सर्वर से बचाता है, हालांकि अब LDAP अनुरोध काम नहीं कर रहा संपादित किया है। मुझे यकीन नहीं है कि समस्या क्या है जो कि इसका कारण बनती है। जैसा कि मैंने उल्लेख किया है इस एक आंतरिक केवल आवेदन है, इसलिए मैं डीएनएस सर्वर /etc/resolv.conf में डीएनएस सर्वर है कि मेजबान मशीन के लिए लागू किया जा रहा करने के लिए सेट। यकीन नहीं है कि यह इस मुद्दे का हिस्सा है?

संपादित 2

यहाँ gdb --args ./node_g --debug ../myscript.js से कुछ उत्पादन है। मुझे यकीन है कि अगर यह ENOBUFS से संबंधित है नहीं कर रहा हूँ, हालांकि, के रूप में यह इस एक लेकिन +1 विषय पंक्ति के लिए जवाब देने के लिए Socket.io

[New thread 672.0x100] 
Error: dll starting at 0x76e30000 not found. 
Error: dll starting at 0x76250000 not found. 
Error: dll starting at 0x76e30000 not found. 
Error: dll starting at 0x76f50000 not found. 
[New thread 672.0xc90] 
[New thread 672.0x448] 
debugger listening on port 5858 
[New thread 672.0xbf4] 
14 Jan 18:48:57 - socket.io ready - accepting connections 
[New thread 672.0xed4] 
[New thread 672.0xd68] 
[New thread 672.0x1244] 
[New thread 672.0xf14] 
14 Jan 18:49:02 - Initializing client with transport "websocket" 
assertion "b[1] == 0" failed: file "../src/node.cc", line 933, function: ssize_t 
node::DecodeWrite(char*, size_t, v8::Handle<v8::Value>, node::encoding) 

Program received signal SIGABRT, Aborted. 
0x7724f861 in ntdll!RtlUpdateClonedSRWLock() 
    from /cygdrive/c/Windows/system32/ntdll.dll 
(gdb) backtrace 
#0 0x7724f861 in ntdll!RtlUpdateClonedSRWLock() 
    from /cygdrive/c/Windows/system32/ntdll.dll 
#1 0x7724f861 in ntdll!RtlUpdateClonedSRWLock() 
    from /cygdrive/c/Windows/system32/ntdll.dll 
#2 0x75030816 in WaitForSingleObjectEx() 
    from /cygdrive/c/Windows/syswow64/KernelBase.dll 
#3 0x0000035c in ??() 
#4 0x00000000 in ??() 
(gdb) 
+5

यदि आप कोड को स्वयं पोस्ट नहीं करते हैं, तो यह अनुमान लगाने में थोड़ा मुश्किल हो सकता है कि समस्या क्या है। – Pointy

+0

कोड समस्या नहीं है। मैं अधिक जानकारी के साथ सवाल अद्यतन कर रहा हूँ। –

+28

विषय के लिए +1 – WarrenFaith

उत्तर

9

ठीक है, मैंने थोड़ा सा खोद दिया, और आपके दूसरे संपादन के बाद मुझे समस्या सूची पर this bug मिला।

मैं नहीं बताता है कि क्या यह cygwin के तहत या नहीं का सामना करना पड़ा था, लेकिन त्रुटि है कि यह कोड के इस टुकड़े पर ले जाया जाता है मार नीचे:

uint16_t * twobytebuf = new uint16_t[buflen]; 

    str->Write(twobytebuf, 0, buflen, String::HINT_MANY_WRITES_EXPECTED); 

    for (size_t i = 0; i < buflen; i++) { 
    unsigned char *b = reinterpret_cast<unsigned char*>(&twobytebuf[i]); 
    assert(b[1] == 0); // this assertion fails 
    buf[i] = b[0]; 
    } 

मैं क्या मेरी जंग सी के साथ (पढ़ सकते हैं से) यह कन्वर्ट करेगा यह एक नया यूइन 16 सरणी बनाएगा और वी 8 स्ट्रिंग की सामग्री लिख देगा, फिर यह सुनिश्चित करेगा कि कास्टिंग 0 - 255 की सीमा के बाहर कोई मान नहीं लिखता है, और यह वही है जो यहां विफल रहता है।

मुझे यह कुछ भी नहीं मिला कि यह एक वी 8 मुद्दा है या नहीं।

के बाद से कोड this commit में जोड़ा गया है, केवल एक चीज मैं यहाँ का सुझाव दे सकता एक से पेड़ खींच से पहले कोड जोड़ा गया है प्रतिबद्ध कोशिश करने के लिए है। चूंकि उसके बाद के सभी संस्करणों में क्रैशिंग कोड है।

यदि यह काम करता है, तो मैं आपको इस मुद्दे को बाद में नोड.जेएस समस्या सूची पर एक और बग रिपोर्ट दर्ज करने की सलाह दूंगा।

+0

वह प्रतिबद्धता डेढ़ साल पहले थी, मुझे नहीं पता कि मॉड्यूल/मेरा कोड उस माहौल में भी काम करेगा या नहीं? क्या कोड को नए संस्करण में बदलना संभव है। –

+0

मुझे लगता है कि यह संभव होगा, लेकिन इसे कुछ परीक्षण की आवश्यकता होगी और सी ++ वी 8 और सी ++ का मेरा ज्ञान बहुत सीमित है, इसे Node.js google समूह पर पोस्ट करना सबसे अच्छा होगा या शायद # node.js में भी जाना होगा Freenode पर, क्योंकि गिटहब पर मुद्दे ट्रैकर ज्यादातर समय अनदेखा हो जाता है। –

+6

खूनी नरक! एक हार्डकोडेड छोटी-एंडियन धारणा! उस कोड को वापस ले जाने और शॉट करने की जरूरत है! – slebetman

0

बहुत मुश्किल के सिलसिले के बाद तुरंत डिस्कनेक्ट करने जा रहा है।

Node.js मुख्य निर्माण के साथ-साथ एक परीक्षण से युक्त होता है, तो आप उस चलाने है? मैंने सफलतापूर्वक नोड बनाया था, लेकिन क्योंकि मैं ओपनएसएसएल को छोड़ दूंगा, मेरे वेब सॉकेट परीक्षण विफल रहे थे। इसे स्थापित/पुनर्निर्माण करें। परीक्षण परियोजनाओं ने मुझे इस मुद्दे का निदान करने में मदद की।

http://nodejs.org/#download वर्णन के रूप में "परीक्षण करें" करने का सुझाव देते हैं।

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