Отображение трассировки стека из запущенного приложения Python - PullRequest
320 голосов
/ 25 сентября 2008

У меня есть это приложение на Python, которое время от времени зависает, и я не могу найти где.

Есть ли какой-нибудь способ дать интерпретатору Python указание точного кода, который выполняется?

Какая-то трассировка стека на лету?

Похожие вопросы:

Ответы [ 25 ]

0 голосов
/ 18 апреля 2018

Я нахожусь в лагере GDB с расширениями Python. Следуйте https://wiki.python.org/moin/DebuggingWithGdb,, что означает

  1. dnf install gdb python-debuginfo или sudo apt-get install gdb python2.7-dbg
  2. gdb python <pid of running process>
  3. py-bt

Также рассмотрим info threads и thread apply all py-bt.

0 голосов
/ 28 апреля 2015

В случае, если вам нужно сделать это с помощью uWSGI, в него встроено Python Tracebacker , и это просто вопрос включения его в конфигурации (номер прикрепляется к имени для каждого работника):

py-tracebacker=/var/run/uwsgi/pytrace

Как только вы это сделаете, вы можете распечатать трассировку, просто подключившись к сокету:

uwsgi --connect-and-read /var/run/uwsgi/pytrace1
0 голосов
/ 25 сентября 2008

Я не знаю ничего похожего на ответ java на SIGQUIT , поэтому вам, возможно, придется встроить его в свое приложение. Может быть, вы могли бы создать сервер в другом потоке, который может получить трассировку стека при ответе на какое-либо сообщение?

0 голосов
/ 14 декабря 2014

В Python 3 pdb автоматически установит обработчик сигнала при первом использовании c (ont (inue)) в отладчике. Нажатие Control-C впоследствии приведет вас обратно туда. В Python 2 приведен однострочный текст, который должен работать даже в относительно старых версиях (проверено в 2.7, но я проверил исходники Python до 2.4 и все выглядело нормально):

import pdb, signal
signal.signal(signal.SIGINT, lambda sig, frame: pdb.Pdb().set_trace(frame))

pdb стоит изучить, если вы потратите какое-то время на отладку Python. Интерфейс немного туповат, но должен быть знаком любому, кто использовал подобные инструменты, такие как gdb.

0 голосов
/ 16 сентября 2009

используйте модуль проверки.

импорт проверяет помощь (inspect.stack) Справка по стеку функций в модуле inspect:

стека (контекст = 1) Возвращает список записей для стека над фреймом вызывающего.

Я считаю, что это действительно очень полезно.

...