Проверьте, что делает выполняемый процесс: трассировка стека стека неинструментированной программы Python

18 Björn Lindqvist [2011-07-27 21:11:00]

Есть ли способ в Linux проверить, что делает текущий процесс-демон Python? То есть, не используя код и не прерывая его? Предпочтительно, я хотел бы получить имя модуля и номер строки в нем, который в настоящее время запущен.

Обычные инструменты отладки, такие как strace, pstack и gdb, не очень полезны для кода Python. Большинство фреймов стека содержат только функции из кода интерпретатора, такие как PyEval_EvalFrameEx и PyEval_EvalCodeEx, это не дает вам никакого намека на то, что в .py файле выполняется выполнение.

python debugging stack-trace process daemon


4 ответа


6 Nickolay [2015-04-26 21:40:00]

Некоторые ответы в Отображение трассировки стека из запущенного приложения Python применимы в этой ситуации:


2 unutbu [2011-07-27 21:43:00]

winpdb позволяет присоединяться к запущенному процессу python, но для этого вы должны запустить процесс python таким образом:

 rpdb2 -d -r script.py

Затем, установив пароль:

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

вы можете запустить winpdb в File > Attach to (или File > Detach from) процесс.


2 Gregor [2015-08-10 18:57:00]

на POSIX-системах, таких как Linux, вы можете использовать старый добрый GDB, см.

Там также отличная среда разработки PyCharm (бесплатная версия сообщества), которая может подключаться к запущенному процессу Python прямо из среды IDE, используя Pdb 4 под капотом, см. эту запись в блоге:


0 Karim H [2017-02-24 04:15:00]

lptrace делает именно это. Он позволяет подключаться к запущенному процессу Python и отображать выполняемые в данный момент функции, например strace для системных вызовов. Вы можете назвать это следующим образом:

vagrant@precise32:/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)
...

Обратите внимание, что для его запуска требуется gdb, который недоступен на каждом сервере.