Kann mit einem abgeschnittenen Kern etwas Nützliches getan werden?

7

Wir haben Prozesse in einer Mischung aus Python, Java und C ++ geschrieben, die von Zeit zu Zeit einen Core-Dump ausführen. Sie weisen nach Bedarf zur Laufzeit mehr Speicher in Blöcken zu und stürzen bekanntermaßen ab, wenn ihre Zuordnung über 4G liegt (ich denke, der Rückgabewert von malloc()wird nicht überprüft).

Die erzeugten Core-Dumps sind laut GDB jedoch abgeschnitten - sie sind im Betriebssystem unbegrenzt groß und auf der Festplatte variieren sie zwischen 2 und 3,8 GB.

GDB stellt fest, dass die Größe nicht den Erwartungen entspricht (vermutlich einschließlich der fehlgeschlagenen Zuordnung?) Und gibt auf - aber bei 3,8 G Daten muss es sicherlich etwas Interessantes geben? Möglicherweise sogar den gesamten Stack, den ich für eine Rückverfolgung brauche!

Wie kann ich GDB davon überzeugen, es zumindest zu versuchen, oder gibt es ein alternatives Tool, das etwas aus einem abgeschnittenen Kern extrahieren kann?

Gaius
quelle
Was ist dein Zweck hier? Wären Sie nicht besser dran, den Prozess direkt zu debuggen? Ich habe zum Beispiel Gerüchte gehört, dass man gdb an einen laufenden Prozess anhängen kann. Wie oft passieren diese Abstürze?
Faheem Mitha
Eine Vorhersage ist wahrscheinlich nicht möglich, da der tatsächlich benötigte Speicher von den zu verarbeitenden Datensätzen abhängt und keine lineare Beziehung zwischen der Größe der Daten und dem für die Verarbeitung benötigten Speicher besteht. Meine Motivation hier ist es, meinen Benutzern so viel Unterstützung wie möglich zu bieten, wenn ihre Batch-Jobs über Nacht fehlschlagen. Ich kann ihnen derzeit nur sagen, dass Sie versuchen, zu viel Speicher zu verwenden, aber ich kann ihnen nicht helfen, herauszufinden, welche Funktion genau ist Dabei kommen viele der C ++ - und Java-Bibliotheken von woanders, meine Benutzer schreiben meistens Python-Klebercode).
Gaius
Aha. Sie führen den Code nicht selbst aus oder schreiben ihn nicht? Wenn Sie "meine Benutzer" sagen, welche Rolle / Funktion haben Sie dabei? Ohne praktischen Kontakt kann es schwierig sein, diese Probleme zu lösen. Erwägen Sie, im Chatraum abzuhängen. Dies kann ein vernünftiger Ort sein, um Probleme zu diskutieren. wenn Leute da sind und aufpassen, das heißt.
Faheem Mitha
Ich bin ein Systemadministrator, meine Benutzer schreiben hauptsächlich numerischen Code. Sie sind gut in Mathe, aber nicht unbedingt "technisch". Der Code wird mit einem verteilten Dateisystem und einem Job Scheduler ausgeführt. Das Problem, das ich hier frage, ist, gibt es irgendetwas Nützliches, das ich von einem 3.8G-Core-Dump bekommen kann, wenn GDB denkt, dass es abgeschnitten ist? Ich fühle mich wohl genug, wenn nötig C selbst zu schreiben.
Gaius
Ich bin selbst nicht mit Kerndateien vertraut, daher kann ich dort keinen Vorschlag machen. Ich schlug alternative Methoden zum Debuggen vor. Im Allgemeinen ist es möglich, das Erschöpfen des Speichers zu vermeiden, indem der Speicher regelmäßig freigegeben wird. Es sollte möglich sein, herauszufinden, wo die Probleme liegen, ohne sich die Core Dumps ansehen zu müssen, es sei denn, dies ist sehr kompliziert. Schauen Sie auch hier in unserem Chatraum vorbei, um zu chatten. Der Stapelüberlauf verfügt möglicherweise über mehr Programmierkenntnisse, wir sind jedoch möglicherweise freundlicher. :-)
Faheem Mitha

Antworten:

5

Dieser Klappentext auf der Sun Studio 12-Website scheint zu implizieren, dass sie im Grunde genommen nutzlos sind.

Auszug - http://docs.oracle.com/cd/E19205-01/819-5257/blabs/index.html

Wenn Ihre Kerndatei abgeschnitten ist

Wenn Sie Probleme beim Laden einer Kerndatei haben, überprüfen Sie, ob Sie eine abgeschnittene Kerndatei haben. Wenn Sie die maximal zulässige Größe der Kerndateien beim Erstellen der Kerndatei zu niedrig eingestellt haben, kann dbx die resultierende abgeschnittene Kerndatei nicht lesen. In der C-Shell können Sie die maximal zulässige Größe der Kerndatei mit dem Befehl limit festlegen (siehe Manpage limit (1)). Verwenden Sie in der Bourne-Shell und der Korn-Shell den Befehl ulimit (siehe Manpage limit (1)). Sie können das Limit für die Größe der Kerndatei in Ihrer Shell-Startdatei ändern, die Startdatei erneut als Quelle bereitstellen und dann das Programm, das die Kerndatei erstellt hat, erneut ausführen, um eine vollständige Kerndatei zu erstellen.

Wenn die Kerndatei unvollständig ist und das Stapelsegment fehlt, sind keine Stapelverfolgungsinformationen verfügbar. Wenn die Laufzeit-Linker-Informationen fehlen, ist die Liste der Ladeobjekte nicht verfügbar. In diesem Fall erhalten Sie eine Fehlermeldung, dass librtld_db.so nicht initialisiert wird. Wenn die Liste der LWPs fehlt, sind keine Thread-, LWP- oder Stack-Trace-Informationen verfügbar. Wenn Sie den Befehl where ausführen, wird eine Fehlermeldung angezeigt, dass das Programm nicht "aktiv" war.

slm
quelle
Dies scheint die wichtige Einschränkung zu sein, die dem Stapelsegment fehlt, dann sind keine Stapelverfolgungsinformationen verfügbar. Wenn die Laufzeit-Linker-Informationen fehlen, ist die Liste der Ladeobjekte nicht verfügbar. <--- Nur mit reiner Wahrscheinlichkeit sollten einige dieser Informationen in einer 3.8G-Kerndatei enthalten sein!
Gaius