2012-06-06 14 views
7

मैं निम्नलिखित है कि मैं जबकि कुछ रूबी स्क्रिप्ट चला पाने की तरह डिबग त्रुटियों के लिए कोशिश कर रहा हूँ:डिबगिंग malloc त्रुटियों

ruby(47333,0x7fff72aee960) malloc: *** error for object 0x7f98b6a6e3f0: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

किसी भी विचार कैसे मैं वास्तव में इस तरह के एक ब्रेकपाइंट और डिबग सेट कर सकते हैं ? मैं देखना चाहता हूं कि यह रूबी स्वयं या कुछ विस्तार के कारण है ..

मैं Mac OS X 10.7.3 (Lion) और ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0] का उपयोग कर रहा हूं।

+1

इसका मतलब है कि 'gdb' या कुछ अन्य सी डीबगर का उपयोग करके ब्रेकपॉइंट सेट करें। डिबगिंग सक्षम के साथ रूबी और एक्सटेंशन का उपयोग करना (यानी '-g' के साथ संकलित) सहायक होगा। –

+1

@muistooshort अगर आप यह कैसे कर सकते हैं या एक लिंक प्रदान करने के चरणों में जा सकते हैं, तो मुझे लगता है कि मैं आपको – babonk

उत्तर

2

यदि आप रूबी 1.9.2+ पर हैं, तो डीबगर मणि (gem install debugger) इंस्टॉल करें। डीबग करने के दो तरीके हैं: सीधे debugger मणि या redbug बाइनरी का उपयोग करके। आइए दिखाएं कि हमारे पास खिलौना स्क्रिप्ट है, और हम जानना चाहते हैं कि $blahfoo() पर कॉल करने के बाद 4 है (यह एक बाहरी पुस्तकालय का बहाना है)।

विधि 1: सहित debugger

यह अपने कोड में मैन्युअल रूप से एक ब्रेकपाइंट सेट कर रहा है:

require 'debugger' 

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
debugger() # opens rdb 
bar() 

puts $blah 

ruby debug.rb के रूप में इस भागो। यह एक माणिक डिबग कंसोल में आप का शुभारंभ करेंगे:

% ruby debug.rb 
debug.rb:15 
bar() 
(rdb:1) list 
[10, 19] in debug.rb 
    10 $blah += 4 
    11 end 
    12 
    13 foo() 
    14 debugger() 
=> 15 bar() 
    16 
    17 puts $blah 
(rdb:1) display $blah 
1: $blah = 4 

विधि 2: rdebug

यहाँ हमारे उदाहरण उदाहरण स्क्रिप्ट है, debug.rb चल रहा है:

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
bar() 

puts $blah 

खोल से, निष्पादित rdebug debug.rb। यहाँ एक उदाहरण सत्र है:

% rdebug debug.rb 
(rdb:1) list 1,20 
[1, 20] in /mnt/hgfs/src/stackoverflow/debug.rb 
=> 1 $blah = 3 
    2 
    3 def foo 
    4 $blah += 1 
    5 end 
    6 
    7 def bar 
    8 $blah += 4 
    9 end 
    10 
    11 foo() 
    12 bar() 
    13 
    14 puts $blah 
(rdb:1) break 12 
Breakpoint 1 file /mnt/hgfs/src/stackoverflow/debug.rb, line 12 
(rdb:1) display $blah 
1: $blah = 
(rdb:1) continue 
Breakpoint 1 at /mnt/hgfs/src/stackoverflow/debug.rb:12 
1: $blah = 4 
/mnt/hgfs/src/stackoverflow/debug.rb:12 
bar() 
(rdb:1) display $blah 
2: $blah = 4 

कुंजी आदेश break LINE-NUMBER और display VARIABLE हैं। उम्मीद है की वो मदद करदे!

संसाधन

+0

पर प्रश्न का पुरस्कार दूंगा। समस्या यह है कि बाबोन को सी समारोह में ब्रेकपॉइंट सेट करने की आवश्यकता है ('malloc_error_break') ताकि वे एक संकेतक को दो बार मुक्त करने वाले व्यक्ति को समझने के लिए दुभाषिया या सी-आधारित एक्सटेंशन में बैकट्रैक कर सकें। –

+0

@muistooshort: babonk एक रूबी स्क्रिप्ट चला रहा है, इसलिए मुझे लगता है कि बग एक बाहरी पुस्तकालय से है जो सी एक्सटेंशन का उपयोग करता है। लाइब्रेरी कॉल किसी के सी एक्सटेंशन को डीबग करने से अधिक उपयोगी होने से पहले कुछ ब्रेकपॉइंट्स सेट करने की तरह लग रहा था। हालांकि, अगर यह वांछित है, [यह रूबी-टॉक संदेश] (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/18105) दिखाता है कि यह कैसे करें। – jmdeldin

2

यहाँ मेरी समस्या हल जब मैं ओ पी के संदेश को देखा है: कोशिश कर, क्योंकि मैं रास्तों के साथ गड़बड़ था

मैं संदेश मिला, कुछ स्थापित करने के लिए rvm या gem प्राप्त करने के लिए, और मैं वास्तव में मेरा अपनाना चाहता था अनुमतियाँ। तब मुझे यह वही संदेश मिला जो ओपी रिपोर्ट कर रहा है। मेरे लिए, मैक ओएस एक्स के Disk Utility पर जाने वाली एकमात्र चीज बाएं फलक (मैकिंटोश एचडी) में मेरी वॉल्यूम का चयन करें, और उसके बाद Repair Disk Permissions पर क्लिक करें।

इसे समाप्त करने के बाद, मैं सफलतापूर्वक खोलने और एक नई टर्मिनल विंडो शुरू करने में सक्षम था।

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