2011-01-28 4 views
5

Czy jest jakiś debugger, który pozwala zmienić kod Pythona podczas debugowania?zmiana kodu Pythona w debugerze

Innymi słowy: występuje wyjątek czasu pracy, debugger zatrzymuje się, zmieniam kod w dowolny sposób i mówię programowi, aby kontynuował.

Mam świadomość, że problemów z tym podejściem, tak że odniesienia do funkcji nadal wskazują na stare definicje, jeśli przedefiniować funkcję w locie, i tak dalej. Nie przeszkadza mi to, ponieważ chcę po prostu dokonać drobnych poprawek w bardzo prostych okolicznościach.

Z drugiej strony, interesuje mnie również to, czy teoretycznie możliwe jest zezwolenie na zmiany w kodzie Pythona bez napotkania tych problemów: np. Zaktualizować wszystkie odniesienia do obiektów, które się zmieniły itp. Jestem prawie Na pewno odpowiedź na drugie pytanie brzmi: nie, ale jeśli się mylę, chciałbym to wiedzieć.

EDYCJA: Jeśli mój cel (zmiana kodu interaktywnie, gdy wystąpił wyjątek, a następnie kontynuowanie wykonywania), jest możliwy do osiągnięcia bez debuggera - to też byłoby dobre. Nie potrzebuję korzystać z debuggera.

+2

dlaczego potrzebujemy debugger? Używam Pythona już od jakiegoś czasu i nigdy nie czułem potrzeby jednego .. –

+2

@Gabi: ponieważ debugger pozwala przeglądać zmienne, aby zobaczyć ich wartości, wykonywać funkcje w locie i sprawdzać, czy kod jest uruchamiany, a nie niż poleganie na instrukcjach drukowania. Jeśli rozwiązujesz skomplikowaną logikę lub duże ilości danych, debugery stają się nieocenione. – Jordan

+1

@Jordan: w ciągu ostatnich 30 lat użyłem debuggera, aby znaleźć ślad stosu w pliku podstawowym C. Wszystkie rzeczy, które sugerujesz, mogą być wykonane na inne sposoby. Debugger nie jest tak naprawdę "nieoceniony". To tylko preferencja. –

Odpowiedz

1

Ponieważ możesz w dowolnej chwili zmienić zawartość zwykłych zajęć, nie musisz aktualizować odniesień do obiektów: zaktualizujesz klasę __dict__ nowymi metodami i innymi atrybutami.

Problem dotyczy odwołań do funkcji: nie można zaktualizować funkcji bez zmiany jej tożsamości. Możesz korzystać z funkcji proxy, które zawsze wyszukują prawdziwe funkcje po nazwie, a w każdej chwili zmieniasz rzeczywiste funkcje. Inaczej planujesz swój kod, aby długo nie zapisywał referencji funkcji; gdy funkcja zostanie zaktualizowana, zostanie wkrótce sprawdzona po nazwie, ale stare referencje, które gdzieś przeszły, będą kontynuowane przez nieco dłużej.

Takie łatanie miałoby sens w długo działającym systemie, gdy chcesz go uaktualnić bez poważnego przestoju: zatrzymujesz go na chwilę, aby uaktualnić kilka klas i funkcji konsekwentnie i bez wstrzymywania. AFAIK Erlang robi swoje bieżące aktualizacje w podobny sposób.

+0

+1 Nie wiedziałem, że funkcji nie można zmienić bez zmiany tożsamości. – max

1

Tak, pdb może to zrobić. Chociaż musisz dokonać edycji w innym edytorze, a zmiany zostaną zignorowane do czasu ponownego uruchomienia.

Ale ponieważ wszystko, co chcesz zrobić, to niewielkie zmiany, to nie jest problem. Ale nie można zmienić działającego kodu (z wyjątkiem ponownego ładowania, patrz poniżej), ponieważ zmiana kodu oznaczałaby kod, a stan nie był zsynchronizowany.

Co można zrobić z debugerem, przetestuj zmianę, którą chcesz wykonać. Możesz wkleić kod, aby go zmienić, a tym samym sprawdzić, czy jest poprawny bez ponownego uruchamiania całego programu. Ale w takim przypadku nie edytujesz pliku.

(W niektórych szczególnych przypadkach może być w stanie uciec z nie ponowne uruchomienie przez ostrożnego korzystania z „reload()”, ale to chyba nie warte wysiłku.)

1

Można zaktualizować kod w biegu proces pyton z xreload:

http://svn.python.org/projects/sandbox/trunk/xreload/xreload.py

Istnieje wiele ograniczeń, są one wymienione w górnej części pliku. Nie jestem pewien, czy to zajmie się sprawą, którą chcesz - czy rzeczywiście chcesz zapobiec rozprzestrzenianiu się wyjątku? To wymaga więcej niż aktualizacja uruchomionego programu.

+0

Dziękuję - to ciekawe narzędzie, ale zdaję sobie sprawę, że prawdopodobnie nie warto tego robić z powodu złożoności. – max

0

czy jest to teoretycznie możliwe, aby umożliwić zmiany w kodzie Pythona

Tak. Możliwe jest aktualizowanie obiektu kodu "w locie". Nic w VM Pythona wydaje się temu zapobiegać. Nie ma stałej weryfikacji sum kontrolnych ani czegokolwiek.

jakoś zaktualizować wszystkie odwołania do obiektów, które zmieniło

To nie ma sensu. Po zmianie definicji metody na poziomie klasy "aktualizacja" wszystkich odniesień nie jest nawet konieczna ani sensowna. Kod zostanie zmieniony w jedynym miejscu, w którym istnieje.

Dlatego właśnie debuggery są złe. Wydają się prowadzić do mętnego, niejasnego myślenia. Zbyt duże myślenie o debuggerze oznacza zbyt małe myślenie o rzeczywistym problemie.

TDD to zdecydowanie lepsza inwestycja. Małe, łatwe w zarządzaniu testy jednostkowe działają szybko i zapewniają trwały dowód, że wszystko działa.

http://en.wikipedia.org/wiki/Test-driven_development