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


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.