Подобные точки, относящиеся к этому вопросу, были подняты до здесь и здесь, m знает библиотеку coredump Google (которую я оценил и нашел недостаточно, хотя я мог бы попробовать и поработать над этим, если лучше пойму проблему).
Я хочу получить базовый дамп запущенного процесса Linux без прерывания процесса. Естественный подход состоит в том, чтобы сказать:
if (!fork()) { abort(); }
Поскольку разветвленный процесс получает фиксированную копию моментального снимка исходной памяти процесса, я должен получить полный дамп ядра, и поскольку копия использует copy-on-write, она обычно должна быть дешевой. Однако критический недостаток этого подхода состоит в том, что fork()
только разветвляет текущий поток, а все остальные потоки исходного процесса не будут существовать в разветвленной копии.
Мой вопрос в том, можно ли каким-то образом получить соответствующие данные других исходных потоков. Я не совсем уверен, как подойти к этой проблеме, но вот пара второстепенных вопросов, которые я придумал:
-
Является ли память, содержащая все стеки потоков, доступными и доступными в разветвленном процессе?
-
Можно ли (быстро) перечислить все текущие потоки в исходном процессе и сохранить адреса оснований их стеков? Насколько я понимаю, база стека потоков в Linux содержит указатель на данные учета потока ядра, поэтому...
-
с сохраненными базовыми адресами потоков, можете ли вы прочитать соответствующие данные для каждого из исходных потоков в разветвленном процессе?
Если это возможно, возможно, это будет только вопрос добавления данных других потоков к дампу ядра. Однако, если эти данные уже потеряны в точке fork, то, похоже, не существует никакой надежды на этот подход.