Ich suche nach einer Möglichkeit, einen nicht aufdringlichen Speicherauszug eines laufenden Prozesses unter Linux zu erstellen.
Ich bin mit GDBs vertraut gcore
, aber das kann nur ausgeführt werden, wenn gdb
es an den Prozess angehängt ist und zum Debuggen angehalten wird. Für einen großen Core-Dump kann dies viele Sekunden oder sogar einige Minuten unterbrochener Ausführung bedeuten.
Gibt es eine nicht blockierende Alternative?
Linux unterstützt copy-on-write - Speicher, der es auf zu Unterstützung angewiesen fork()
ohne exec()
. Ich denke also an einen Vorgang auf Kernel-Ebene, bei dem der Kernel beim Kopieren einen Schnappschuss der Prozessseitentabellen des zu sichernden Prozesses erstellt und dann den Kern ausschreibt, während der ursprüngliche Prozess weiterläuft.
Ich bin mir ziemlich sicher, dass ich es gebrauchen könnte gdb
, um ein fork()
Kind zu zwingen, das dann entleert wird, während das Elternteil glücklich weitermacht, und dann wait()
im Elternteil, um das Kind nach der Beendigung zu ernten. Es ist jedoch chaotisch und erfordert immer noch zwei Unterbrechungen des übergeordneten Prozesses, wenn auch nur kurze.
Das hat doch schon mal jemand gebraucht?
Antworten:
Google CoreDumper fällt mir ein. Es erstellt eine Kopie des Adressraums des Prozesses, siehe WriteCoreDump () (siehe "Hinweise").
quelle