Как вывести состояние программы Python для последующей посмертной отладки? - PullRequest
0 голосов
/ 02 ноября 2018

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

В любом случае, вот возможные варианты, которые я нашел, и их недостатки:

Канонические подходы:

  1. фактический дамп ядра (через os.abort()): это в основном то, на что я надеялся, но это усложняется тем фактом, что расширения Python в gdb не кажутся такими уж хорошими, поскольку они дают вам трассировку стека только из того места, где вы вызываете os.abort(), и им требуется отладочная версия Python, которая не поддерживается anaconda ... Было бы здорово, если бы pdb также облегчил это

  2. traceback.extract_stack() и pdb.post_mortem(traceback=tb): сначала это снова кажется привлекательным, поскольку кажется, что он делает то, что я хочу, но потом я понял, что выгрузка трассировки (то есть с YAML) в файл и загрузка ее позже приводит к странным ошибкам и не обязательно может быть даже действительным в теории

  3. нормальная посмертная и удаленная отладка: это кажется идеальным, если вы можете заставить его работать, поскольку нет проблем с выгрузкой состояния программы на диск, но настройка сеанса удаленной отладки может быть сложной, если вы вы работаете в кластере, где узлы не имеют доступа к интернету или не имеют брандмауэров.

Решения для сообщества (половина):

Похоже, я не единственный, кто задумывается об этом, потому что сообщество предприняло ряд попыток создать эту функцию

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

  2. rpdb : еще один многообещающий кандидат, поскольку его рекламируют как способного отладить непопулярные исключения после вскрытия, но опять-таки неразвитого в течение двух лет, что заставляет меня думать, что это, скорее всего, больше проблем, чем сейчас. стоит (разве кто-нибудь из вас до сих пор его использует?)

Люди, изучающие эту проблему: - Как вывести весь процесс Python для последующей проверки отладки? - https://gist.github.com/toolness/d56c1aab317377d5d17a

...