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

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

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


person keturn    schedule 26.09.2008    source источник
comment
Также обратите внимание, что сигнал QUIT (Ctrl- \) также сбрасывает ядро.   -  person tzot    schedule 26.06.2010
comment
По теме: stackoverflow.com/questions/6132469/ stackoverflow.com/questions/14519100/   -  person Wilem2    schedule 10.01.2021


Ответы (4)


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

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

person Thomas Wouters    schedule 26.09.2008

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

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

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

person Douglas Mayle    schedule 26.09.2008
comment
Трассировки стека легко получить, но меня больше интересует весь набор выделенных объектов, чем то, что в данный момент находится в стеке. - person keturn; 27.09.2008

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


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

person Alex Coventry    schedule 27.09.2008