2010-08-12 11 views
9

Estoy intentando depurar un programa Python e inserté una línea clásica 'import pdb; pdb.set_trace()' en una función, justo antes de una llamada que genera un seguimiento de la pila. Sin embargo, esa llamada parece ignorarse, es decir, no ocurre nada y no aparece un mensaje de pdb.¿qué puede hacer que pdb.set_trace() sea ignorado?

En ese punto del programa, solo hay un hilo activo. No se detectó parche mono del módulo pdb.

Cualquier ayuda sobre lo que podría causar que se ignore la llamada a set_trace es bienvenido. Gracias.

Plataforma Info: Debian Squeeze + extracto de Python 2.6.5

Código:

import threading 
print threading.active_count() 
import pdb 
print pdb 
pdb.set_trace() 
print "*****" 
root_resource.init_publisher() # before changing uid 

de salida:

<lots of stuff> 
1 
<module 'pdb' from '/usr/lib/python2.6/pdb.pyc'> 
***** 
<stack trace in init_publisher> 
+0

¿Puede proporcionar el código para reproducir esto? ¿Las llamadas 'print' funcionan desde allí? ¿Has probado 'pdb.pm()'? (http://docs.python.org/library/pdb.html#pdb.pm) – katrielalex

+0

Desafortunadamente no puedo reproducir esto fácilmente (de lo contrario, probablemente ya lo habría conseguido). imprime trabajos, pdb.pm() falla porque no tengo ningún seguimiento de pila en ese punto (y la excepción se come más tarde por alguna extensión C, así que no puedo usar fácilmente pm() y python -i –

Respuesta

6

Tal vez usted tiene un cierto código complicado que manipula la función de rastreo de una manera complicada? ¿O estás usando un acelerador como psyco?

+0

A través de una configuración muy extraña, resulta que un módulo opcional en la aplicación no se pudo cargar una extensión C (falta de biblioteca compartida) y una implementación de python pura que usó psyco (http://psyco.sf.net) para acelerar las cosas. Psyco hace cosas raras con marcos de python, y esto hace que el depurador de python sea muy confuso . –

0

usted está probablemente no ejecuta esa declaración, ya sea porque:

  • the stackt la raza no es donde se pensaba que era
  • que insertó la llamada set_trace en un lugar similar pero mal
  • está ejecutando un archivo .py diferente que la que editado
  • usted tiene su propio local de AP .PY presentar que está siendo importada en lugar de la una de la stdlib
+0

Buen intento, pero no: I He añadido un código en el mensaje original, que muestra que este no es el caso. –

+0

¿Está conectando stdin desde algo que no sea la consola interactiva? – PaulMcG

4

Esto va a perder el tiempo de un número de desarrolladores de Python. Esta noche me agregué a sus filas. Desearía haber encontrado esta publicación antes de pasar 2 horas descubriendo un problema similar con una gran biblioteca que estoy usando. Las búsquedas posteriores de Google apenas arrojaron mucha luz sobre el problema de pdb y pysco incompatibilidad. El problema debería ser más visible para los usuarios que comienzan con pdb.

En lo profundo de las entrañas de una biblioteca que importaba era un archivo que contenía el siguiente código:

try: 
    import psyco 
    psyco.bind(bdecode) 
    psyco.bind(bencode) 
except ImportError: 
    pass 

Qué linda gesto del autor, que obviamente supone que nadie usando su código, y quien también había instalado psyco, alguna vez quisiera utilizar una herramienta como pdb para depurarlo ;-) Ten en cuenta que podrías preguntar cómo querían saber de todos modos.

mientras explora el problema que encontraron que el uso de:

import pdb; pdb.set_trace() 

después de la importación de psyco, se acaba de pasar por encima; porque ni el ritmo ni la razón. Muy frustrante de hecho.

El problema no afecta a la depuración con PyDev o, supongo, a otros depuradores más avanzados, que es por eso que cae fuera del radar de las búsquedas iniciales de Google.

Cuestiones relacionadas