Как вывести весь процесс Python для последующей проверки отладки? - PullRequest
21 голосов
/ 27 сентября 2008

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

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

Ответы [ 4 ]

4 голосов
/ 27 сентября 2008

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

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

1 голос
/ 27 сентября 2008

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

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

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

0 голосов
/ 02 октября 2012

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

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

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

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

0 голосов
/ 27 сентября 2008

Этот ответ предлагает сделать дамп ядра программы и продолжить выполнение на другом достаточно похожем блоке.

...