Podobne uwagi jak w pytaniu zostały podniesione przed here i here i znam się na bibliotece Google coredump (której nie oceniłem i nie znalazłem, choć mógłbym spróbować pracuj nad tym, jeśli lepiej zrozumiem problem).Zrzuty widełek i rdzenia z wątkami
Chcę uzyskać zrzut podstawowy uruchomionego procesu Linux bez przerywania procesu. Naturalnym podejściem jest powiedzieć:
if (!fork()) { abort(); }
Ponieważ proces rozwidlony dostaje stałą migawkę kopię pamięci pierwotnego procesu, powinniśmy uzyskać pełny zrzut pamięci, a ponieważ kopia wykorzystuje kopiowanie przy zapisie, to powinien ogólnie tanie. Jednak krytycznym mankamentem tego podejścia jest to, że fork()
wyświetla tylko bieżący wątek, a wszystkie inne wątki oryginalnego procesu nie istnieją w rozwidlonej kopii.
Moje pytanie brzmi, czy możliwe jest uzyskanie w jakiś sposób odpowiednich danych z innych, oryginalnych wątków. Nie jestem do końca pewien, jak podejść do tego problemu, ale tutaj jest kilka mniejszych pytań mam wymyślić:
Czy pamięć, która zawiera wszystkie stosy nitek nadal dostępne i w rozwidlonym procesie?
Czy można (szybkie) wyliczyć wszystkie działające wątki w oryginalnym procesie i zapisać adresy baz swoich stosów? Jak rozumiem, podstawa stosu wątków w systemie Linux zawiera wskaźnik do danych księgowych wątku jądra, więc ...
z zapisanymi adresami bazowymi wątków, czy można odczytać odpowiednie dane dla każdego z nich oryginalne wątki w rozwidlonym procesie?
Jeśli jest to możliwe, być może będzie to tylko kwestia dołączając dane z innych wątków do zrzutu rdzenia. Jeśli jednak dane te zostaną już utracone w punkcie rozwidlenia, nie wydaje się, aby istniała jakakolwiek nadzieja na takie podejście.
Nie mam teraz żadnej funkcji enumarion w pthreads ... - ale w odniesieniu do 'fork()' możesz chcieć spojrzeć na 'pthread_atfork()'. Wygląda na to, że używanie procedur obsługi zarejestrowanych przez te ostatnie może być użyte do wykonania własnego modułu wyliczającego pthread. – alk
Być może powodem, dla którego tylko wyświetla bieżący wątek jest implementacja wątku w systemie Linux, używa 'clone()'. – Marcus
@ Marcus: Nie martwiłem się tym, * dlaczego * 'fork()' zachowuje się tak, jak to robi. Jestem całkiem zadowolony z tego, co robi, co wydaje mi się rozsądne. –