2011-12-17 11 views
30

Dado que puede haber una gran cantidad de Ghost Methods dentro de una gema de rubí, no creo que sea una buena idea estudiar el mecanismo interno de una gema de rubí con solo leyendo su código fuente estáticamente. ¿Hay alguna forma de adjuntar el archivo de origen de una gema en tercera parte a un proceso ruby ​​en ejecución para la depuración, de modo que pueda establecer el punto de ruptura y ver cómo funcionan las cosas de forma dinámica?
Por cierto, he intentado navegar al archivo fuente de una gema de tercera parte en RubyMine haciendo clic en el menú contextual "Ir a -> Implementaciones" de la declaración 'requerir' u otro símbolo de una gema en tercera parte (require 'watir' por ejemplo), sin éxito. ¿Es normal que un IDE de un lenguaje de tipeo dinámico como Ruby falle una navegación con símbolos?La mejor manera de depurar gemas de terceros en ruby ​​

Respuesta

37

me gustaría saber si hay una mejor manera de hacer esto, pero la forma en que suelo hacer es:

  1. Añadir la gema ruby-debug a su Gemfile (o rubí debug19 si estás en Ruby 1.9.2)
  2. Encuentra la gema haciendo bundle show gemname. Estoy en una Mac, así que usualmente canalizo esto para hacer una copia, así que se copia en mi portapapeles. bundle show rails | pbcopy
  3. Abra el directorio gem en su editor favorito. mvim /path/to/gem/directory
  4. Navegue hasta el archivo y la línea donde desea colocar el punto de interrupción * e inserte debugger arriba de la línea en cuestión.
  5. Recargar página, prueba de funcionamiento, o hacer lo que haría para obtener el archivo de la gema para ejecutar
  6. Cuando la ejecución se detiene en el depurador, puede inspeccionar las variables (p variable_name), y la línea jugada de acuerdo con la ruby debugger commands.

* Saber dónde poner el punto de interrupción puede tener una cierta comprensión del código, sino que debe empezar en lib/gemname.rb

+3

Gracias. Esto funciona genial FWIW, usé estas instrucciones con [Pry] (https: // rubygems.org/gems/pry) en lugar de ruby-debug y eso funcionó también. –

+1

¿Interrumpiría esto otras aplicaciones en la misma máquina si están usando la misma Gema? – flyingL123

+0

@ flyingL123, supongo que interrumpirá a otros, si se ejecutan en modo de depuración como su aplicación. – parzival

0

En lenguajes que cambian el código en tiempo de ejecución, como Ruby, es difícil predecir con precisión el 100% de los orígenes de símbolos, métodos etc.

trato con una gran cantidad de joyas de terceros que necesitan análisis de código fuente y Descubrí que la mejor herramienta para esta tarea es Netbeas + son los complementos de Ruby y Rails.

  • permite una buena navegación en el código fuente de gemas dependientes (a diferencia de otras alternativas)
  • puntos de ruptura visual y depuración que en realidad el trabajo (con el rastro y todo) **

** tiene algunos problemas técnicos con llamadas de método en bloques de código cedidos (como cada {}) pero aprendí a tratar con esos

Lo que suelo hacer es establecer puntos de interrupción y analizar el código en tiempo de ejecución.

9

evitaría la edición de los archivos de la gema como se sugiere en la respuesta aceptada actualmente. En su lugar, ponga el comando debugger en uno de sus archivos de aplicación y use el comando break para establecer un punto de interrupción en la gema. Estoy usando rvm con un gemset así que aquí es cómo lo hago:

break /Users/chris/.rvm/gems/[email protected]<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

+0

¿La respuesta aceptada interferiría con otras aplicaciones en la misma máquina si están utilizando la misma Gema? Si es así, parece que esta solución evitaría ese problema. – flyingL123

+2

Sí. Ese es todo el punto. A menos que esté sin opciones, evitaría editar los archivos Gem a toda costa a menos que esté dispuesto a bifurcarlos –

Cuestiones relacionadas