2011-06-22 12 views
27

मेरे पास कुछ रूबी और जावा पृष्ठभूमि है और मैं त्रुटि लॉग में लाइनों की सटीक संख्या रखने के आदी हूं।एरलांग कोड कैसे डिबग करें?

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

इस रूबी उदाहरण की तरह:

my_ruby_code.rb:13:in `/': divided by 0 (ZeroDivisionError) 
    from my_ruby_code.rb:13 

यह सरल और तेज है - मैं सिर्फ लाइन नंबर 13 के पास जाकर त्रुटि को ठीक।

इसके विपरीत, Erlang बस का कहना है कि कुछ की तरह:

** exception error: no match of right hand side value [xxxx] 
in function my_module:my_fun/1 
in call from my_module:other_fun/2 

कोई लाइन नंबर को देखने के लिए कर रहे हैं।

और अगर मैं दो पंक्तियों की तरह

X = Param1, 
Y = Param2, 
'my_fun' में

, राशि कैसे समझ सकते हैं, जिसमें लाइन समस्या है?

इसके अतिरिक्त, मैंने विम से Emacs + Elang-Mode पर स्विच करने का प्रयास किया है, लेकिन अब तक का एकमात्र बोनस एमएक्स (सी-के `) के अंदर संकलन त्रुटियों के माध्यम से चक्र करने की क्षमता है।

तो, कोड लिखने की प्रक्रिया और सरल तार्किक त्रुटियों की तलाश करने जैसे 'दाएं हाथ की कोई मैच' थोड़ा बोझिल लगती है।

मैंने कोड में "आईओ: प्रारूप" लाइनों को जोड़ने की कोशिश की है, लेकिन यह अतिरिक्त काम है जिसमें समय लगता है।

मैंने distel का उपयोग करने का भी प्रयास किया है, लेकिन इसे एक बार डीबगर खोलने के लिए 10 चरणों की आवश्यकता है।

सवाल:

  1. Erlang कोड डिबग करने के लिए सबसे सीधा और आसान तरीका क्या है?
  2. क्या एमाक्स के एरलांग-मोड में विम की तुलना में एरलांग विकास के मामले में कुछ बेहतर है?
  3. क्या विकास 'लिखने-संकलन-डीबग' चक्र आप पसंद करते हैं? क्या आप टर्मिनल में कोड संकलित और चलाने के लिए Emacs छोड़ते हैं? आप अपने एरलांग कोड में त्रुटियों की खोज कैसे करते हैं?
+0

कृपया चुनें कि आपका प्रश्न किस प्रश्न से हल हुआ है, यदि कोई हो। –

उत्तर

17

आप अपने कोड से कदम उठाने के लिए Erlang debugger का उपयोग कर सकते हैं और देख सकते हैं कि कौन सी लाइन विफल हो रही है।

erl से, साथ डिबगर शुरू:

debugger:start(). 

फिर आप चुन सकते हैं जो मॉड्यूल आप ii के साथ व्याख्या मोड (डिबगिंग के लिए आवश्यक) UI का उपयोग या कंसोल का उपयोग करने में करना चाहते हैं:

ii(my_module). 

breakpoints जोड़ना यूआई या कंसोल में फिर से किया जाता है:

ib(my_module, my_func, func_arity). 

इसके अलावा, एरलांग आर 15 में हम अंत में स्टैक निशान में लाइन नंबर लेंगे!

+0

लेकिन फिर भी मुझे लगता है कि एरलांग डीबगर विकास में है ... क्या यह स्थिर है? – niting112

+1

डीबगर पर अभी भी काम किया जा रहा है, लेकिन मुझे लगता है कि यह उपयोग करने के लिए पर्याप्त स्थिर है।जब मैं RabbitMQ या संबंधित प्लगइन पर काम कर रहा हूं, तो मैंने समस्याएं डीबग करने के लिए काफी कुछ उपयोग किया है - यह एक बहुत बड़ा इरलांग कोडबेस है। –

+0

@ niting112 एरलांग डीबगर एक उत्पादन परीक्षण उपकरण है जो ठोस है। यह वितरण का एक मानक, परीक्षण हिस्सा है। जब डब्ल्यूएक्स संस्करण जारी किया गया था तो कुछ स्थिरता प्रतिगमन थे, लेकिन तब से उन्हें संबोधित किया गया है। –

33

एरगैंग कोड डिबगिंग कई बार मुश्किल हो सकता है, खासकर badmatch त्रुटियों से निपटना। सामान्य तौर पर, दो अच्छा दिशा निर्देशों रखा जाना चाहिए:

  • बजाय अस्थायी चर बंधन की, अगर आप यह कर सकते
  • उपयोग वापसी मान सीधे रखें कार्यों लघु (इससे आप function_clause त्रुटियों आदि जो तरीका है होने का लाभ दे देंगे अधिक जानकारीपूर्ण)

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

नमूना अभिव्यक्ति आपके द्वारा दी गई को देखते हुए मामले अक्सर है कि आप बस चर की तुलना में अधिक अन्य चर (जो Erlang में पूरी तरह से अनावश्यक है) करने के लिए आवंटित किया जा रहा है:

run(X, Y) -> 
    X = something(whatever), 
    Y = other:do(more_data), 

एक badmatch त्रुटि यहाँ डिबगिंग सहायता प्राप्त है कमांड लाइन डिबगर का उपयोग करके: वापसी मान में {matched,_,1} के लिए

1> dbg:tracer().       % Start the CLI debugger 
{ok,<0.55.0>} 
2> dbg:p(all, c).       % Trace all processes, only calls 
{ok,[{matched,[email protected],29}]} 
3> dbg:tpl(my_module, something, x).  % tpl = trace local functions as well 
{ok,[{matched,[email protected],1},{saved,x}]} 
4> dbg:tp(other, do, x).     % tp = trace exported functions 
{ok,[{matched,[email protected],1},{saved,x}]} 
5> dbg:tp(my_module, run, x).    % x means print exceptions 
{ok,[{matched,[email protected],1},{saved,x}]} % (and normal return values) 

देखो ... अगर यह 0 बजाय 1 (या अधिक) हो गया होता है कि इसका मतलब होगा कि कोई भी कार्य पैटर्न से मेल नहीं खाता है। dbg मॉड्यूल के लिए पूर्ण प्रलेखन here पाया जा सकता है।

देखते हुए कि दोनों something/1 और other:do/1 हमेशा ठीक देता है, निम्नलिखित हो सकता है:

6> my_module:run(ok, ok). 
(<0.72.0>) call my_module:run(ok,ok) 
(<0.72.0>) call my_module:something(whatever) 
(<0.72.0>) returned from my_module:something/1 -> ok 
(<0.72.0>) call other:do(more_data) 
(<0.72.0>) returned from other:do/1 -> ok 
(<0.72.0>) returned from my_module:run/2 -> ok 
ok 

यहाँ हम पूरे कॉल प्रक्रिया को देख सकते हैं, और क्या वापसी मान दिया गया। अगर हम कुछ से कॉल करने की हम जानते हैं कि असफल हो जायेगी:

7> my_module:run(error, error). 
** exception error: no match of right hand side value ok 
(<0.72.0>) call my_module:run(error,error) 
(<0.72.0>) call my_module:something(whatever) 
(<0.72.0>) returned from my_module:something/1 -> ok 
(<0.72.0>) exception_from {my_module,run,2} {error,{badmatch,ok}} 

यहाँ हम देख सकते हैं कि हम एक badmatch अपवाद है, something/1 बुलाया गया था, लेकिन कभी other:do/1 तो हम मान सकते हैं कि badmatch कि कॉल करने से पहले हुआ।

कमांड लाइन डीबगर के साथ कुशलता प्राप्त करना आपको बहुत समय बचाएगा, गीलेर आप सरल डीबग करेंगे (लेकिन मुश्किल!) badmatch त्रुटियां या कुछ और जटिल।

उम्मीद है कि यह सब आसान होगा जब Erlang R15 अपवादों में लाइन संख्याओं के साथ आता है!

4

आप हाल ही में एक के साथ अपने erlang स्थापना की जगह हैं, तो आप लाइन नंबर होगा, वे संस्करण 15.

के साथ शुरू जोड़ा गया था नए संस्करण अभी तक अपने ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हैं, तो आप से बना सकते हैं स्रोत या यहां एक पैकेज संस्करण प्राप्त करने का प्रयास करें: http://www.erlang-solutions.com/section/132/download-erlang-otp

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