2012-06-06 5 views
7

デバッグ:私は実際に、このようなブレークポイントとデバッグを設定する方法は、いくつかのRubyスクリプトを実行している間、私が得ることを次のように私はデバッグエラーにしようとしているのMac OS X上のRubyでのmallocエラー

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

任意のアイデア?これがRubyそのものであるのか、ある程度の拡張が原因であるのか確認したいと思います。

私はMac OS X 10.7.3 (Lion)ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]を使用しています。

+1

これは、 'gdb'やその他のCデバッガを使ってブレークポイントを設定することを意味します。 Rubyや拡張機能を有効にしてデバッグを有効にする(つまり、 '-g'でコンパイルする)と便利です。あなたはこれがどのように行われるかの段階に入る、またはリンクを提供することができれば、私はおそらくあなたに –

+1

@muistooshortはbabonkはCの関数( 'malloc_error_break'にブレークポイントを設定する必要があるということです)を使用して、インタプリタまたはCベースの拡張をバックトラックして、誰がポインタを2回解放しているかを把握することができます。 – babonk

答えて

2

あなたがRuby 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-NUMBERdisplay VARIABLEです。希望が助けてくれる!

リソース

+0

問題を質問を授与すると思い –

+0

@muistooshort:babonkは、Rubyスクリプトを実行しているので、私はバグがCの拡張機能を使用する外部ライブラリからであると仮定しています。ライブラリ呼び出しが誰かのC拡張をデバッグするよりも便利になる前に、いくつかのブレークポイントを設定するように思えました。それが希望だ場合は、[このルビートークメッセージ](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/18105は)それを行う方法を示しています。 – jmdeldin

2

ここで私はOPのメッセージを見たとき、私の問題を解決したものです:

私がしようとし、パスを台無していたので、私はメッセージを得ましたrvmまたはgemに何かをインストールするには、私は本当に私のパーミッション。 OPが報告しているのと同じメッセージが表示されます。私にとっては、Mac OS XのDisk Utilityに行き、左のペインでボリュームを選択して(Macintosh HD)、次にRepair Disk Permissionsをクリックしてください。

終了後、新しいターミナルウィンドウを正常に開いて起動することができました。

関連する問題