2009-11-23 24 views
6

Tengo que ejecutar un sitio web heredado de Zope2 y tengo algún tipo de queja con él. El problema más importante es que, de vez en cuando, simplemente se bloquea, funcionando al 100% de carga de la CPU y sin responder a las solicitudes. Si bien el problema no es reproducible de forma regular, una página que contiene 3 gráficos dinámicos la activa a veces, por lo que sospecho que hay algún tipo de condición de carrera que conduce a un bucle infinito o un ajetreo ocupado.Obtener stacktrace del proceso de python atascado

El problema es que todavía no he encontrado la manera de solucionar este problema. No hay nada en los registros de Zope ni nada en los registros del sistema. Probé las sugerencias de this question para obtener una stacktrace, pero la única señal que tiene algún efecto es SIGKILL.

¿Hay otra posibilidad de averiguar dónde está exactamente el proceso cuando se atasca?

Respuesta

0

Si el proceso se atasca de una manera que no pasa por ninguna otra señal, es posible que desee considerar ejecutarlo desde un depurador, en lugar de intentar adjuntarlo en tiempo de ejecución.

Además, podría ser útil para otras tácticas de depuración, como desactivar ciertas partes del código para descubrir el caso mínimo en el que todavía es reproducible para ver qué lo causa mejor.

1

Puede intentar adjuntar un depurador al proceso en ejecución. Vea también this question.

2

Ver mi respuesta a this SO question, use Products.signalstack. Registra el mismo controlador que la respuesta que ya encontró, en el momento del registro del Producto. Tal vez funcione mejor para ti.

Si no es así, probablemente tenga un problema de E/S de nivel de sistema operativo en sus manos, y su única esperanza es adjuntar gdb al proceso. Search Stack Overflow para respuestas gdb; ¡hay una gran cantidad de información aquí!

+1

+1 También ** pstack ** y ** lsstack ** pueden ser de alguna utilidad. –

0

después de correr por Internet en círculos por un tiempo finalmente terminé aquí: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - describe en detalle cómo encajan todas las piezas juntas. la cotización del dinero para mí era 'gdb /usr/bin/python -p $ PID' - se requiere el nombre del archivo ejecutable para que gdb encuentre los archivos de información de depuración correctos.

2

Puede imprimir un buen seguimiento de pila usando pyrasite.

Primero, tendrá que tener instalado gdb.

# Redhat, CentOS, etc 
$ yum install gdb 

# Ubuntu, Debian, etc 
$ apt-get update && apt-get install gdb 

Luego, instale pyrasite.

$ pip install pyrasite 

Uso ps o algún otro método para encontrar el identificador de proceso para el proceso de pitón atascado y corren pyrasite-shell con él.

# Assuming process ID is 12345 
$ pyrasite-shell 12345 

Ahora debería ver un REPL python. Ejecute lo siguiente en REPL para ver los seguimientos de la pila de todos los hilos.

import sys, traceback 
for thread_id, frame in sys._current_frames().items(): 
    print 'Stack for thread {}'.format(thread_id) 
    traceback.print_stack(frame) 
    print '' 
Cuestiones relacionadas