Puede adjuntar un depurador a un proceso de Python multiproceso, pero debe hacerlo en el nivel C. Para darle sentido a lo que sucede, necesita que el intérprete de Python se compile con símbolos. Si no tiene uno, es necesario descargar la fuente de python.org y construir por sí mismo:
./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy
Asegúrese de que su carga de trabajo se está ejecutando en esa versión del intérprete. A continuación, puede unirlo con GDB en cualquier momento. La gente de Python ha incluido una muestra ".gdbinit" en su directorio Misc, que tiene algunas macros útiles. Sin embargo, está roto para la depuración de subprocesos múltiples (!). Es necesario sustituir las líneas como esto
while $pc < Py_Main || $pc > Py_GetArgcArgv
con lo siguiente:
while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)
comandos de otro modo como pystack
no terminará en las roscas que no sean el hilo principal. Con esto en su lugar, puede hacer cosas como
gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach
y ver qué está pasando. Mas o menos.
Puede analizar los objetos con la macro "pyo". Chris has some examples en su blog.
Buena suerte.
(Shoutout para Dan's blog alguna información clave para mí, sobre todo la solución de roscado!)
El sitio es 404. Incluya los pasos aquí. – luckydonald