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
me gustaría saber si hay una mejor manera de hacer esto, pero la forma en que suelo hacer es:
- Añadir la gema ruby-debug a su Gemfile (o rubí debug19 si estás en Ruby 1.9.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
- Abra el directorio gem en su editor favorito.
mvim /path/to/gem/directory
- 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. - Recargar página, prueba de funcionamiento, o hacer lo que haría para obtener el archivo de la gema para ejecutar
- 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
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.
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>
¿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
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 –
- 1. ¿Cuál es la mejor manera de burlarse de un objeto de terceros en ruby?
- 2. Ruby on Rails: la mejor manera de probar una llamada fallida a una API de terceros
- 3. ¿Hay una mejor manera de depurar SQL?
- 4. ¿Cuál es la mejor manera de depurar css en ie?
- 5. ¿La mejor manera de enseñarte Ruby?
- 6. ¿Cuál es la mejor manera de usar SOAP con Ruby?
- 7. La mejor manera de usar R en Ruby
- 8. ¿La mejor manera de escaparse y quitar cuerdas en Ruby?
- 9. Convenciones de nomenclatura de gemas de Ruby
- 10. Ruby on Rails: ¿la mejor manera de comparar dos fechas?
- 11. ¿Puede JRuby usar gemas de Ruby originales?
- 12. Cómo buscar gemas ruby útiles
- 13. Desinstalar versiones antiguas de Ruby gemas
- 14. Ruby, Qt y widgets de terceros
- 15. ¿La mejor manera de depurar Javascript en una aplicación de iPhone?
- 16. ¿Cuál es la mejor biblioteca de Diff en Ruby?
- 17. i * debe * almacenar credenciales de terceros en mi base de datos. ¿mejor manera?
- 18. ¿Cómo depurar en Django, la buena manera?
- 19. ¿Cuál es la mejor manera de depurar los procedimientos almacenados (y escribir sprocs que son más fáciles de depurar)?
- 20. ¿Cuál es la mejor manera de depurar Typoscript en TYPO3 CMS?
- 21. ¿La mejor manera de depurar la aplicación web Java empaquetada como WAR utilizando Eclipse y Maven?
- 22. ¿Es posible oscilar dos gemas ggplot de la misma manera?
- 23. ¿Cuál es la mejor manera de depurar las aplicaciones de Calzado?
- 24. ¿La mejor manera de personalizar Spree?
- 25. ¿Cómo desinstalo ruby y gemas usando RVM?
- 26. Ruby no puede encontrar las gemas instaladas
- 27. Bundler instalando gemas en la ubicación incorrecta
- 28. ¿Cuál es la mejor manera de depurar AJAX para llamar a PHP?
- 29. Gemas de cifrado de dos vías recomendadas para Ruby?
- 30. ¿Cuál es la mejor práctica para incluir archivos jar de terceros en un programa Java?
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. –
¿Interrumpiría esto otras aplicaciones en la misma máquina si están usando la misma Gema? – flyingL123
@ flyingL123, supongo que interrumpirá a otros, si se ejecutan en modo de depuración como su aplicación. – parzival