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

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

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

Ответ 1

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

Ответ 2

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) процесс.

Ответ 3

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

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

Ответ 4

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

[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)
...

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