Я ищу способ сделать ненавязчивый дамп ядра запущенного процесса в Linux.
Я знаком с gdb gcore
, но это можно запустить, только когда gdb
присоединен к процессу и остановлен для отладки. Для большого дампа ядра это может означать много секунд или даже несколько минут прерванного выполнения.
Есть ли неблокирующая альтернатива?
Linux поддерживает память с функцией копирования при записи, от которой зависит fork()
без exec()
. Итак, я думаю о чем-то на уровне ядра, где ядро делает снимок копии при записи таблиц страниц процесса сбрасываемого процесса, а затем записывает ядро, пока исходный процесс продолжает работать.
Я почти уверен, что смогу использовать gdb
заставить fork()
затем сбросьте ребенка, пока родитель счастливо продолжает, затем wait()
в родительском, чтобы пожать ребенка после завершения. Однако это беспорядочно, и по-прежнему требуется два прерывания родительского процесса, хотя и короткие.
Неужто кому-то это было нужно раньше?
Google CoreDumper приходит на ум. Он делает копию адресного пространства процесса "копирование при записи", см. WriteCoreDump () (см. «Примечания»).