Способ заглянуть в программу Python, запущенную прямо сейчас
Можно ли найти какую-либо информацию о том, что сейчас делает программа на Python, не прерывая ее?
Кроме того, если это невозможно, все равно есть ли сбой работающей программы на Python, чтобы я мог хотя бы получить трассировку стека (используя PyDev в Ubuntu)?
Я знаю, что я должен был использовать журналы или запустить его в режиме отладки или вставить оператор для запуска отладчика...
Смежные вопросы
- Получение трассировки стека из работающей программы Python - Очень похожий, но более общий, этот вопрос предназначался для отладки программы Python, которая выполняется прямо сейчас.
7 ответов
Если у вас есть работающий Python, который не был создан с каким-либо механизмом трассировки или протоколирования, и вы хотите посмотреть, что он делает внутри, тогда есть два варианта:
На Solaris или Mac, если вы используете системный Python, используйте dtrace
используйте gdb для подключения к работающему процессу Python,
Если вы разместите
import code
code.interact(local=locals())
в любой точке вашего скрипта python будет создавать экземпляр оболочки python именно в той точке, которая имеет доступ ко всему состоянию скрипта в этой точке. ^D выходит из оболочки и возобновляет выполнение после этой точки.
Вы даже можете изменить состояние в этой точке из оболочки, вызова функций и т. Д.
Чтобы "вывести из строя" программу на python с трассировкой стека, вы можете отправить ее SIGINT, то есть, если вы не перехватите ее или не перехватите KeyboardInterrupt (python устанавливает обработчик SIGINT по умолчанию, который вызывает KeyboardInterrupt).
Что касается отладки, разве PyDev не имеет встроенной поддержки отладки (через pdb)?
Лично я предпочитаю ipdb. Это pdb с добавленным IPython совершенством. Кажется, это скорее интерактивный интерпретатор Python с несколькими ярлыками для функций отладки.
Вы можете использовать lptrace для этого. Это как strace
для программ на Python - позволяет подключаться к работающему процессу Python и печатать все вызовы функций, которые он выполняет.
Установите обработчик сигнала, который устанавливает функцию трассировки с sys.settrace()
который печатает трассировку и очищает очищает функцию трассировки. Это позволит вам в любой момент увидеть, где находится ваша программа, не прерывая ее. Обратите внимание, что сигнал обрабатывается после каждого sys.getcheckinterval()
инструкции по питону
Если вас устраивает сбой, вставка "1/0" создаст быструю и грязную точку останова с полной обратной трассировкой!