2012-06-06 9 views
7

estoy tratando de depurar errores como el siguiente que consigo durante la ejecución de algunos scripts Ruby:depuración de errores malloc en Ruby en 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 

Cualquier idea de lo que realmente puede establecer un punto de interrupción tal y depurar ? Quiero ver si esto es causado por el propio Ruby o alguna extensión ...

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

+1

Eso significa establecer un punto de interrupción usando 'gdb' o algún otro depurador de C. Usar un Ruby y extensiones con la depuración habilitada (es decir, compilado con '-g') sería útil. –

+1

@muistooshort Si pudieras seguir los pasos de cómo se hace esto, o proporcionar un enlace, creo que probablemente te adjudique la pregunta – babonk

Respuesta

2

Si está en Ruby 1.9.2+, instale la gema del depurador (gem install debugger). Hay dos formas de depurar: incluir directamente la gema debugger o usar el binario redbug. Hagamos de cuenta que tenemos un script de juguete, y queremos saber por qué $blah es 4 después de llamar al foo() (pretende que es una biblioteca externa).

Método 1: Incluyendo debugger

Esto está estableciendo un punto de interrupción en el código manualmente:

require 'debugger' 

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

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

puts $blah 

Ejecutar esto como ruby debug.rb. Esto le lanzarse a una consola de rubí de depuración:

% 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 

Método 2: Ejecutar rdebug

Aquí está nuestro ejemplo script de ejemplo, debug.rb:

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
bar() 

puts $blah 

de Shell, ejecutar rdebug debug.rb. He aquí un ejemplo de sesión:

% 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 

Los comandos de teclado son break LINE-NUMBER y display VARIABLE. ¡Espero que ayude!

Recursos

+0

El problema es que babonk necesita establecer un punto de interrupción en una función C ('malloc_error_break') para que puedan retroceder hacia el intérprete o una extensión basada en C para calcular quién está liberando un puntero dos veces. –

+0

@muistooshort: babonk está ejecutando un script de Ruby, así que supongo que el error proviene de una biblioteca externa que usa una extensión C. Parecía establecer algunos puntos de interrupción antes de que la llamada a la biblioteca fuera más útil que la depuración de la extensión C de alguien. Sin embargo, si se desea, [este mensaje de ruby-talk] (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/18105) muestra cómo hacerlo. – jmdeldin

2

Esto es lo que resolvió mi problema cuando vi el mensaje de la OP:

ha aparecido el mensaje porque me había metido con caminos, tratando para obtener rvm o gem para instalar algo, y logré realmente ensuciar mi permisos Luego recibí el mismo mensaje que informa el OP. Para mí, lo único que lo hizo fue ir a Mac OS X Disk Utility, seleccionar mi volumen en el panel izquierdo (Macintosh HD) y luego hacer clic en Repair Disk Permissions.

Después de que terminó, pude abrir con éxito y poner en marcha una nueva ventana de terminal.