krn.JobThreadGetCallStack

Dieser Job liefert den Aufrufstack (Call Stack) des Jobs, der aktuell oder zuletzt auf dem angegebenen Thread ausgeführt wird. Er ist die ausführliche Detailanalyse eines einzelnen Threads; die schlanke Momentaufnahme über alle Threads liefert krn.JobThreadGetInfo. Die Thread-Kennung stammt aus krn.ThreadEnum bzw. krn.QueueGetStatistic.

1. Eingabeparameter

Name Typ Pflicht Beschreibung

Flags

INT

Ja

Derzeit nicht unterstützt — 0 übergeben.

ThreadID

INT

Ja

Kennung des Threads

2. Ausgabeparameter

Name Typ Abhängigkeit Beschreibung

CallStack

BASE64

base64-codierter Abzug fester Länge (1 MiB) des aktuellen C++-Aufrufstacks des Threads, innerster Frame zuerst. Aufbau siehe unten.

Count

INT

Steuerwert für das seitenweise Auslesen (nicht die Anzahl der Frames)

CountExtra

INT

Steuerwert für das seitenweise Auslesen

Offset

BIGINT

Byte-Offset für das seiten- bzw. streamweise Auslesen

Die Werte Count, CountExtra und Offset steuern das seiten- bzw. streamweise Auslesen; da der vollständige Stack bereits im Puffer liegt, sind sie in der Regel 0.

3. Aufbau des CallStack-Puffers

CallStack ist ein Abzug fester Länge (1 MiB) des C++-Aufrufstacks des Threads, innerster Frame zuerst (Index 0 = die gerade ausgeführte Funktion). Zwischen den Frames stehen interne 8-Byte-Zeiger bzw. -Größen, die ignoriert werden können. Jeder Frame besteht aus vier durch NUL-Zeichen getrennten UTF-16LE-Zeichenketten:

Bestandteil Beschreibung

Funktion

Name der Funktion, z. B. CNameSpace::MakeCall, CWFJobWorkerJob::Execute

Quelldatei

Name der Quelldatei, z. B. namespace.cpp, WFJob.cpp

Modul

Modul samt Versionsangabe im Format Modul (Version Build # Bit), z. B. axsvckrn (12.0 799 # 64)

Parameter

Erfasste Argumente im Format Name = Wert; …. Auf Dispatch-Frames steht hier der aufgerufene Job samt Eingabeparametern, z. B. szName = std.ProcessPageCountCPMessages; Parameters = $$$QueueName$$$=bat;ConcurrentJobCount=1;Flags=0;

Liest man den Stack von unten nach oben, ergibt sich der vom Thread ausgeführte Job. Die Parameter-Bestandteile machen den genau dispatchten Job, dessen Eingabeparameter sowie ausgelöste Server-Event-Codes sichtbar (z. B. nCode = 5001 für KernelAfterJob).

Beispiel eines Stacks (Thread der Queue workflow, der wfm.WorkerJob ausführt):

[0]  CArchivDBFuncPool::FreeDB         adbfunc_impl.cpp    axsvckrn (12.0 799 #64)  pDBFunc = 0x…;
[1]  CArchivDBFuncPool::unsafe_FreeDB  adbfunc_impl.cpp    axsvckrn (12.0 799 #64)  pDBFunc = 0x…;
[2]  CNameSpace::DispatchJob           namespace.cpp       axsvckrn (12.0 799 #64)  szName = wfm.WorkerJob; Parameters = ;
[3]  CNameSpace::wrapped_MakeCall      namespace.cpp       axsvckrn (12.0 799 #64)
[4]  CNameSpace::MakeCall              namespace.cpp       axsvckrn (12.0 799 #64)  szName = WorkerJob;
[5]  CNameSpace::safe_DispatchJob      namespace.cpp       axsvckrn (12.0 799 #64)
[6]  RestoreContextIfNeeded            namespace.cpp       axsvckrn (12.0 799 #64)
[7]  CWFJob::CleanUp                   WFJob.cpp           oxjobwfm (12.0 562 #64)
[8]  CWFJob::Run                       WFJob.cpp           oxjobwfm (12.0 562 #64)
[9]  CWFJob::Run_                      WFJob.cpp           oxjobwfm (12.0 562 #64)
[10] CWFJobWorkerJob::Execute          WFJobWorkerJob.cpp  oxjobwfm (12.0 562 #64)

4. Rückgabe

(INT): 0 = Job erfolgreich, sonst Fehlercode.