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.