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


24

Я ищу способ взять ненавязчивый coredump запущенного процесса в Linux.

Я знаком с GDB gcore, но его можно запустить, только когда gdbон подключен к процессу и остановлен для отладки. Для большого дампа ядра это может означать много секунд или даже несколько минут прерванного выполнения.

Есть ли неблокирующая альтернатива?

Linux поддерживает память для копирования при записи, которую он поддерживает fork()без поддержки exec(). Итак, я думаю о чем-то на уровне ядра, где ядро ​​делает моментальный снимок «копировать при записи» таблиц страниц процесса, для которого создается дамп, а затем записывает ядро, пока исходный процесс продолжает работать.

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

Конечно, кому-то это нужно было раньше?


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

Отличный вопрос, и я, например, с нетерпением жду ответа. +1 от меня
thanasisk

1
Как насчет 1) присоединения процесса с помощью gdb 2) пусть он будет разветвлен командой "fork fork" 3) сбросить ядро ​​дочернего процесса 4) позволить родительскому процессу ждать мертвого потомка (еще один "call wait4") 5 ) отсоединиться от процесса 6) автоматизировать 1-5? Gdb использует простые системные вызовы sys_ptrace (), это может быть не очень сложный инструмент C, полностью независимый от gdb.
Петер говорит восстановить Монику

1
На виртуальной машине вы можете сделать снимок и представить его как клон для анализа. Возможно, вам поможет один из перечисленных здесь инструментов: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Джованни Тирлони,

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

Ответы:


1

На ум приходит Google CoreDumper . Он создает копию адресного пространства процесса при записи, см. WriteCoreDump () (см. «Примечания»).


Это выглядит чрезвычайно полезным! Интересно, какова основная техника? Предположительно, он отслеживает процесс, но создание моментального снимка CoW без разветвления и способом, который не влияет на стек (-ы), будет сложной задачей. Я должен взглянуть на код. Отличный совет.
Крейг Рингер

Похоже, что это только в процессе, к сожалению, и не может быть вызвано через GDB или аналогичные, потому что он требует Ptrace сам. Так что это немного похоже на DLL-библиотеку debughelp под Windows, а не на неблокирующую gcore, но все же очень удобно. Я предполагаю, что можно было бы использовать через ловушку LD_PRELOAD и настроить обработчик сигнала с помощью gdb, отсоединить и сигнализировать процесс, но это не похоже на то, что он действительно предназначен для выгрузки неизмененных программ, и у него есть общая проблема любым внутрипроцессным инструментом дампа, который, если процесс испорчен достаточно, дамп не будет работать.
Крейг Рингер

Извините ... Я пропустил "ненавязчивый" бит, когда впервые прочитал вопрос.
EricM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.