2010-08-12 7 views
9

Ich versuche, ein Python-Programm zu debuggen, und ich habe eine klassische 'import pdb; pdb.set_trace()' Zeile in eine Funktion eingefügt, kurz vor einem Aufruf, der einen Stack-Trace generiert. Dieser Aufruf scheint jedoch ignoriert zu werden, d. H. Es passiert nichts und ich erhalte keine pdb-Eingabeaufforderung.was kann dazu führen, dass pdb.set_trace() ignoriert wird?

An diesem Punkt des Programms gibt es nur einen aktiven Thread. Es wurde kein Affe-Patching des pdb-Moduls festgestellt.

Jede Hilfe, die dazu führen könnte, dass der Aufruf von set_trace ignoriert wird, ist willkommen. Vielen Dank.

Plattform Info: Debian Squeeze + Python 2.6.5

-Code-Extrakt:

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

Ausgang:

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

Können Sie Code bereitstellen, um dies zu reproduzieren? Funktionieren 'print' Anrufe von dort? Hast du 'pdb.pm()' ausprobiert? (http://docs.python.org/library/pdb.html#pdb.pm) – katrielalex

+0

Leider kann ich das nicht einfach reproduzieren (sonst hätte ich es wahrscheinlich schon längst geschafft). Drucken funktioniert, pdb.pm() schlägt fehl, da ich zu diesem Zeitpunkt keine Stack-Trace habe (und die Ausnahme später von einer C-Erweiterung gegessen wird, kann ich nicht einfach pm() und python -i –

Antwort

6

Vielleicht importiert wird immer Sie etwas heikel Code haben, der die Trace-Funktion in einer komplizierten Art und Weise manipuliert? Oder benutzen Sie einen Beschleuniger wie Psyco?

+0

Durch einige sehr seltsame Setup, stellt sich heraus, ein optionales Modul in der Anwendung konnte nicht geladen werden eine C-Erweiterung (fehlende shared lib) und eine Python-Implementierung, die psyco (http://psyco.sf.net) verwendete, um die Dinge zu beschleunigen, führte dazu, dass Psyco seltsame Sachen mit Python-Frames macht, was den Python-Debugger sehr verwirrt . –

0

Sie sind wahrscheinlich nicht, dass die Anweisung ausgeführt wird, sei es, weil:

  • der Stapelt Rennen ist nicht, wo Sie dachte, es war
  • Sie den set_trace Anruf in einem ähnlich, aber falschen Stelle eingefügt
  • Sie eine andere .py Datei laufen als das von Ihnen bearbeitet
  • Sie Ihre eigenen lokalen pdb haben Py Datei, die anstelle von der einen von der stdlib
+0

Nice versuchen, aber nein: I habe einen Code in der ursprünglichen Nachricht hinzugefügt, der zeigt, dass dies nicht der Fall ist –

+0

Sie leiten Standard von etwas anderem als der interaktiven Konsole? – PaulMcG

4

Dies wird die Zeit einer Reihe von Python-Entwickler verschwenden. Heute Abend habe ich mich in ihre Reihen aufgenommen. Ich wünschte, ich hätte diesen Beitrag gefunden, bevor ich 2 Stunden lang ein ähnliches Problem mit einer großen Bibliothek entdeckte, die ich benutze. Nachfolgende Google-Suchen werfen kaum Licht auf das Problem der Inkompatibilität. Das Problem sollte für Benutzer, die mit pdb beginnen, besser sichtbar sein.

Tief in den Eingeweiden einer Bibliothek, die ich war, den Import eine Datei, die den folgenden Code enthalten:

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

Was für eine schöne Geste des Autors, der offenbar niemand ihren Code angenommen, und wer auch mal psyco installiert hat, würde gerne mal ein werkzeug wie pdb benutzen um es zu debuggen ;-) Aber du könntest dich fragen, wie sie das überhaupt wissen wollten?

Während das Problem zu erforschen, fand ich, dass die Nutzung von:

import pdb; pdb.set_trace() 

nach der Import von psyco wird nur übergegangen; weder für Rhytmus noch für Vernunft. Sehr frustrierend.

Das Problem hat keine Auswirkungen auf Debugging mit PyDev oder, ich nehme an, andere fortgeschrittenere Debugger, die ich denke, warum es außerhalb des Radar der ersten Google-Suchen fällt.

Verwandte Themen