¿Cómo depurar una aplicación Sinatra como una aplicación Rails?


En mi controlador principal de Sinatra, quiero depurar el hash de parámetros después de que se publique desde un formulario.

He añadido:

puts params.inspect

Y

set :logging, :true

El params.inspect funciona si todo va bien. Pero si ocurre un error antes de que se ejecute el controlador no estoy recibiendo ninguna información sobre el error como lo haría en Rails por defecto.

¿Cuál es la mejor manera de obtener información útil de depuración?

Este ejemplo no funcionó en absoluto (la aplicación ni siquiera se iniciaría después He añadido este código):

configure do 
  Log = Logger.new("sinatra.log")
  Log.level  = Logger::INFO 
end

Seguido de:

Log.info "#{@users.inspect}"
Author: nova, 2009-09-02

9 answers

Puede intentar agregar un filtro antes que imprima los parámetros

before do
  puts '[Params]'
  p params
end
 20
Author: BaroqueBobcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-01 21:51:28

Mi opinión es que para depurar debe usar configure :development do porque algunos indicadores de depuración están activados en este escenario. Por lo tanto, bajo su bloque configure do puede habilitar las banderas:

enable :logging, :dump_errors, :raise_errors

Y para su instalación de registro:

log = File.new("sinatra.log", "a")
STDOUT.reopen(log)
STDERR.reopen(log)

Del manual de Sinatra:

  • dump_errors la opción controla si la traza inversa es volcada a rack.errors cuando se genera una excepción desde una ruta. La opción está habilitada de forma predeterminada para las aplicaciones de nivel superior.

  • raise_errors - permitir que las excepciones se propaguen fuera de la aplicación (...) La opción :raise_errors está deshabilitada por defecto para aplicaciones de estilo clásico y habilitada por defecto para subclases Sinatra::Base.

También uso el

puts "something" + myvar.inspect

Método en medio de mis controladores.

 14
Author: include,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 21:30:10

Como dice @jshen, ruby-debug es una herramienta muy agradable.

Para usarlo en Sinatra, inserte

require 'ruby-debug/debugger' 

Donde desea que comience la depuración.

 10
Author: asymmetric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 21:30:42

Recomiendo usar Pry o el depurador Ruby. Con Pry, puede usar la línea de comandos para recorrer sus métodos y variables como lo haría en bash.

Ver " ¿Cómo usar Pry con Sinatra?".

 8
Author: Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:24

Para encontrar la mejor manera de depurar la aplicación sinatra, creé un repositorio en github. La parte más útil es step into method debug, que se ve a continuación.

introduzca la descripción de la imagen aquí

Aquí está el repositorio: https://github.com/hlee/sinatra_debugger_example

 4
Author: Race,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-25 21:34:08

Recomiendo encarecidamente usar ruby-debug. Es muy fácil de configurar y usar una vez que aprendes los cuatro o cinco comandos básicos. Le permitirá establecer un punto de interrupción donde desea inspeccionar los parámetros y jugar interactivamente con él como lo haría en IRB.

 3
Author: jshen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 21:34:45
 1
Author: Zach Inglis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-02 11:53:19

Supongo que ya que mencionaste tu controlador Sinatra principal, tienes más de uno, lo que significa que estás subclasificando Sinatra::Base en lugar de usar una aplicación Sinatra clásica (de nivel superior). Si este es el caso, gran parte del manejo de errores predeterminado que hace Sinatra está deshabilitado por defecto.

Si incluye set :show_exceptions, true if development? en la definición de la clase, obtendrá páginas de error amigables que incluyen un seguimiento de pila, parámetros, etc., en lugar de solo un error interno del servidor. Otra opción es set :raise_errors, false y luego incluya un bloque error do ... end que se ejecutará cada vez que una de sus rutas genere un error.

 1
Author: Emily,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-23 23:31:13

Recomiendo usar la gema debugger.

Para usar esto con su aplicación Sinatra:

  1. Añade la gema a tu Gemfile

    gem "debugger"
    
  2. Instale la gema ejecutando

    bundle
    
  3. En su archivo principal de la aplicación sinatra, agregue

    require 'debugger'
    
  4. Ahora para depurar, solo tiene que agregar la siguiente línea

    debugger
    

    En cualquier lugar de su código.

Cuando se ejecuta el código y se ve debugger, el código se detendrá y puede inspeccionar variables, ejecutar comandos (usando eval), etc.

 1
Author: Zack Xu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 21:38:49