linux - number - show current open files




Core-Dump-Dateien unter Linux: Wie bekommt man Informationen über geöffnete Dateien? (6)

Am besten installieren Sie einen Signalhandler für jedes Signal, das Ihr Programm stürzt (SIGSEGV usw.).

Untersuchen Sie dann / proc / self / fd im Signalhandler und speichern Sie den Inhalt in einer Datei. Hier ist ein Beispiel dessen, was Sie sehen könnten:

Anderson cxc # ls -l  /proc/8247/fd
total 0
lrwx------ 1 root root 64 Sep 12 06:05 0 -> /dev/pts/0
lrwx------ 1 root root 64 Sep 12 06:05 1 -> /dev/pts/0
lrwx------ 1 root root 64 Sep 12 06:05 10 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Sep 12 06:05 11 -> socket:[124061]
lrwx------ 1 root root 64 Sep 12 06:05 12 -> socket:[124063]
lrwx------ 1 root root 64 Sep 12 06:05 13 -> socket:[124064]
lrwx------ 1 root root 64 Sep 12 06:05 14 -> /dev/driver0
lr-x------ 1 root root 64 Sep 12 06:05 16 -> /temp/app/whatever.tar.gz
lr-x------ 1 root root 64 Sep 12 06:05 17 -> /dev/urandom

Dann können Sie von Ihrem Signalhandler zurückkehren, und Sie sollten wie gewohnt einen Core Dump erhalten.

Ich habe eine Kernausdruckdatei von einem Prozess, der vermutlich ein Dateideskriptorleck hat (es öffnet Akten und Sockel, aber anscheinend vergisst manchmal, einige von ihnen zu schließen). Gibt es eine Möglichkeit herauszufinden, welche Dateien und Sockets der Prozess vor dem Absturz geöffnet hat? Ich kann den Absturz nicht einfach reproduzieren, daher scheint die Analyse der Kerndatei die einzige Möglichkeit zu sein, einen Hinweis auf den Fehler zu erhalten.


Ein Core-Dump ist eine Kopie des Speichers, auf den der Prozess beim Absturz zugreifen konnte. Je nachdem, wie das Leck auftritt, hat es möglicherweise die Referenz auf die Griffe verloren, sodass es sich als nutzlos erweisen kann.

lsof listet alle aktuell geöffneten Dateien im System auf. Sie können die Ausgabe überprüfen, um durchgesickerte Sockets oder Dateien zu finden. Ja, Sie müssten den Prozess ausführen. Sie könnten es mit einem bestimmten Benutzernamen ausführen, um leicht zu erkennen, welches die geöffneten Dateien von dem Prozess sind, den Sie debuggen.

Ich hoffe, jemand hat bessere Informationen :-)


Sie können versuchen, strace zu verwenden, um die open , strace und close Aufrufe des Programms zu sehen.

Edit: Ich glaube nicht, dass Sie die Informationen vom Kern bekommen können; höchstens hat es die Dateideskriptoren irgendwo, aber das gibt Ihnen immer noch nicht die eigentliche Datei / Socket. (Angenommen, man kann offene von geschlossenen Dateideskriptoren unterscheiden, was ich ebenfalls bezweifle.)


Wenn das Programm vergessen hat, diese Ressourcen zu schließen, könnte dies daran liegen, dass etwas Ähnliches passiert ist:

fd = open("/tmp/foo",O_CREAT);
//do stuff
fd = open("/tmp/bar",O_CREAT); //Oops, forgot to close(fd)

jetzt werde ich nicht den Dateideskriptor für foo im Speicher haben.

Wenn dies nicht geschehen ist, können Sie vielleicht die Datei-Deskriptor-Nummer finden, aber andererseits ist das nicht sehr nützlich, weil sie sich ständig ändern. Wenn Sie Debuggen, wissen Sie nicht, welche Datei es tatsächlich bedeutet. damals.

Ich denke wirklich, du solltest das live debuggen, mit strace, lsof und Freunden.

Wenn es einen Weg gibt, es aus dem Core-Dump zu machen, bin ich auch gespannt, es zu wissen :-)


Eine der Möglichkeiten, wie ich zu diesen Informationen springen kann, ist das Ausführen von strings in der Core-Datei. Zum Beispiel, wenn ich vor kurzem eine Datei auf einem Kern ausgeführt habe, würde ich aufgrund der Länge der Ordner eine abgeschnittene Argumentliste bekommen. Ich wusste, dass mein Lauf Dateien aus meinem Home-Verzeichnis geöffnet hätte, also lief ich einfach:

strings core.14930|grep jodie

Aber das ist ein Fall, wo ich eine Nadel und einen Heuhaufen hatte.


Kürzlich während meiner Fehlerbehebung und -analyse hat mir mein Kunde einen Coredump zur Verfügung gestellt, der in seinem Dateisystem generiert wurde und er ging aus der Station heraus, um die Datei schnell zu durchsuchen und seinen Inhalt zu lesen. Ich benutzte den Befehl.

strings core.67545> coredump.txt und später konnte ich die Datei im Datei-Editor öffnen.







crash