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


12

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

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


Если это происходит только во время отладки, рассматривали ли вы что-то сумасшедшее, например, обмен файлами 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.


5

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


В какой-то момент gcore была автономной программой, но я не думаю, что она больше входит в пакет gdb - однако вы можете запустить gdb --pid = <PID> и затем использовать его команду gcore для выгрузки файла ядра. gcore.c - довольно простая программа, которую легко можно гуглить, если вы хотите что-то более легкое.
синтезаторпатель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.