Nicht blockierender Core Dump unter Linux?

24

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 gdbes 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?

Craig Ringer
quelle
Es tut mir leid, dass ich für diese wunderbare Frage nur eine einzige positive Bewertung abgeben kann.
Peter sagt, Monica
Ausgezeichnete Frage und ich freue mich auf die Antwort. +1 von mir
thanasisk
1
Was ist mit 1) Anhängen des Prozesses mit gdb 2) Verzweigen lassen durch einen "call fork" -Befehl 3) Entleeren des Kerns des Child-Prozesses 4) Warten lassen des toten Kindes durch den Elternteil (ein weiterer "call wait4") 5 ) vom Prozess trennen 6) 1-5 automatisieren? Gdb benutzt einfache Systemaufrufe von sys_ptrace (), es könnte ein nicht wirklich komplexes C-Tool sein, das völlig unabhängig von der gdb ist.
Peter sagt, Monica
1
Auf einer virtuellen Maschine können Sie einen Snapshot erstellen und diesen als Klon zur Analyse bereitstellen. Vielleicht hilft Ihnen eines der hier aufgelisteten Tools: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni
1
Sie können die zweite Unterbrechung vermeiden, indem Sie den untergeordneten Prozess ebenfalls trennen und dann beenden. Dann kann der übergeordnete Prozess sofort auf das untergeordnete Element warten und dann fortfahren, während der Großeltern-Dump-Core ausgeführt wird.
Kasperd

Antworten:

1

Google CoreDumper fällt mir ein. Es erstellt eine Kopie des Adressraums des Prozesses, siehe WriteCoreDump () (siehe "Hinweise").

EricM
quelle
Das sieht äußerst nützlich aus! Ich frage mich, was die zugrunde liegende Technik ist. Vermutlich verfolgt es den Prozess, aber die Erstellung des CoW-Snapshots ohne Verzweigung und auf eine Weise, die den Stack (die Stacks) nicht beeinflusst, wäre eine Herausforderung. Ich muss mir den Code ansehen. Toller Tipp.
Craig Ringer
Scheint leider nur in Bearbeitung zu sein und kann nicht über gdb oder ähnliches aufgerufen werden, da ptrace selbst erforderlich ist. Es ist also ein bisschen wie die Debughelp-DLL unter Windows, nicht wie ein nicht blockierender Gcore, aber dennoch sehr praktisch. Ich vermute, es wäre möglich, über einen LD_PRELOAD-Hook und die Einrichtung eines Signal-Handlers mit gdb den Prozess zu trennen und zu signalisieren, aber es sieht nicht so aus, als wäre es wirklich dazu gedacht, unveränderte Programme zu sichern, und das Problem wurde geteilt durch ein In-Process-Dump-Tool, dass der Dump nicht funktioniert, wenn der Prozess ausreichend durcheinander ist.
Craig Ringer
Entschuldigung ... Ich habe das "nicht aufdringliche" bisschen verpasst, als ich die Frage zum ersten Mal las.
EricM