Проверьте, что делает выполняемый процесс: трассировка стека стека неинструментированной программы 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 применимы в этой ситуации:
-
pyrasite (это было для меня):
$ sudo pip install pyrasite $ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope $ sudo pyrasite 16262 dump_stacks.py # dumps stacks to stdout/stderr of the python program
- pydbattach - не удалось заставить это работать, но репозиторий https://github.com/albertz/pydbattach содержит указатель на другие инструменты
- pstack, как сообщается, печатает стек python в Solaris
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, см.
- https://t37.net/debug-a-running-python-process-without-printf.html и
- https://wiki.python.org/moin/DebuggingWithGdb
Там также отличная среда разработки 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, который недоступен на каждом сервере.