2011-09-30 26 views
9

Soy bastante nuevo con la depuración directamente con pdb y tengo algunos problemas para depurar mi aplicación Django. Esto es lo que estoy haciendo:PDB no se detendrá en el punto de interrupción

python -m pdb manage.py runserver 
(pdb) b core/views.py:22 
Breakpoint 2 at /Users/raphaelcruzeiro/Documents/Projects/pdb_test/core/views.py:22 
(Pdb) c 

Sin embargo, la ejecución pasa directamente a través del punto de interrupción. ¿Me estoy perdiendo algún comando? El manual no explica el establecimiento de un punto de ruptura más que esto.

+0

No hay excepción. El código simplemente se ejecuta como si no hubiera un depurador conectado – Raphael

+0

¿Puede por favor publicar un pequeño fragmento de código que demuestre este problema, no solo los mensajes de error? –

Respuesta

13

He pasado por el mismo problema.

Pruebe algo como python -m pdb ./manage.py runserver --nothreading --noreload 127.0.0.1:8080. Me solucionó el problema.

Parece que los puntos de interrupción con PDB son específicos de subprocesos, y las opciones --nothreading y --noreload son necesarias para evitar algunas bifurcaciones que pueden confundir a PDB. Esta es también la razón por la cual set_trace funciona, ya que se llama directamente dentro del hilo de interés.

+0

Cualquier idea sobre cómo hacer esto en otros modos (en particular, prueba)? --nothreading parece ser runserver-only. –

5

Normalmente prefiero set_trace() en la fuente misma, de esa manera el servidor dev se volverá a cargar cuando se agregue/elimine, y no es necesario detenerlo e iniciarlo nuevamente. Por ejemplo:.

def get_item(request): 
    import pdb; pdb.set_trace() 

Cuando se accede a la vista, PDB se iniciará en

+2

El problema con esta alternativa es que contamina el código fuente – Raphael

+0

Supongo que es una cuestión de opinión. De todos modos, es solo durante la depuración, por supuesto, esta declaración se elimina una vez que la sesión de depuración ha terminado (además, uno no necesita recordar dónde romper, o actualizar la línea de comandos si el caso fuente ha sido editado desde). – mkriheli

+0

Seguro, pero hay un gran truco, creo que esta afirmación será olvidada. Todo lo que quiero es configurar un punto de interrupción simple a través de pdb. No debería ser tan difícil y debería haber más documentación para la herramienta ... – Raphael

1

Cuando he visto este problema en el pasado, por lo general es porque alguien ha establecido el punto de interrupción en una línea que no es realmente conectado a una declaración de Python que se ejecuta. Por ejemplo, líneas en blanco, líneas de comentario, la parte incorrecta de una declaración de varias líneas.

1

Una cosa extraña que he notado es que el aviso de PDB repite la acción anterior cuando presionas repetidamente Enter. Además, si presiona enter mientras su programa se está ejecutando, PDB almacena la entrada y la aplica una vez que aparece el mensaje. En mi caso, estaba ejecutando un programa usando PDB c (ontinue). Mi programa estaba escribiendo mucha información de depuración para stdout durante la inicialización, así que presioné ingresar un par de veces para separar la salida ya escrita de la salida que se iba a escribir una vez que se desencadenó el punto de interrupción. Luego, cuando desencadené el punto de interrupción a través de una acción externa, PDB se detendría en el punto de interrupción pero luego aplicaría una "entrada en el buffer" que repetía la acción c (continua). Una vez que dejé de presionar Enter, todo comenzó a funcionar normalmente.

Esto puede sonar un poco extraño, y no he investigado mucho este tema, pero me solucionó el problema. Quizás ayuda a alguien más.

Cuestiones relacionadas