Erstellung eines Core Dumps per Laufzeit-Funktion

Erstellung eines Core Dumps per Laufzeit-Funktion 1:

Verfügbar ab TC3.1.4026.14

Um die Funktion CreateCallstackCoreDump() zu nutzen, ist sowohl Engineering- als auch Runtime-seitig die Version 4026.14 erforderlich.

Erstellung eines Core Dumps per Laufzeit-Funktion 2:

Core Dump nur nutzbar mit zugehöriger Compile-Info-Datei

Wenn Sie eine Core-Dump-Datei archivieren oder abspeichern, beachten Sie, dass zum Laden eines Core Dumps das zugehörige Projekt und die zugehörige Compile-Info-Datei (*.compileinfo-Datei, die z.B. beim Erstellen des Projekts im „_CompileInfo“-Ordner abgelegt wird) vorliegen müssen. Falls dies nicht der Fall ist, kann TwinCAT den Dump später nicht mehr verwenden.

Beachten Sie hierzu auch die Einstellungsmöglichkeiten auf der Registerkarte Settings. Mit Hilfe der Einstellung Core Dump können Sie konfigurieren, ob die Core-Dump-Datei, die sich möglicherweise im Projektverzeichnis befindet, zusammen mit den verfügbaren Compile-Info-Dateien in einem TwinCAT-Dateiarchiv gespeichert werden soll.

Um zur Laufzeit einen Core Dump zu erzeugen, steht die Funktion CreateCallstackCoreDump() zur Verfügung. Mit dieser Funktion können Sie aus dem Steuerungscode heraus ein Core Dump erzeugen, der die Aufrufliste (Call Stack) zu der Codezeile enthält, in der die Funktion aufgerufen wird. Als Parameter kann ein Teil der Core-Dump-Bezeichnung übergeben werden. Weitere Informationen zur Benennung finden Sie weiter hinten in diesem Kapitel.

Speicherpfad

Der Core Dump wird standardmäßig im Boot-Ordner des Zielsystems abgelegt. Weitere Informationen zum (einstellbaren) Speicherpfad finden Sie unter: Speicherpfad für die automatische Erstellung.

Funktion CreateCallstackCoreDump()

Erstellung eines Core Dumps per Laufzeit-Funktion 3: Eingänge

VAR_INPUT
    sName : STRING[40];
END_VAR

Name

Typ

Beschreibung

sName

STRING[40]

 

Performance-Hinweise

Erstellung eines Core Dumps per Laufzeit-Funktion 4:

Beachten Sie die folgenden Performance-Hinweise zu der Funktion CreateCallstackCoreDump().

Bezeichnung der Core-Dump-Datei

Der Name der Core-Dump-Datei, die per CreateCallstackCoreDump() erzeugt wird, lautet:

Port_<Port des SPS-Projekts>_CallStackDump_<Wert der übergebenen Eingangsvariablen sName>.<Call Stack Checksumme>.core

Beispiel:

Der folgende Funktionsaufruf innerhalb eines SPS-Projekts mit Port 851 erzeugt beispielsweise einen Core Dump mit dem anschließend genannten Namen.

CreateCallstackCoreDump('CheckBounds_IdxTooLow');

Port_851_CallStackDump_CheckBounds_IdxTooLow.2322085807.core

Die Checksumme im Namen wird über den Call Stack gebildet, sodass pro Call Stack nur ein Dump abgelegt wird. Wenn der gleiche Call Stack in einem anderen Zyklus einen weiteren Dump produzieren würde, hätte dieser den gleichen Namen und würde die vorherige Datei überschreiben.

Limitierung der Anzahl an Core-Dump-Dateien

Um den Speicherverbrauch zu begrenzen, ist die maximale Anzahl an Core-Dump-Dateien auf 10 limitiert. Das heißt, dass maximal 10 Core-Dump-Dateien abgelegt werden, die per Laufzeitfunktion erstellt werden. Falls bereits 10 Dateien existieren und ein weiterer Dump erzeugt werden soll, wird eine vorherige Dump-Datei überschrieben.

Per Laufzeit-Funktion erstellten Core Dump vom Zielsystem ins Projekt laden

Im Onlinebetrieb können Sie den Core Dump vom Zielsystem ins Projektverzeichnis laden. Außerdem können Sie im Offlinebetrieb einen Core Dump vom Projektverzeichnis ins Projekt laden. Sie erhalten dann eine Onlineansicht des SPS-Projekts mit der Aufrufliste zum Zeitpunkt des Erzeugens der Core-Dump-Datei.

Voraussetzungen:

Mit der Entwicklungsumgebung haben Sie das Projekt geöffnet, das auf dem Zielsystem die Core-Dump-Datei erzeugt hat. Das SPS-Projekt befindet sich in der Entwicklungsumgebung im Onlinebetrieb.
Im „_CompileInfo“-Ordner des Projekts befindet sich eine zu dem Core Dump passende Compile-Info-Datei.
1. Laden Sie mit dem Befehl Core Dump erzeugen den Core Dump vom Zielsystem.
TwinCAT kopiert die Core-Dump-Datei mit der Benennung <SPS-Projektname>.<SPS-Projekt-GUID>.core ins lokale SPS-Projektverzeichnis.
2. Loggen Sie das SPS-Projekt aus.
3. Laden Sie mit dem Befehl Core Dump laden den gewünschten Core Dump ins Projekt.
TwinCAT stellt eine Onlineansicht des SPS-Projekts dar. Sie sehen die Aufrufliste zum Zeitpunkt der Core-Dump-Erstellung. Information: Ein Core Dump, der per Laufzeit-Funktion CreateCallstackCoreDump() erstellt wird, enthält aus Performancegründen keine Variablenwerte.
4. Nach Abschluss der Core-Dump-Analyse wählen Sie den Befehl Core Dump schließen.
TwinCAT schließt die Core-Dump-Ansicht des SPS-Projekts. Die Entwicklungsumgebung erscheint wieder mit den Ansichten des normalen Offlinebetriebs.
Erstellung eines Core Dumps per Laufzeit-Funktion 5:

Core-Dump-Online-Ansicht: Nicht alle Befehle verfügbar

In der Onlineansicht, die TwinCAT beim Laden des Core Dumps ins Projekt erzeugt, erscheinen Menübefehle als verfügbar, die in diesem Status nicht wirksam sind. Bei Anwählen eines solchen Befehls erhalten Sie eine entsprechende Meldung.

Außerdem können Sie die Core-Dump-Ansicht nur über den Befehl Core Dump schließen wieder schließen. Der Befehl Ausloggen ist in dieser Ansicht nicht wirksam.

Beispiel: Erzeugung eines Core Dumps zur Laufzeit in CheckBounds()

Im Folgenden finden Sie ein Beispiel, bei dem die Funktion CreateCallstackCoreDump() in der Funktion Bound Checks (POU CheckBounds) für implizite Prüfungen aufgerufen wird.

Dadurch können Sie herausfinden, in welcher Codezeile ein möglicher Zugriff außerhalb der gültigen Arraygrenzen stattfindet, ohne die Laufzeit mittels Haltepunktes anzuhalten.

Durch den Aufruf von CreateCallstackCoreDump() innerhalb der entsprechenden IF-Zweige von CheckBounds() wird die Aufrufliste (Call Stack) mit der Position des fehlerhaften Arrayzugriffs während der Laufzeit in einem Core Dump gespeichert und kann für Analysezwecke zu einem passenden Zeitpunkt geladen werden.

Funktion CheckBounds:

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
// Implicitly generated code: Only an implementation suggestion
{noflow}
IF index < lower THEN
CreateCallstackCoreDump('CheckBounds_IdxTooLow');
CheckBounds := lower;
ELSIF index > upper THEN
CreateCallstackCoreDump('CheckBounds_ IdxTooHigh');
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF

Dabei wird beispielsweise ein Core Dump mit dem folgenden Namen erstellt:

Port_851_CallStackDump_CheckBounds_IdxTooLow.2322085807.core

Siehe auch: