Как вывести состояние программы Python для последующей посмертной отладки?
Я работаю над сценарием Python, который использует mpi4py для распределения работников по кластеру, поэтому отладка отказавшего работника является сложной задачей, в которой сказано, что я видел много возможных способов сделать это, но у них всех есть недостатки, и я скептически отношусь ко всем их. Я также просто не понимаю, как что-то такое простое может быть таким сложным. Что плохого в том, что вы просто записываете состояние всех программ на диск и перезапускаете его, а затем вызываете python из pdb?
В любом случае, вот возможные варианты, которые я нашел, и их недостатки:
Канонические подходы:
фактический дамп ядра (через
os.abort()
): это в основном то, на что я надеялся, но это осложняется тем фактом, что расширения Python в gdb не кажутся такими уж хорошими, поскольку они дают вам только трассировку стека из того места, где вы вызываетеos.abort()
и им требуется отладочная версия Python, которая не поддерживается anaconda... Было бы замечательно, если бы это могло быть облегчено и pdbtraceback.extract_stack()
а такжеpdb.post_mortem(traceback=tb)
сначала это кажется привлекательным, так как кажется, что оно делает то, что я хочу, но потом я понял, что выгрузка трассировки (то есть с YAML) в файл и загрузка ее позже приводит к странным ошибкам и не обязательно может даже быть действительной в теориинормальная посмертная и удаленная отладка: это кажется идеальным, если вы можете заставить его работать, поскольку нет никаких сложностей с выгрузкой состояния программы на диск, но настройка сеанса удаленной отладки может быть сложной, если вы работаете в кластере где узлы не имеют доступа в интернет или имеют брандмауэры.
Решения сообщества (половина):
Похоже, я не единственный человек, который думает об этом, потому что сообщество предприняло ряд попыток создать эту функцию.
pydump: этот человек получает это, он сделал идеальную вещь по идеальным причинам, за исключением того, что... люди не использовали его, и поэтому они прекратили его разработку, и теперь это невероятно устарело, вероятно, больше головной боли, чем стоит
rpdb: еще один многообещающий кандидат, поскольку он рекламируется как способный к отладке отлаженных необработанных исключений, но опять-таки неразработанный в течение двух лет, что заставляет меня поверить, что это скорее проблема, чем стоит (разве кто-нибудь из вас до сих пор ее использует?)
Люди, изучающие эту проблему: - Как мне вылить весь процесс Python для последующей проверки отладки? - https://gist.github.com/toolness/d56c1aab317377d5d17a