2008-09-06 17 views

Respuesta

10

Sí, gdb es bueno para la depuración de nivel inferior.

Puede cambiar los hilos con el hilo comando.

por ejemplo

(gdb) thr 2 
[Switching to thread 2 (process 6159 thread 0x3f1b)] 
(gdb) backtrace 
.... 

También podría retirar depuradores específicos de Python como Winpdb o pydb. Ambas plataformas independientes.

0

¿En qué plataforma estás intentando esto? La mayoría de los depuradores le permiten conectarse a un proceso en ejecución mediante el uso de la identificación del proceso. Puede generar la identificación del proceso mediante el registro o usando algo como el Administrador de tareas. Una vez que se logra esto, será posible inspeccionar hilos individuales y sus pilas de llamadas.

EDIT: No tengo ninguna experiencia con GNU Debugger (GDB), que es multiplataforma, sin embargo encontré este link y puede comenzar en el camino correcto. Explica cómo agregar símbolos de depuración (útil para leer los rastreos de pila) y cómo indicar a gdb que se conecte a un proceso en ejecución de python.

3

Mi experiencia en la depuración de programas de subprocesos múltiples en PyDev (Eclipse en Windows XP) es que los subprocesos creados con thread.start_new_thread no se pudieron enganchar, pero se crearon subprocesos mediante threading. Thread podría engancharse. Espero que la información sea útil.

6

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!)

13

Uso Winpdb. Es un plataforma independiente gráfica de GPL Python depurador con soporte para la depuración remota a través de una red, múltiples hilos, modificación del espacio de nombres, depuración incorporada, comunicación encriptada y es hasta 20 veces más rápido que pdb.

Características:

  • licencia GPL. Winpdb es Software Libre.
  • Compatible con CPython 2.3 a 2.6 y Python 3000
  • Compatible con wxPython 2.6 a 2.8
  • Independiente de la plataforma, y ​​probado en Ubuntu Gutsy y Windows XP.
  • Interfaces de usuario: rpdb2 está basado en la consola, mientras que winpdb requiere wxPython 2.6 o posterior.

Screenshot http://winpdb.org/images/screenshot_winpdb_small.jpg

0

pdbinject le permite inyectar AP en un proceso de Python ya se está ejecutando.

El ejecutable pdbinject solo funciona bajo python2, pero también puede inyectarse en python3.

0

PyCharm IDE permite la conexión a un proceso en ejecución de Python desde la versión 4.0.

Here se describe cómo hacerlo.

+0

El sitio es 404. Incluya los pasos aquí. – luckydonald

Cuestiones relacionadas