Depurando una aplicación de Python que simplemente “cuelga”

Tengo una aplicación dirigida por eventos, escrita en python. Después de un tiempo (generalmente> 1 semana) parece que simplemente deja de responder a los eventos. Cuando esto sucede, simplemente presiono ctrl-C y vuelvo a ejecutar y todo está bien de nuevo. Sin embargo, es un poco molesto que esto siga sucediendo y no tengo idea de lo que lo está causando. ¿Hay alguna forma en que pueda ejecutar mi aplicación que cuando esto ocurre y la aplicación ya no acepta conexiones, puedo ingresar a un depurador y ver qué está haciendo y por qué no está tomando conexiones?

He usado pdb antes, pero la forma en que lo he usado ( if condition: pdb.set_trace() ) no se aplica aquí realmente, porque no tengo idea de lo que está haciendo en el código cuando falla. Mi situación ideal sería en lugar de Ctrl-C, tal vez presioné Ctrl-somethingelse y eso hace que se detenga y caiga en el depurador. ¿Es algo tan fácil de hacer?

Disparar pdb en tu caso probablemente no sea simple. Sin embargo, cada vez que necesito depurar dichos lockings, inspecciono una “instantánea” de las trazas de todos los subprocesos del proceso, utilizando la función dumpstacks() .

Puede usar un temporizador para llamarlo periódicamente e imprimir la salida en un archivo de registro, y referirse a él cuando note el locking, o utilizar algún mecanismo RPC (por ejemplo, señales) para activar la llamada de función en su proceso a pedido. Normalmente hago esto último, porque los procesos en mi sistema ya escuchan tales solicitudes RPC (usando rpyc).