Поймать приложение Python до его выхода - PullRequest
7 голосов
/ 29 марта 2010

У меня есть приложение на python, которое должно быть очень долгим, но иногда процесс просто исчезает, и я не знаю почему. Когда это происходит, ничего не регистрируется, поэтому я немного растерялся.

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

Ответы [ 3 ]

8 голосов
/ 29 марта 2010

atexit произносится "на выходе". В первый раз, когда я прочитал это имя функции, я прочитал его как «текст», что не имеет смысла почти .

3 голосов
/ 29 марта 2010

Я не уверен, что вы можете изменить исходный код, но если это так, вы можете попробовать это:

def debugexcept(type, value, tb):
    if hasattr(sys, 'ps1') or not (sys.stderr.isatty() and sys.stdin.isatty()) or type == SyntaxError:
        sys.__excepthook__(type, value, tb)
    else:
        import traceback, pdb
        traceback.print_exception(type, value, tb)
        print
        pdb.pm()


sys.excepthook = debugexcept

Если вы запускаете вашу программу на Python из командной строки, вы должны быть сброшены в отладчик Python, когда он умирает, предполагая, что произошло что-то «плохое», что вызвало исключение. Я предполагаю, что возможно stderr / stdout были захвачены, и вы не видите какого-то исключения?

т.е. искать что-то вроде:

sys.stdout = open('stdout.log', 'w')
sys.stderr = open('stderr.log', 'w')

Если процесс умирает без каких-либо исключений, то это может быть труднее найти. Один (очень сложный способ) для окон - использовать что-то вроде windbg для присоединения к процессу и установить точку останова в CRT в каком-то соответствующем месте.

Удачи!

3 голосов
/ 29 марта 2010

Вы можете попробовать запустить ваше приложение напрямую из консоли (cmd для windows, sh / bash / etc в unix), чтобы вы могли увидеть любую трассировку стека и т. Д., Напечатанную на консоли, когда процесс завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...