AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.03.2021, 11:43   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,985 / 3273 (117) ++++++++++
Регистрация: 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.
Теги
stack trace, стек вызовов

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Стек вызовов в инфологе в D365FO sukhanchik DAX: Программирование 11 27.10.2023 15:53
AIF действия в транзакции. Откат Rollback MazZzDaI DAX: Программирование 6 14.02.2017 13:03
Итератор с поддержкой методов обратного вызова для обработки контролов на форме gl00mie DAX: Программирование 18 06.08.2013 22:16
Временные таблицы и транзакции Lemming DAX: Программирование 11 13.10.2009 12:16
Как получить стек вызовов без изменения кода? Ilia# DAX: Программирование 2 24.01.2006 11:04

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:24.