2011-07-27 5 views
18

¿Hay alguna forma en Linux para comprobar qué está haciendo un proceso de daemon en ejecución de Python? Es decir, ¿sin instrumentar el código y sin terminarlo? Preferiblemente me gustaría obtener el nombre del módulo y el número de línea que se está ejecutando actualmente.Compruebe lo que está haciendo un proceso en ejecución: imprima el seguimiento de la pila de un programa Python sin instrumentación

Las herramientas de depuración convencionales como strace, pstack y gdb no son muy útiles para el código Python. La mayoría de los marcos de pila solo contienen funciones del código de intérprete como PyEval_EvalFrameEx y PyEval_EvalCodeEx, no da ninguna pista sobre el archivo .py que tiene la ejecución.

Respuesta

2

Winpdb le permite attach to a running python process, pero para hacer esto, debe iniciar el proceso de pitón de esta manera:

rpdb2 -d -r script.py 

Entonces, después de establecer una contraseña:

A password should be set to secure debugger client-server communication. 
Please type a password:mypassword 

que podría lanzar Winpdb a Archivo> Adjuntar a (o Archivo> Separar de) el proceso.

6

Algunas de las respuestas en Showing the stack trace from a running Python application son aplicables en esta situación:

+2

Pyrasite funciona muy bien, gracias por la sugerencia! – johndodo

+0

no/proc/sys/kernel/yama existe? por qué – zephor

2

en sistemas POSIX, como Linux, puede utilizar el bueno de GDB, ver

También está el excelente PyCharm IDE (versión gratuita de la comunidad disponible) que se puede conectar a un ru nning proceso de Python directamente desde el IDE, usando Pdb 4 bajo el capó, vea esta entrada de blog:

0

lptrace hace exactamente eso. Le permite conectarse a un proceso en ejecución de Python y mostrar las funciones que se están ejecutando actualmente, como strace para las llamadas al sistema. Se le puede llamar así:

[email protected]:/vagrant$ sudo python lptrace -p $YOUR_PID 
fileno (/usr/lib/python2.7/SocketServer.py:438) 
meth (/usr/lib/python2.7/socket.py:223) 

fileno (/usr/lib/python2.7/SocketServer.py:438) 
meth (/usr/lib/python2.7/socket.py:223) 
... 

Tenga en cuenta que se requiere para ejecutar el BGF, que no está disponible en todas las máquinas servidor.

Cuestiones relacionadas