Нет, речь о p-code.
Запускаем такой джоб
X++:
static void Job144(Args _args)
{
void someMethod()
{
callStack2infolog();
}
;
ttsBegin; // здесь в Application запоминается время начала
someMethod(); // а здесь мы легко получаем стек вызовов и запоминаем его в глобальной переменной, которую чистим по завершении транзакции
// нам же необязательно получить стек при начале или конце транзакции. Главное локализовать участки кода.
// это попытка хоть как-то обойти потерю стека вызовов ядром при пересечении ttsBegin / ttsCommit
ttsCommit; // здесь в Application запоминается время конца и идет запись времени в лог вместе со стеком вызовов
}
где callStack2infolog это
X++:
// подняли из ax3.0
#localmacro.ClientPrefix "(C)" #endmacro
#localmacro.ServerPrefix "(S)" #endmacro
#define.PathPrefixLen (4)
static void callStack2infolog(
str _prefix = "", // "@SYS65092",
Counter _skipLevels = 0,
/*
container stack = xSession::xppCallStack() //pkoz 18.02.2014
*/
container stack = Stack_MRC::xppCallStack(0)
)
{
// container stack = xSession::xppCallStack();
TreeNodePath correctPath;
TreeNodePath stackPath;
Counter n;
int line;
;
setPrefix(_prefix);
if (_skipLevels < 0)
{
_skipLevels = 0;
}
for (n = 3 + _skipLevels * 2; n <= conLen(stack); n += 2)
{
stackPath = conPeek(stack,n);
line = conPeek(stack,n+1);
correctPath = stackPath;
if (line)
{
if ( subStr(stackPath, 1, #PathPrefixLen) == #ClientPrefix
|| subStr(stackPath, 1, #PathPrefixLen) == #ServerPrefix
)
{
correctPath = subStr(stackPath, #PathPrefixLen + 1, maxInt());
}
info(strFmt("%1 %2", stackPath, line),'', SysInfoAction_Editor::newLineColumn(correctPath, line));
}
else
{
info(strFmt("%1", stackPath),'', SysInfoAction_Editor::newLineColumn(correctPath, 1));
}
}
}
по итогу он вывел в инфолог
Цитата:
(C)\Classes\Global\callStack2infolog 6
(C)\Jobs\Job144 5
а если запустить такой джоб
X++:
static void Job145(Args _args)
{
ttsBegin;
ttsCommit;
}
воткнув в метод
\Classes\Application\ttsNotifyPostBegin
такой код
X++:
public void ttsNotifyPostBegin()
{
;
if (curUserId() == "pkoz")
{
callStack2infolog();
}
super();
...
}
то в инфолог будет выведен такой стек вызовов
Цитата:
(S)\Classes\Global\callStack2infolog 6
(S)\Classes\Application\ttsNotifyPostBegin 11
т.е. вызов идет откуда-то из ядра. Стек вызовов усекается - нет упоминаний про джоб.