Garfo e descarga central com roscas

Pontos semelhantes ao da questão foram levantados antesAqui eAqui, e estou ciente da biblioteca do Google Coredump (que eu avaliei e achei deficiente, embora eu possa tentar trabalhar nisso se eu entender melhor o problema).

Eu quero obter um core dump de um processo Linux em execução sem interromper o processo. A abordagem natural é dizer:

if (!fork()) { abort(); }

Como o processo bifurcado obtém uma cópia fixa do instantâneo da memória do processo original, eu deveria obter um dump principal completo e, como a cópia usa copy-on-write, ela geralmente deve ser barata. No entanto, uma falha crítica desta abordagem é quefork() apenas bifurca o encadeamento atual e todos os outros encadeamentos do processo original não existirão na cópia bifurcada.

Minha pergunta é se é possível de alguma forma obter os dados relevantes dos outros tópicos originais. Não sei bem como abordar esse problema, mas aqui estão algumas subperguntas que fiz:

A memória que contém todas as pilhas dos segmentos ainda está disponível e acessível no processo bifurcado?

É possível (rapidamente) enumerar todos os threads em execução no processo original e armazenar os endereços das bases de suas pilhas? Pelo que entendi, a base de uma pilha de discussão no Linux contém um ponteiro para dados de contabilidade de thread do kernel, então ...

Com os endereços base de thread armazenados, você poderia ler os dados relevantes para cada um dos segmentos originais no processo bifurcado?

Se isso for possível, talvez seja apenas uma questão de anexar os dados dos outros threads ao dump principal. No entanto, se esses dados já estiverem perdidos no ponto do fork, não parece haver esperança para essa abordagem.

questionAnswers(4)

yourAnswerToTheQuestion