2009-11-23 10 views
6

Muszę uruchomić starszą stronę Zope2 i mam z nią jakieś pretensje. Największym problemem jest to, że czasami blokuje się, działa przy 100% obciążeniu procesora i nie odpowiada już na żądania. Podczas gdy problem nie jest powtarzalny w sposób regularny, jedna strona zawierająca 3 dynamiczne wykresy wyzwala go czasami, więc podejrzewam, że jakiś stan wyścigu prowadzi do niekończącej się pętli lub utknięcia w ruchu.Pobierz stacktrace z utkniętego procesu pythonowego

Problem polega na tym, że jeszcze nie znalazłem sposobu na debugowanie tej rzeczy. W dziennikach Zope nie ma niczego i nic w dziennikach systemu. Próbowałem sugestii od this question, aby uzyskać stos stosu, ale jedynym sygnałem, który ma jakikolwiek wpływ jest SIGKILL.

Czy jest jeszcze jedna możliwość, aby dowiedzieć się, gdzie dokładnie jest proces, kiedy utknie?

Odpowiedz

0

Jeśli proces utknął w taki sposób, że żaden inny sygnał nie przechodzi, możesz rozważyć uruchomienie go z debuggera, zamiast próbować dołączyć do niego w czasie wykonywania.

Może się przydać również inna taktyka debugowania, np. Wyłączenie niektórych części kodu, aby znaleźć minimalny przypadek, w którym nadal można odtwarzać, aby zobaczyć, co powoduje to lepiej.

2

Zobacz moją odpowiedź na this SO question, użyj Products.signalstack. Rejestruje ten sam handler, co odpowiedź, którą już znalazłeś, w momencie rejestracji produktu. Być może to działa lepiej dla ciebie.

Jeśli nie, prawdopodobnie masz problem z wejściem/wyjściem na poziomie systemu operacyjnego, a jedyną nadzieją jest dołączenie gdb do procesu. Przeszukaj przepełnienie stosu w poszukiwaniu odpowiedzi gdb; tu jest mnóstwo informacji!

+1

+1 Również ** pstack ** i ** lsstack ** mogą być przydatne. –

0

po uruchomieniu przez chwilę w Internecie w kółko wreszcie trafiłem tutaj: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - opisuje szczegółowo, jak wszystkie elementy pasują do siebie. cytat z pieniędzy dla mnie był "gdb /usr/bin/python -p $ PID" - nazwa pliku wykonywalnego jest wymagana, aby gdb mógł znaleźć poprawne pliki informacyjne debugowania.

2

Możesz wydrukować ładne ślady stosu przy użyciu pyrasite.

Po pierwsze, musisz zainstalować gdb.

# Redhat, CentOS, etc 
$ yum install gdb 

# Ubuntu, Debian, etc 
$ apt-get update && apt-get install gdb 

Następnie zainstaluj pirasit.

$ pip install pyrasite 

Zastosowanie ps lub jakaś inna metoda, aby znaleźć identyfikator procesu dla zablokowanego procesu Pythona i uruchomić pyrasite-shell z nim.

# Assuming process ID is 12345 
$ pyrasite-shell 12345 

Powinieneś zobaczyć Pythona REPL. Uruchom następujące elementy w REPL, aby wyświetlić ścieżki stosów dla wszystkich wątków.

import sys, traceback 
for thread_id, frame in sys._current_frames().items(): 
    print 'Stack for thread {}'.format(thread_id) 
    traceback.print_stack(frame) 
    print '' 
Powiązane problemy