2010-08-12 4 views
9

J'essaie de déboguer un programme Python et j'ai inséré une ligne classique 'import pdb; pdb.set_trace()' dans une fonction, juste avant un appel qui génère une trace de pile. Cependant, cet appel semble être ignoré, c'est-à-dire que rien ne se passe et je ne reçois pas d'invite pdb.Qu'est-ce qui peut entraîner l'ignorance de pdb.set_trace()?

A ce stade du programme, il n'y a qu'un seul thread actif. Aucun correctif de singe du module pdb n'a été détecté.

Toute aide sur ce qui pourrait provoquer l'ignorance de l'appel de set_trace est la bienvenue. Merci.

information Plate-forme: Debian squeeze + python 2.6.5

code extrait:

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

sortie:

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

Pouvez-vous fournir du code pour reproduire ceci? Est-ce que les appels 'print' fonctionnent à partir de là? Avez-vous essayé 'pdb.pm()'? (http://docs.python.org/library/pdb.html#pdb.pm) – katrielalex

+0

Malheureusement, je ne suis pas capable de reproduire cela facilement (sinon je l'aurais probablement cloué maintenant). print fonctionne, pdb.pm() échoue parce que je n'ai pas trace de pile à ce point (et l'exception est mangée plus tard par une extension C, donc je ne peux pas facilement utiliser pm() et python -i –

Répondre

6

peut-être que vous avez un code délicat qui manipule la fonction trace d'une manière compliquée? Ou utilisez-vous un accélérateur comme psyco?

0

Vous n'êtes probablement pas en cours d'exécution cette déclaration, que ce soit parce que:

  • l'empilement course n'est pas où vous pensé qu'il était
  • vous avez inséré l'appel set_trace dans un similaire, mais mauvais endroit
  • vous utilisez un fichier .py différent que celui que vous avez modifié
  • vous avez votre propre pdb locale .PY fichier qui s'importation au lieu de celui de la stdlib
+0

Nice try, mais non: I –

+0

Par une configuration très étrange, il s'avère qu'un module optionnel de l'application n'a pas pu être chargé une extension C (missing shared lib) et une valeur par défaut sur une implémentation python pure qui utilisait psyco (http://psyco.sf.net) pour accélérer les choses Psyco fait des trucs bizarres avec des frames python, ce qui rend le débogueur python très confus . – PaulMcG

4

Cela va perdre le temps d'un nombre de développeurs Python. Ce soir, je me suis ajouté à leurs rangs. J'aurais aimé avoir trouvé cet article avant de passer 2 heures à découvrir un problème similaire avec une grande bibliothèque que j'utilise. Les recherches ultérieures sur Google n'ont guère éclairci la question de l'incompatibilité pdb et pysco. Le problème devrait être plus visible pour les utilisateurs débutant avec pdb.

profond dans les entrailles d'une bibliothèque que j'importateur était un fichier contenant le code suivant:

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

Quel beau geste de l'auteur, qui a pris de toute évidence n'utilisant leur code, et qui avait également installé psyco, aimerait toujours utiliser un outil tel que pdb pour le déboguer ;-) Attention, vous pourriez demander comment étaient-ils censés savoir de toute façon?

tout en explorant le problème que je trouve que l'utilisation de:

import pdb; pdb.set_trace() 

après l'importation de psyco, est tout simplement passé au-dessus; pour ni rythme ni raison. Très frustrant en effet.

Le problème n'affecte pas le débogage avec PyDev ou, je présume, d'autres débogueurs plus avancés, ce qui explique pourquoi il ne relève pas du radar des premières recherches Google.

Questions connexes