punto de interrupción condicional usando pdb

Parece que me estoy perdiendo algo extremadamente simple, estoy intentando establecer un punto de interrupción en mi código de Python usando:

if(some condition): pdb.set_trace() 

Mi error en el código viene después de un gran número de iteraciones … difícil de depurar con la impresión, etc. Puedo imprimir cosas cuando llega la condición, pero me gustaría configurar brk-pt.

–EDITAR–

Código actual:

 import pdb if (node_num == 16): print node_num pdb.set_trace() 

Related of "punto de interrupción condicional usando pdb"

No estoy seguro de por qué su código no funciona, pero lo que puede hacer es en su máquina local, cree un nuevo archivo para su ejemplo mínimo para ver si puede hacer lo que quiere hacer

 import pdb for node_num in range(50): if node_num == 16: print(node_num) pdb.set_trace() 

Ahora ejecutándolo:

 16 > /tmp/tmp.py(3)() -> for node_num in range(50): (Pdb) p node_num 16 

Como puede ver, esto funcionó como estaba previsto en este ejemplo trivial, depende de usted averiguar cómo adaptar esto a su código y / o qué más hizo a su código / entorno que impidió que apareciera ese aviso. .

Alternativamente, si tiene una función que se está muriendo en una excepción y quiere saber la línea exacta que la causó, debe usar post_mortem en post_mortem lugar. Envuelva la sección problemática del código con este

 try: problem_function() except Exception: # or the specific exception type thrown pdb.post_mortem() raise 

Lo que post_mortem haría es volcar un punto de ruptura justo en el punto donde ocurrió la excepción (específicamente en ese marco de stack), por lo que esto permite que todos los valores sean inspeccionados y luego le permitan continuar con la ejecución. Sin embargo, también puse un aumento al final para permitir que la excepción continúe de forma normal, y esto se pretende que la ejecución no se post_mortem normalmente desde el punto en que muere, sino que simplemente se detiene en ese bloque de manejo de excepciones debido a la llamada post_mortem . También podría rendirse después de inspeccionar lo que salió mal.

Veo que encontraste tu solución Sanjay. Pero para aquellos que llegaron aquí buscando un medio para establecer un punto de interrupción condicional con pdb, lea:

En lugar de condiciones difíciles de encoding, como if node_num == 16: ejecute pdb en modo interactivo. Código de muestra:

 import pdb for node_num in range(50): do_something(node_num) ... 

En el shell, inicie el script en modo de depuración utilizando -m pdb :

 [rick@rolled ~]$ python -m pdb abc.py > /home/dcadm/abc.py(1)() -> import pdb (Pdb) l 1 -> import pdb 2 3 for node_num in range(50) : 4 foo = 2**node_num [EOF] (Pdb) b 4, node_num > 4 Breakpoint 1 at /home/dcadm/abc.py:4 (Pdb) c > /home/dcadm/abc.py(4)() -> foo = 2**node_num (Pdb) node_num 5 (Pdb) 

El comando pdb shell b 4, node_num > 4 interrumpe en la línea 4 cuando node_num es mayor que 4.

Para usar puntos de interrupción condicionales en pdb , puedes hacer lo siguiente:

b (reak) [([nombre de archivo:] lineno | función) [, condición]]

https://docs.python.org/3/library/pdb.html#pdbcommand-break

Por ejemplo, estoy ejecutando un código de prueba que itera sobre las vistas de django. Quiero romper solo cuando se alcanza la vista particular en la que estoy interesado:

b C: \ Users \ powlo \ project \ tests \ TestCase.py: 350, view.view_name == ‘app.views.export’