Дамп процесса ядро, не убивая процесс

12

Есть ли способ получить дамп ядра (или что-то подобное) для процесса, фактически не убивая процессы? У меня есть многопоточный процесс Python, работающий на встроенной системе. И я хочу иметь возможность получить снимок процесса в нормальных условиях (то есть с другими процессами, необходимыми для запуска), но у меня недостаточно памяти для подключения GDB (или запустить его под GDB) без процесса Python быть единственным бегущим.

Я надеюсь, что этот вопрос имеет смысл.

Falmarri
источник
Если это происходит только во время отладки, рассматривали ли вы что-то сумасшедшее, например, обмен файлами NFS или сетевое блочное устройство?
Жиль "ТАК - перестань быть злым"

Ответы:

13

Обычный трюк состоит в том, чтобы заставить что-то (возможно, похожий на сигнал SIGUSR1) вызвать программу fork(), а затем дочерний процесс вызывает abort()создание дампа ядра.

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

и во время инициализации

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

Используемый таким образом, forkне будет занимать много дополнительной памяти, потому что почти все адресное пространство будет разделено (именно поэтому это работает для создания дампа ядра).

Когда-то давно этот прием использовался с программой, вызываемой undumpдля генерации исполняемого файла из дампа ядра для сохранения образа после сложной инициализации; emacsиспользуется для создания предварительно загруженного изображения из temacs.

geekosaur
источник
5

Вы можете попробовать использовать gcore. Это вариант для вас?

Леонид
источник
В какой-то момент gcore была автономной программой, но я не думаю, что она больше входит в пакет gdb - однако вы можете запустить gdb --pid = <PID> и затем использовать его команду gcore для выгрузки файла ядра. gcore.c - довольно простая программа, которую легко можно гуглить, если вы хотите что-то более легкое.
синтезаторпатель