2009-10-28 8 views
13

¿Es posible encontrar cualquier información sobre qué está ejecutando ahora un programa de Python sin interrumpirlo?Método para echar un vistazo a un programa de Python que se ejecuta ahora mismo

Además, si no es posible, ¿hay alguna manera de bloquear un programa en ejecución de Python para que al menos pueda obtener un stacktrace (usando PyDev en Ubuntu)?

Sé que debería haber utilizado los registros o ejecutar en modo de depuración o se inserta una instrucción para ejecutar el depurador ...

preguntas relacionadas

+3

Para aclarar: estás hablando de un programa python que se está ejecutando * en este momento *, y necesitas ver qué está haciendo sin reiniciarlo, ¿no? – itsadok

+1

Además, ¿qué sistema operativo es este? – itsadok

+1

Se llama * depurador *. Pydev tiene una, presione f11 ... –

Respuesta

8

Si usted tiene un pitón en marcha, que no fue construido con cualquier tipo de rastro o mecanismo de registro, y usted quiere ver lo que está haciendo internamente, entonces dos opciones son:

+0

Dtrace es increíble, desafortunadamente estoy en Ubuntu – Casebash

4

Para un programa de Python "accidente" con un StackTrace lo puede enviar SIGINT, es decir a menos que atraparla o coger KeyboardInterrupt (pitón instala un controlador de SIGINT por defecto, que eleva KeyboardInterrupt).

En cuanto a la depuración, ¿no tiene PyDev soporte de depuración incorporado (a través de pdb)?

+0

Una vez más, el programa se está ejecutando ahora mismo – Casebash

+0

lo que significa que obtiene la identificación del proceso y 'kill -INT $ pid'. Eso lo matará, pero debería darte un rastro de pila. Asume que tienes alguna forma de ver la salida de stderr. –

27

Si coloca

import code 
code.interact(local=locals()) 

en cualquier punto de la secuencia de comandos, Python crear instancias de una concha pitón exactamente en ese punto que tiene acceso a todo en el estado de la secuencia de comandos en ese punto.^D sale del shell y reanuda la ejecución más allá de ese punto.

También es posible modificar el estado en ese punto de la cáscara, las funciones de llamada, etc.

+0

Agradable. No sabía que (+1) – shylent

+2

Interesante. ¿Cómo difiere esto de la importación pdb? pdb.set_trace()? –

+1

pdb le da paso a StepOut, etc., y es su propio shell especial que debe aprender a usar y que tiene control de paso sobre la ejecución de todo el programa. code.interact() es exactamente el shell python normal que todos conocemos y amamos. pdb es mucho más poderoso y, a menudo exagerado y difícil de usar a menos que lo conozca bien. –

0

Instalar manejador de señales que establece una función de rastreo con sys.settrace() que imprime rastreo y borra borra función de rastreo. Esto le permitirá ver dónde está su programa en cualquier momento sin interrumpirlo. Tenga en cuenta que esa señal se maneja después de cada sys.getcheckinterval() instrucciones de python.

+0

O haga que el manejador de señal configure/desactive la traza, para que no exista una sobrecarga para el caso normal. –

+0

Buen punto, he actualizado la respuesta. –

2

Personalmente, prefiero ipdb. Es pdb con bondad añadida IPython. Parece ser más un intérprete interactivo de Python con algunos accesos directos para las funciones de depuración.

0

Si usted es feliz con un accidente, la inserción de "1/0 "creará un punto de ruptura rápido y sucio, con una traza inversa completa!

0

Puede usar lptrace para eso. Es como strace para programas de Python: le permite conectarse a un proceso en ejecución de Python e imprime cada llamada de función que realiza.

Cuestiones relacionadas