Неблокуючий дамп ядра в Linux?


24

Я шукаю спосіб взяти ненав'язливу кореневу систему запущеного процесу в Linux.

Я знайомий з gdb gcore, але це може бути запущено лише тоді, коли gdbвін додається до процесу, і він зупинений для налагодження. Для великого дампу ядра, який може означати багато секунд, а то й декілька хвилин, перерваного виконання.

Чи є альтернатива, що не блокує?

Linux підтримує пам'ять копіювання при записі, на яку вона покладається fork()без підтримки exec(). Тому я думаю про щось на рівні ядра, де ядро ​​робить знімок під час копіювання таблиць сторінок процесу процесу, який скидається, а потім записує ядро, поки початковий процес продовжує працювати.

Я впевнений, що я міг би використати gdbдля того, щоб примусити fork()дитину потім скинути дитину, поки батько веде себе щасливо, а потім wait()у батька, щоб пожинати дитину після закінчення. Це безладно, але все ж вимагає двох перерв батьківського процесу, хоч і коротких.

Напевно, комусь це було потрібно раніше?


Мені шкода, що я можу дати лише одну резюме за це чудове питання.
Peterh каже відновити Моніку

Відмінне запитання, і я, спочатку, з нетерпінням чекаю відповіді. +1 від мене
thanasisk

1
Як щодо 1) приєднання процесу за допомогою gdb 2) нехай він буде роздвоєний командою "вилка виклику" 3) скидання ядра дочірнього процесу 4) дозволення батька чекати мертвої дитини (інший "виклик чекати4") 5 ) відірватися від процесу 6) автоматизувати 1-5? Gdb використовує прості системні виклики sys_ptrace (), це може бути не дуже складним інструментом C, повністю незалежним від gdb.
Peterh каже відновити Моніку

1
На віртуальній машині ви можете зробити знімок і піднести це як клон для аналізу. Можливо, вам допоможе один із перерахованих тут інструментів: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni

1
Ви можете уникнути другого переривання, дочекавшись дочірнього процесу, а потім вийти. Тоді батьківський процес може чекати дитину негайно, а потім продовжувати, тоді як бабуся і дідусь скидає ядро.
kasperd

Відповіді:


1

Google CoreDumper приходить до тями. З нього створюється копія під час запису адресного простору процесу, див. WriteCoreDump () (див. "Примітки").


Це виглядає надзвичайно корисно! Цікаво, що таке основна техніка, що використовується. Імовірно, це затягує процес, але створення знімка корів без розгортання та таким чином, що не впливає на стек (и), буде складним завданням. Мені доведеться поглянути на код. Чудова порада.
Крейг Рінгер

Схоже, це лише в процесі роботи, на жаль, і його не можна викликати через gdb або подібне, тому що для цього потрібно ptrace. Тож це дещо схоже на DLL налагодження під Windows, а не як неблокуючий gcore, але все ще дуже зручний вигляд. Я думаю, це можна було б використовувати через гачок LD_PRELOAD та налаштування обробника сигналу за допомогою gdb, від'єднання та сигналізації процесу, але це не схоже на те, що він дійсно призначений для скидання немодифікованих програм, і він має спільну проблему будь-яким інструментом демпінгу, який перебуває під час роботи, що якщо процес заблокується достатньо, дамп не працюватиме.
Крейг Рінгер

Вибачте ... Я пропустив "ненав'язливий" біт, коли вперше прочитав питання.
EricM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.