2010-06-23 23 views
5

Rozwijam system plików FUSE z pythonem. Problem polega na tym, że po zamontowaniu systemu plików nie mam dostępu do stdin/stdout/stderr z mojego skryptu bezpieczników. Nie widzę niczego, nawet śladów. Próbuję uruchomić pdb w ten sposób:Uruchom pdb bez stdin/stdout używając FIFO

 

import pdb 
pdb.Pdb(None, open('pdb.in', 'r'), open('pdb.out', 'w')).set_trace() 
 

Wszystko działa dobrze, ale bardzo niewygodnie. Chcę zrobić pdb.in i pdb.out jako pliki fifo, ale nie wiem, jak podłączyć je poprawnie. Idealnie chciałbym wpisać polecenia i zobaczyć wyjście w jednym terminalu, ale będzie zadowolony nawet z dwóch terminali (w jednym komendach i zobacz wyjście w innym). Pytania:

1) Czy jest lepszy/inny sposób uruchomienia pdb bez stdin/stdout?

2) Jak mogę przekierować standardowe wejście do pdb.in fifo (Wszystko co wpisuję musi iść do pdb.in)? Jak mogę przekierować pdb.out na stdout (miałem dziwne błędy z "cat pdb.out", ale może czegoś nie rozumiem)

Odpowiedz

4

Przed uruchomieniem aplikacji Pythona

mkfifo pdb.in 
mkfifo pdb.out 

Wtedy kiedy PDB nazywa można komunikować się z nim za pomocą tych dwóch komend kot, jeden działa w tle

cat pdb.out & cat > pdb.in 

Note wsparcie readline nie praca (np. strzałka w górę)

1

Po prostu napotkałem podobny problem w znacznie prostszej aplikacji:

  • debugowanie prostego programu w języku Python, uruchamianego z wiersza poleceń, którego plik został podłączony do sys.stdin, co oznacza, że ​​nie ma możliwości użycia konsoli dla pdb.

Skończyło się na rozwiązaniu go przy użyciu wdb.

Szybki przegląd dla mojego przypadku użycia. W skorupkach, zainstalować zarówno serwer WDB i klienta WDB:

pip install wdb.server wdb 

teraz uruchomić serwer WDB z:

wdb.server.py 

Teraz można przejść do localhost: 1984 z przeglądarki i zobacz interfejs wyświetla wszystkie uruchomione programy Python. Powyższa strona projektu wdb zawiera instrukcje, co możesz zrobić, jeśli chcesz debugować dowolny z tych uruchomionych programów.

Co do programu pod kontrolą, można można debugować go od początku z:

wdb myscript.py --script=args < and/stdin/redirection 

Lub w kodzie, można zrobić:

import wdb; wdb.set_trace() 

ten pojawi interfejs w przeglądarce (jeśli jest lokalny) pokazujący śledzony program.

Lub możesz przejść do serwera wdb.server.py port, aby wyświetlić wszystkie trwające sesje debugowania u góry listy uruchomionych programów w języku Python, które można następnie użyć, aby uzyskać dostęp do określonej sesji debugowania, której potrzebujesz.

Zauważ, że polecenia do nawigowania kodu podczas śladu różnią się od standardowych pdb nich, na przykład, aby wejść do funkcji użyć zamiast s.s i krok nad użyć .n zamiast n. Zobacz wdb README w powyższym linku, aby uzyskać szczegółowe informacje.