Zrzut widelca i rdzenia za pomocą wątków

Podobne punkty do tego w tym pytaniu zostały podniesione wcześniejtutaj itutaj, i wiem o bibliotece Google coredump (którą oceniłem i której brakuje, chociaż mogę spróbować i pracować nad tym, jeśli lepiej zrozumiem problem).

Chcę uzyskać zrzut pamięci działającego procesu Linux bez przerywania procesu. Naturalnym podejściem jest powiedzieć:

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

Ponieważ rozwidlony proces otrzymuje stałą kopię migawki oryginalnej pamięci procesu, powinienem otrzymać kompletny zrzut pamięci, a ponieważ kopia używa kopiowania przy zapisie, powinna być ogólnie tania. Jednak krytyczną wadą tego podejścia jest tofork() rozwidla tylko bieżący wątek, a wszystkie inne wątki oryginalnego procesu nie będą istniały w rozwidlonej kopii.

Moje pytanie brzmi, czy można w jakiś sposób uzyskać odpowiednie dane z innych, oryginalnych wątków. Nie jestem do końca pewien, jak podejść do tego problemu, ale oto kilka pytań podrzędnych:

Czy pamięć zawierająca wszystkie stosy wątków jest nadal dostępna i dostępna w rozwidlonym procesie?

Czy jest możliwe (szybkie) wyliczenie wszystkich działających wątków w oryginalnym procesie i przechowywanie adresów baz ich stosów? Jak rozumiem, podstawa stosu wątków w Linuksie zawiera wskaźnik do danych księgowych wątków jądra, więc ...

Czy dzięki przechowywanym adresom bazowym wątków można odczytać odpowiednie dane dla każdego z oryginalnych wątków w rozwidlonym procesie?

Jeśli to możliwe, być może byłoby to tylko kwestią dołączenia danych innych wątków do zrzutu rdzenia. Jeśli jednak dane te zostaną utracone już w punkcie rozwidlenia, to nie ma nadziei na takie podejście.

questionAnswers(4)

yourAnswerToTheQuestion