Cuando recibo excepciones, a menudo es desde lo profundo de la pila de llamadas. Cuando esto sucede, la mayoría de las veces, la línea de código ofensiva real se me oculta:
tmp.rb:7:in `t': undefined method `bar' for nil:NilClass (NoMethodError)
from tmp.rb:10:in `s'
from tmp.rb:13:in `r'
from tmp.rb:16:in `q'
from tmp.rb:19:in `p'
from tmp.rb:22:in `o'
from tmp.rb:25:in `n'
from tmp.rb:28:in `m'
from tmp.rb:31:in `l'
... 8 levels...
from tmp.rb:58:in `c'
from tmp.rb:61:in `b'
from tmp.rb:64:in `a'
from tmp.rb:67
Ese truncamiento de "... 8 niveles ..." me está causando muchos problemas. No estoy teniendo mucho éxito buscando en Google: ¿Cómo le digo a Ruby que quiero que los vertederos incluyan la pila completa?
ruby
exception
stack-trace
Sniggerfardimungus
fuente
fuente
Respuestas:
La excepción # backtrace tiene toda la pila:
(Inspirado en el blog Ruby Inside de Peter Cooper )
fuente
raise
. No es necesario especificar explícitamente la ejecución que desea generar.También puede hacer esto si desea una línea simple:
fuente
raise
se puede usar sin argumentos. Tampoco sabía querescue
se tratará correctamente como un trazo. También ignoro totalmente esos vars globales como$!
.puts "this line was reached by #{caller.join("\n")}"
y caller
para imprimir la salida como el seguimiento de la pila de Java.caller(0,2)
devolvería las dos últimas entradas en el stacktrace. Agradable para la salida de stacktraces abreviados.Esto produce la descripción del error y una buena traza limpia e indentada:
fuente
IRB tiene una configuración para esta horrible "característica", que puede personalizar.
Cree un archivo llamado
~/.irbrc
que incluya la siguiente línea:Esto le permitirá ver 100 cuadros de pila
irb
al menos. No he podido encontrar una configuración equivalente para el tiempo de ejecución no interactivo.Puede encontrar información detallada sobre la personalización de IRB en el libro Pickaxe .
fuente
Un revestimiento para callstack:
Un revestimiento para callstack sin todas las gemas:
Un revestimiento para callstack sin todas las gemas y relativo al directorio actual
fuente
Esto imita el rastro oficial de Ruby, si eso es importante para ti.
Divertidamente, no maneja correctamente la 'excepción no controlada', informando que es 'RuntimeError', pero la ubicación es correcta.
fuente
Recibía estos errores al intentar cargar mi entorno de prueba (a través de la prueba de rastrillo o la prueba automática) y las sugerencias de IRB no me ayudaron. Terminé envolviendo todo mi test / test_helper.rb en un bloque de inicio / rescate y eso solucionó las cosas.
fuente
[Examine todos los hilos retrocesos para encontrar al culpable]
Incluso la pila de llamadas completamente expandida puede ocultarle la línea de código ofensiva real cuando usa más de un subproceso!
Ejemplo: un hilo está iterando ruby Hash, otro hilo está tratando de modificarlo. ¡AUGE! ¡Excepción! Y el problema con el seguimiento de la pila que se obtiene al intentar modificar el hash 'ocupado' es que muestra la cadena de funciones hasta el lugar donde está tratando de modificar el hash, pero NO muestra quién lo está iterando actualmente en paralelo ( quien lo posee)! Esta es la forma de resolverlo imprimiendo el seguimiento de la pila para TODOS los subprocesos actualmente en ejecución. Así es como haces esto:
El fragmento de código anterior es útil incluso solo con fines educativos, ya que puede mostrarle (como rayos X) cuántos hilos tiene realmente (en comparación con cuántos creía que tenía, a menudo esos dos son números diferentes;)
fuente
También puede utilizar traza gema de rubíes (yo soy el autor):
fuente