У меня есть приложение Python, которое, как предполагается, очень долговечно, но иногда процесс просто исчезает, и я не знаю почему. Ничто не зарегистрировано, когда это происходит, таким образом, я в чем-то вроде потери.
Есть ли некоторый путь в коде, в котором я могу сцепиться с событием выхода или некоторым другим способом заставить часть моего кода работать непосредственно перед выходами процесса? Я хотел бы зарегистрировать состояние структур памяти для лучше понимания то, что продолжается.
atexit
произносится как «при выходе». В первый раз, когда я прочитал это имя функции, я прочитал его как «тексит», что не имеет большого смысла в почти .
Вы можете попробовать запустить приложение прямо из консоли (cmd в Windows, sh / bash / и т. Д. В unix), чтобы увидеть трассировку стека, и т.д., выводимые на консоль, когда процесс умирает.
Я не уверен, можете ли вы изменить исходный код, но если да, вы можете попробовать следующее:
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')
Если процесс умирает без исключения, то это может быть труднее найти. Один (очень сложный способ) для Windows - это использовать что-то вроде windbg, чтобы подключиться к процессу и установить точку останова в CRT в каком-то подходящем месте.
Удачи!