Как сбросить весь процесс Python для последующей проверки отладки? - программирование
Подтвердить что ты не робот

Как сбросить весь процесс Python для последующей проверки отладки?

У меня есть приложение Python в странном состоянии. Я не хочу заниматься активной отладкой процесса. Могу ли я сбросить его в файл и проверить его состояние позже? Я знаю, что позже я восстановил corefiles программ C в gdb, но я не знаю, как правильно изучить приложение Python из gdb.

(Это вариант моего вопроса о отладке memleaks в производственной системе.)

4b9b3361

Ответ 1

Нет встроенного способа, кроме прерывания (с os.abort(), в результате чего coredump, если позволяют ограничения ресурсов) - хотя вы, безусловно, можете создать свою собственную функцию "дампа", которая сбрасывает релевантную информацию о ваших данных около. Для этого нет готовых инструментов.

Что касается обработки основного файла процесса Python, Источник Python имеет файл gdbinit, содержащий полезные макросы. Это все еще намного больнее, чем каким-то образом проникающим в сам процесс (с помощью pdb или интерактивного интерпретатора), но это облегчает жизнь.

Ответ 2

Кто-то сказал выше, что нет встроенного способа выполнить это, но это не совсем так. Например, вы можете взглянуть на инструменты отладки пилонов. Когда есть исключение, обработчик исключений сохраняет трассировку стека и печатает URL-адрес на консоли, который можно использовать для извлечения сеанса отладки через HTTP.

Хотя они, вероятно, хранят эти сессии в памяти, они просто объекты python, поэтому вам нечего мешать вам травить дамп стека и восстанавливать его позже для проверки. Это будет означать некоторые изменения в приложении, но это должно быть возможно...

После некоторого исследования выясняется, что соответствующий код действительно поступает из Paste EvalException module. Вы должны быть в состоянии посмотреть там, чтобы выяснить, что вам нужно.

Ответ 3

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

Ответ 4

Также можно написать что-то, что вывело бы все данные из процесса, например.

  • Pickler, который игнорирует объекты, которые он не может определить (заменяя их чем-то другим) (например, Python: травление dict с некоторыми непривычными элементами)
  • Метод, который рекурсивно преобразует все в сериализуемый материал (например, this, за исключением того, что ему нужна проверка на бесконечно рекурсивные объекты и что-то делать с ними; также он может попробовать dir() и getattr() обрабатывать некоторые из неизвестных объектов, например классы расширения).

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

(также, интересно, было ли написано что-то более удобное, так как этот вопрос был задан первым)