2012-06-06 14 views
7

sto cercando di eseguire il debug di errori come il seguente che ho durante l'esecuzione di alcuni script Ruby:debug errori malloc in Ruby on Mac OS X

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

Qualsiasi idea di come posso effettivamente impostare un tale punto di interruzione ed eseguire il debug ? Voglio vedere se questo è causato da Ruby stesso o alcuni extensio ..

Sto usando Mac OS X 10.7.3 (Lion) e ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0].

+1

Ciò significa impostare un punto di interruzione utilizzando 'gdb' o qualche altro debugger C. Sarebbe utile usare un Ruby e le estensioni con il debug abilitato (cioè compilato con '-g'). –

+1

@muistooshort se puoi seguire i passaggi di come è fatto, o fornire un link, penso che probabilmente ti assegnerò la domanda – babonk

risposta

2

Se si utilizza Ruby 1.9.2+, installare la gemma debugger (gem install debugger). Esistono due modi per eseguire il debug: includere direttamente la gemma debugger o utilizzare il binario redbug. Facciamo finta di avere uno script giocattolo e vogliamo sapere perché $blah è 4 dopo aver chiamato foo() (fai finta che sia una libreria esterna).

Metodo 1: Compreso debugger

Questa è la creazione manuale di un punto di interruzione nel codice:

require 'debugger' 

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

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

puts $blah 

Esegui questo come ruby debug.rb. Questo vi lancerà in una console ruby-debug:

% 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 

Metodo 2: Esecuzione rdebug

Ecco il nostro esempio script di esempio, debug.rb:

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
bar() 

puts $blah 

Da shell, eseguire rdebug debug.rb. Ecco una sessione di esempio:

% 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 

I comandi principali sono break LINE-NUMBER e display VARIABLE. Spero possa aiutare!

Risorse

+0

Il problema è che babonk ha bisogno di impostare un breakpoint in una funzione C ('malloc_error_break') in modo che possano tornare indietro nell'interprete o in un'estensione basata su C per capire chi sta liberando un puntatore due volte. –

+0

@muistooshort: babonk sta eseguendo uno script Ruby, quindi presumo che il bug provenga da una libreria esterna che utilizza un'estensione C. Sembrava impostare alcuni punti di interruzione prima che la chiamata alla libreria fosse più utile del debug dell'estensione C di qualcuno. Tuttavia, se lo desideri, [questo messaggio ruby-talk] (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/18105) mostra come farlo. – jmdeldin

2

Ecco cosa ha risolto il mio problema quando ho visto il messaggio del PO:

ho ricevuto il messaggio perché avevo pasticciato con i percorsi, cercando per ottenere rvm o gem per installare qualcosa, e sono riuscito a rovinare davvero il mio permessi. Poi ho ricevuto lo stesso messaggio che l'OP sta segnalando. Per me, l'unica cosa che ha fatto è stato andare su Mac OS X Disk Utility, selezionare il mio volume nel riquadro di sinistra (Macintosh HD), quindi fare clic su Repair Disk Permissions.

Al termine, sono riuscito a aprire e avviare una nuova finestra di terminale.