Saya memiliki modul yang saya gunakan untuk situasi seperti ini - di mana suatu proses akan berjalan untuk waktu yang lama tetapi kadang-kadang macet karena alasan yang tidak diketahui dan tidak dapat direproduksi. Agak aneh, dan hanya berfungsi di unix (memerlukan sinyal):
import code, traceback, signal
def debug(sig, frame):
"""Interrupt running process, and provide a python prompt for
interactive debugging."""
d={'_frame':frame} # Allow access to frame object.
d.update(frame.f_globals) # Unless shadowed by global
d.update(frame.f_locals)
i = code.InteractiveConsole(d)
message = "Signal received : entering python shell.\nTraceback:\n"
message += ''.join(traceback.format_stack(frame))
i.interact(message)
def listen():
signal.signal(signal.SIGUSR1, debug) # Register handler
Untuk menggunakannya, panggil saja fungsi listen () di beberapa titik ketika program Anda dijalankan (Anda bahkan bisa menempelkannya di site.py agar semua program python menggunakannya), dan biarkan dijalankan. Kapan saja, kirim proses sinyal SIGUSR1, menggunakan kill, atau dengan python:
os.kill(pid, signal.SIGUSR1)
Ini akan menyebabkan program memecah konsol python pada titik saat ini, menunjukkan jejak stack, dan membiarkan Anda memanipulasi variabel. Gunakan control-d (EOF) untuk terus berjalan (meskipun perhatikan bahwa Anda mungkin akan mengganggu I / O dll pada titik yang Anda beri sinyal, sehingga tidak sepenuhnya tidak mengganggu.
Saya punya skrip lain yang melakukan hal yang sama, kecuali itu berkomunikasi dengan proses yang berjalan melalui pipa (untuk memungkinkan proses debugging latar belakang dll). Agak besar untuk memposting di sini, tapi saya telah menambahkannya sebagai resep buku resep python .