2011-12-05 9 views
7

¿Hay alguna forma de imprimir el seguimiento de la pila en tiempo de ejecución de un proceso de Ruby 1.9.x? Sé que había una utilidad llamada pstack para Ruby 1.8, pero el proyecto parece haber sido abandonado hace un par de años: https://github.com/ice799/pstack. ¿Existe algo como esto para Ruby 1.9? ¡Muchas gracias!¿Cómo puedo imprimir el seguimiento de la pila en tiempo de ejecución de un proceso de Ruby 1.9?

EDITAR: Estoy interesado en utilizar una herramienta externa para generar el seguimiento de la pila (no se ejecuta en el mismo espacio de memoria que el proceso de Ruby).

Como @mosch señaló, el método Kernal#caller funciona desde el proceso Ruby en ejecución.

Incluso se podría construir en apoyo a su código Ruby que atrapa señales de proceso e imprime un seguimiento de pila:

Signal.trap("SIGTERM") { p caller } 

Referencia: http://www.ruby-doc.org/core-1.9.3/Signal.html

podría construir esta funcionalidad en mi código, pero me d prefiero usar una solución externa más generalizada. Gracias.

Respuesta

3

Siempre que llame al método Kernel caller, obtendrá la pila de llamadas actual como una matriz.

+0

Gracias @mosch. He actualizado mi descripción para agregar algunas aclaraciones. –

0

Hoy he tenido una idea sobre esto. El pstack de ice799 aprovechó gdb para llamar a una función interna de ruby ​​para volcar el backtrace. Sin embargo, no funcionó para 1.9 y requirió un parche. No es tan conveniente.

Con suerte, tenemos hotpatch esta poderosa herramienta. Puede inyectar un .so a un proceso en ejecución, podemos agregar la función requerida a través de la inyección .so, pstack hará todo lo demás. Por supuesto, los inyectados también deben ser compatibles con el núcleo ruby ​​en ejecución, pero podemos suponer que esta parte es muy estable ahora.

Cuestiones relacionadas