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 |
|---|---|---|---|
|
INT |
Ja |
Derzeit nicht unterstützt — |
|
INT |
Ja |
Kennung des Threads |
2. Ausgabeparameter
| Name | Typ | Abhängigkeit | Beschreibung |
|---|---|---|---|
|
BASE64 |
— |
base64-codierter Abzug fester Länge (1 MiB) des aktuellen C++-Aufrufstacks des Threads, innerster Frame zuerst. Aufbau siehe unten. |
|
INT |
— |
Steuerwert für das seitenweise Auslesen (nicht die Anzahl der Frames) |
|
INT |
— |
Steuerwert für das seitenweise Auslesen |
|
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. |
Quelldatei |
Name der Quelldatei, z. B. |
Modul |
Modul samt Versionsangabe im Format |
Parameter |
Erfasste Argumente im Format |
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.
Siehe auch: krn.JobThreadGetInfo, krn.JobThreadGetFlowStack, krn.ThreadEnum