Как вывести весь процесс Python для последующей проверки отладки?
У меня есть приложение Python в странном состоянии. Я не хочу делать живую отладку процесса. Могу ли я вывести его в файл и проверить его состояние позже? Я знаю, что позже я восстановил основные файлы программ на C в gdb, но я не знаю, как изучить приложение Python полезным способом из gdb.
(Это вариант моего вопроса об отладке memleaks в производственной системе.)
5 ответов
Не существует встроенного способа, кроме прерывания (с помощью os.abort(), вызывающего coredump, если позволяют ограничения по ресурсам) - хотя вы, безусловно, можете создать свою собственную функцию "dump", которая выводит релевантную информацию о данных, которые вас интересуют. Для этого нет готовых инструментов.
Что касается обработки corefile процесса Python, исходный код Python имеет файл gdbinit, который содержит полезные макросы. Это все еще намного более болезненно, чем каким-либо образом вмешиваться в сам процесс (с помощью pdb или интерактивного переводчика), но это немного облегчает жизнь.
Если вас интересует только сохранение объекта трассировки (это все, что вам нужно для запуска сеанса отладки), вы можете использовать отладчик (форк pydump). Он работает с последними версиями Python и имеет интеграцию с IPython/Jupyter.
Если вы хотите сохранить всю сессию, посмотрите на укроп . Оно имеетdump_session
, иload_session
функции.
Вот два других соответствующих проекта:
Если вы ищете решение, не зависящее от языка, вы хотите создать файл дампа ядра. Вот пример с Python.
Кто-то выше сказал, что нет встроенного способа выполнить это, но это не совсем так. Например, вы можете взглянуть на инструменты отладки пилонов. Когда возникает исключение, обработчик исключений сохраняет трассировку стека и печатает URL-адрес на консоли, который можно использовать для получения сеанса отладки по HTTP.
Хотя они, вероятно, хранят эти сеансы в памяти, они являются просто объектами Python, поэтому ничто не помешает вам выбрать дамп стека и восстановить его позже для проверки. Это будет означать некоторые изменения в приложении, но это должно быть возможно...
После некоторых исследований выясняется, что соответствующий код фактически поступает из модуля EvalException от Paste. Вы должны быть в состоянии найти там, чтобы выяснить, что вам нужно.
Также возможно написать что-то, что вывело бы все данные из процесса, например
- Средство выбора, которое игнорирует объекты, которые оно не может травить (заменяя их чем-то другим) (например, Python: "Выбираем диктовку из некоторых непробиваемых предметов")
- Метод, который рекурсивно преобразует все в сериализуемые вещи (например, этот, за исключением того, что ему нужна проверка на бесконечно рекурсивные объекты и что-то с ними делать; также он может попытаться
dir()
а такжеgetattr()
обрабатывать некоторые неизвестные объекты, например, классы расширения).
Но оставить работающий процесс с люком или пилонами или чем-то подобным, конечно, кажется более удобным, когда это возможно.
(также, мне интересно, было ли написано что-то более удобное, так как этот вопрос был впервые задан)
Этот ответ предлагает сделать дамп ядра программы и затем продолжить выполнение на другом достаточно похожем блоке.