Показать сообщение отдельно
Старый 19.03.2021, 11:43   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Нет, речь о 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
т.е. вызов идет откуда-то из ядра. Стек вызовов усекается - нет упоминаний про джоб.

Последний раз редактировалось Logger; 19.03.2021 в 11:46.