Zrzuć rdzeń procesu bez zabijania procesu


12

Czy istnieje sposób na uzyskanie zrzutu podstawowego (lub czegoś podobnego) dla procesu bez faktycznego zabijania procesów? Mam wielowątkowy proces Pythona działający w systemie osadzonym. I chcę być w stanie uzyskać migawkę procesu w normalnych warunkach (tj. Z innymi procesami wymaganymi do uruchomienia), ale nie mam wystarczającej ilości pamięci, aby połączyć gdb (lub uruchomić go pod gdb) bez procesu python jako jedyny biegający.

Mam nadzieję, że to pytanie ma sens.


Jeśli dzieje się tak tylko podczas debugowania, czy zastanawiałeś się nad czymś szalonym, takim jak zamiana pliku NFS lub urządzenia sieciowego?
Gilles 'SO - przestań być zły'

Odpowiedzi:


13

Zwykła sztuczka polega na tym, aby coś (być może sygnał podobny SIGUSR1) uruchomiło program fork(), a następnie dziecko wywołuje funkcję abort()zrzutu pamięci.

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

i podczas inicjalizacji

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

Użyty w ten sposób forknie zużywa dużo dodatkowej pamięci, ponieważ prawie cała przestrzeń adresowa będzie współdzielona (dlatego też działa to w przypadku generowania zrzutu podstawowego).

Dawno temu tę sztuczkę stosowano w programie wywoływanym undumpdo generowania pliku wykonywalnego z zrzutu pamięci, aby zapisać obraz po złożonej inicjalizacji; emacssłużył do tego w celu wygenerowania wstępnie załadowanego obrazu z temacs.


5

Możesz spróbować użyć gcore. Czy to dla ciebie opcja?


W pewnym momencie gcore był samodzielnym programem, ale nie sądzę, że jest już częścią pakietu gdb - jednak możesz uruchomić gdb --pid = <PID>, a następnie użyć polecenia gcore, aby zrzucić plik podstawowy. gcore.c to dość prosty program, który można łatwo przejrzeć, jeśli chcesz czegoś lżejszego.
synthesizerpatel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.