Prozesskern entleeren, ohne den Prozess zu beenden

12

Gibt es eine Möglichkeit, einen Core-Dump (oder ähnliches) für einen Prozess zu erstellen, ohne die Prozesse tatsächlich zu beenden? Ich habe einen Multithread-Python-Prozess auf einem eingebetteten System ausgeführt. Und ich möchte in der Lage sein, einen Schnappschuss des Prozesses unter normalen Bedingungen (dh mit den anderen Prozessen, die ausgeführt werden müssen) zu erhalten, aber ich habe nicht genug Speicher, um GDB zu verbinden (oder es unter GDB auszuführen), ohne den Python-Prozess als einziger läuft.

Ich hoffe diese Frage macht Sinn.

Falmarri
quelle
Wenn dies nur während des Debuggens der Fall ist, haben Sie etwas Verrücktes wie das Austauschen einer NFS-Datei oder eines Netzwerkblockiergeräts in Betracht gezogen?
Gilles 'SO- hör auf böse zu sein'

Antworten:

13

Der übliche Trick ist, etwas (evtl. ein Signal wie SIGUSR1) zum Auslösen des Programms zu bringen fork(), dann ruft das Kind abort()auf, um sich Core Dump zu machen.

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

und während der Initialisierung

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

Auf diese Weise forkwird nicht viel zusätzlicher Speicher belegt, da fast der gesamte Adressraum gemeinsam genutzt wird (weshalb dies auch für die Generierung des Core-Dumps funktioniert).

Früher wurde dieser Trick mit einem Programm verwendet, das aufgerufen wurde undump, um eine ausführbare Datei aus einem Core-Dump zu generieren, um ein Image nach einer komplexen Initialisierung zu speichern. emacswird dazu verwendet, um ein vorgeladenes Bild von zu generieren temacs.

Geekosaurier
quelle
5

Sie könnten versuchen, mit gcore. Ist das eine Option für dich?

Leonid
quelle
Irgendwann war gcore ein eigenständiges Programm, aber ich glaube nicht, dass es Teil des gdb-Pakets ist. Sie können jedoch gdb --pid = <PID> ausführen und dann den gcore-Befehl verwenden, um eine Kerndatei zu sichern. gcore.c ist ein ziemlich einfaches Programm, das leicht zu finden ist, wenn Sie etwas Leichteres wollen.
synthesizerpatel