2010-08-12 15 views
9

Próbuję debugować program w języku Python i wstawiłem klasyczną linię "import pdb; pdb.set_trace()" w funkcji, tuż przed wywołaniem, które generuje ślad stosu. Jednak połączenie to wydaje się być ignorowane, tzn. Nic się nie dzieje i nie otrzymuję zachęty pdb.co może spowodować zignorowanie pdb.set_trace()?

W tym miejscu programu jest tylko jeden aktywny wątek. Nie wykryto żadnego małpowania modułu pdb.

Każda pomoc dotycząca tego, co może spowodować, że wywołanie metody set_trace zostanie zignorowane, jest mile widziane. Dzięki.

informacji Platforma: Debian Squeeze + python ekstrakt 2.6.5

Kod:

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

wyjściowa:

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

Czy możesz podać kod do odtworzenia tego? Czy z tego powodu działają połączenia 'print'? Czy próbowałeś 'pdb.pm()'? (http://docs.python.org/library/pdb.html#pdb.pm) – katrielalex

+0

Niestety nie jestem w stanie odtworzyć tego łatwo (w przeciwnym razie prawdopodobnie już bym go przybił). print works, pdb.pm() kończy się niepowodzeniem, ponieważ nie mam w tym miejscu śladu stosu (a wyjątek jest zjedzony później przez jakieś rozszerzenie C, więc nie mogę łatwo użyć pm() i python -i –

Odpowiedz

6

Być może masz trochę trudne kod, który manipuluje funkcję śledzenia w skomplikowany sposób? A może używasz akceleratora takiego jak psyco?

+0

Dzięki kilku bardzo dziwnym ustawieniom okazuje się, że jeden opcjonalny moduł w aplikacji nie mógł załadować rozszerzenie C (brak biblioteki współużytkowanej) i domyślna implementacja czystego Pythona, która wykorzystała psyco (http://psyco.sf.net) do przyspieszenia rzeczy. Psyco robi dziwne rzeczy z ramkami Pythona, a to sprawia, że ​​debuger Pythona jest bardzo zdezorientowany . –

0

Jesteś prawdopodobnie nie działa to stwierdzenie, ponieważ albo:

  • the stackt rasy nie jest tam, gdzie że był
  • wstawieniu połączenia set_trace w podobny ale niewłaściwym miejscu
  • używasz innego pliku .py niż ten, który pod redakcją
  • masz własną lokalną PDB .py złożyć że jest uzyskiwanie importowane zamiast jednej z stdlib
+0

Fajna próba, ale nie: I Dodałem kod w oryginalnej wiadomości, pokazując, że tak nie jest. –

+0

Czy podłączasz stdin z czegoś innego niż konsolę interaktywną? – PaulMcG

4

To zmarnuje czas wielu programistów Pythona. Dziś wieczorem dodałem siebie do ich szeregów. Szkoda, że ​​nie znalazłem tego postu, zanim spędziłem 2 godziny na odkrywaniu podobnego problemu z dużą biblioteką, której używam. Kolejne wyszukiwania w Google prawie nie rzucają światła na kwestię niekompatybilności. Problem powinien być bardziej widoczny dla użytkowników zaczynających od pdb.

głębi wnętrzności bibliotece byłem przywozu był plik, który zawierał następujący kod:

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

Co za piękny gest autora, który oczywiście zakłada nikogo używając swojego kodu, i który również zainstalował psyco, chciałby użyć narzędzia takiego jak pdb do debugowania ;-) Pamiętaj, że mógłbyś zapytać, skąd w ogóle mieli wiedzieć?

Chociaż badanie Problem stwierdzono, że użycie:

import pdb; pdb.set_trace() 

po import psyco jest właśnie przeszło; za ani rytm, ani rozum. Bardzo frustrujące.

Problem nie ma wpływu na debugowanie za pomocą PyDev lub, jak przypuszczam, innych bardziej zaawansowanych debugerów, co jest chyba powodem, dla którego nie mieści się on w zakresie początkowych wyszukiwań w Google.

Powiązane problemy