Szukam sposobu na wykonanie nieinwazyjnej operacji rdzeniowej w systemie Linux.
Znam gdb gcore
, ale można go uruchomić tylko wtedy, gdy gdb
jest dołączony do procesu i jest zatrzymany w celu debugowania. Dla dużego zrzutu rdzenia, który może oznaczać wiele sekund, a nawet kilka minut przerwanego wykonywania.
Czy jest jakaś nieblokująca alternatywa?
Linux obsługuje kopiowanie przy zapisie pamięci, który opiera się na wsparciu fork()
bez exec()
. Tak więc myślę o czymś na poziomie jądra, w którym jądro pobiera migawkę kopii przy zapisie tabel stron procesu zrzucanego procesu, a następnie wypisuje rdzeń, podczas gdy oryginalny proces nadal działa.
Jestem prawie pewien, że mógłbym użyć gdb
siły, a fork()
następnie rzucić dziecko, podczas gdy rodzic kontynuuje radość, a następnie wait()
w rodzic, aby zebrać dziecko po zakończeniu. Jest to jednak bałagan i nadal wymaga dwóch przerw w procesie macierzystym, aczkolwiek krótkich.
Z pewnością ktoś tego wcześniej potrzebował?
Odpowiedzi:
Google CoreDumper przychodzi mi na myśl. Tworzy kopię przestrzeni adresowej kopiowania przy zapisie, patrz WriteCoreDump () (patrz „Notatki”).
źródło