2011-07-27 9 views
18

Czy istnieje sposób na Linuksie, aby sprawdzić, co robi uruchomiony proces demona Pythona? Oznacza to, bez oprzyrządowania kodu i bez jego zakończenia? Najlepiej chciałbym uzyskać nazwę modułu i numer linii, który jest aktualnie uruchomiony.Sprawdź, co działa uruchomiony proces: wydrukuj stos śledzenia niezaprogramowanego programu w języku Python

Konwencjonalne narzędzia do debugowania, takie jak strace, pstack i gdb, nie są zbyt użyteczne dla kodu Pythona. Większość ramek stosu zawiera tylko funkcje z kodu interpretera takiego jak PyEval_EvalFrameEx i PyEval_EvalCodeEx, nie daje to żadnej wskazówki, co do pliku .py, w którym wykonywane jest wykonanie.

Odpowiedz

2

winpdb pozwala attach to a running python process, ale aby to zrobić, należy rozpocząć proces Python w ten sposób:

rpdb2 -d -r script.py 

Następnie po ustawieniu hasła:

A password should be set to secure debugger client-server communication. 
Please type a password:mypassword 

można uruchomić winpdb do Plik> Dołącz do (lub Plik> Odłącz od) procesu.

6

Niektóre odpowiedzi w Showing the stack trace from a running Python application są stosowane w tej sytuacji:

+2

Pyrasite działa świetnie, dzięki za cynk! – johndodo

+0

no/proc/sys/kernel/yama istnieje? czemu – zephor

2

na systemach POSIX-owych, takich jak Linux, można użyć starego dobrego GDB, zobacz

Istnieje również doskonałe PyCharm IDE (darmowa wersja społeczności dostępna), która może dołączyć do ru Proces nning Python bezpośrednio z poziomu IDE, przy użyciu Pdb 4 pod maską, zobacz ten wpis blogu:

0

lptrace robi dokładnie to. Pozwala na dołączenie do działającego procesu Pythona i wyświetlenie aktualnie wykonywanych funkcji, takich jak strace dla wywołań systemowych. Można to nazwać tak:

[email protected]:/vagrant$ sudo python lptrace -p $YOUR_PID 
fileno (/usr/lib/python2.7/SocketServer.py:438) 
meth (/usr/lib/python2.7/socket.py:223) 

fileno (/usr/lib/python2.7/SocketServer.py:438) 
meth (/usr/lib/python2.7/socket.py:223) 
... 

Zauważ, że wymaga to gdb do uruchomienia, który nie jest dostępny na każdym serwerze.

Powiązane problemy