отладка: как проверить, где висит моя программа на Python? - PullRequest
4 голосов
/ 28 февраля 2011

Довольно большая программа на Python, которую я пишу, запускается, но иногда, после запуска в течение нескольких минут или часов, в непросто воспроизводимый момент зависает и ничего не выводит на экран.

Я понятия не имею, что он делает в данный момент и в какой части кода это.

Как я могу запустить это в отладчике или что-то еще, чтобы увидеть, какие строки кода программа выполняет в момент зависания?

Слишком большой, чтобы помещать «печатные» выражения повсюду.

Я сделал:

python -m trace --trace /usr/local/bin/my_program.py

но это дает мне столько информации, что я ничего не вижу, просто миллионы строк прокручиваются на экране.

Лучше всего было бы, если бы я мог послать какой-нибудь сигнал программе с помощью kill -SIGUSR1 или чего-то еще, и в этот момент программа переместится в отладчик и покажет мне строку, на которой она остановилась, и, возможно, позволит мне пройти через программа тогда.

Я пробовал:

pdb usr/local/bin/my_program.py

и затем:

(Pdb) cont

но что мне делать, чтобы увидеть, где я нахожусь, когда он висит? Это не исключение и не исключение, просто кажется, что оно чего-то ждет, возможно, в бесконечном цикле.

Еще одна деталь: когда программа зависает, и я нажимаю ^ C, а затем (не уверен, если это необходимо), программа продолжает работать нормально (без каких-либо исключений и без подсказок на экране, почему она остановилась) ,

Ответы [ 3 ]

5 голосов
/ 28 февраля 2011

Это может быть полезно для вас. Я обычно делаю

>>> import pdb
>>> import program2debug
>>> pdb.run('program2debug.test()')

Я обычно добавляю опцию -v в свои программы, которая позволяет использовать множество операторов печати, объясняющих, что яделаю подробно.Когда вы будете писать программу в будущем, подумайте о том, чтобы сделать то же самое, прежде чем она получит тысячи строк.

0 голосов
/ 10 марта 2011

Ни одна программа не может быть настолько большой, чтобы можно было печатать операторы повсюду. Вы должны прочитать о модуле logging и вставить много операторов logging.debug(). Это просто лучшая форма оператора печати, который выводится в файл и может быть легко отключен в производственном программном обеспечении. Но спустя годы, когда вам нужно будет изменить код, вы можете легко включить его снова и воспользоваться преимуществами понимания оригинального программиста.

0 голосов
/ 28 февраля 2011

Вы можете попробовать запустить его в режиме отладки в IDE, например, pydev (eclipse) или pycharm. Вы можете прервать программу в любой момент и добраться до ее текущей точки выполнения.

...