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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.03.2021, 18:26   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Поймать стек вызова у долгой транзакции.
Привет.

Кто-нибудь решал задачу ловли стеков вызовов приведших к долгим транзакциям ?

Как оказалось, кастомизации Application.ttsNotify* методов не помогают. Ядро там возвращает пустой стек. Как его еще можно было бы достать?

Ax 2012 R3
Старый 18.03.2021, 20:09   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,303 / 1631 (61) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Странно. Раньше вроде работало Анализатор незакрытых транзакций
Старый 18.03.2021, 22:51   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Странно. Раньше вроде работало Анализатор незакрытых транзакций
Так там исходный код анализируется.
Это не то.
Я попробовал в 2012 и 2009. Стек вызовов урезанный. Т. Е при вызове ttsbegin вызов в ttsnotify* приходит откуда то из ядра.
Старый 18.03.2021, 23:35   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,303 / 1631 (61) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Logger Посмотреть сообщение
Так там исходный код анализируется.
Это не то.
Я сослался на конкретное сообщение в той ветке.
Там предлагается в методах ttsNotifyBegin
и ttsNotifyCommit обращаться к xSession::xppCallStack()
За это сообщение автора поблагодарили: Logger (1).
Старый 19.03.2021, 03:10   #5  
trud is offline
trud
Участник
Лучший по профессии 2017
 
968 / 1339 (46) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Если транзакция работает в данный, можно запустить трейсинг на АОСе, потом его разобрать Trace парсером, соответственно он покажет кто что делает.
Старый 19.03.2021, 06:40   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Я сослался на конкретное сообщение в той ветке.
Там предлагается в методах ttsNotifyBegin
и ttsNotifyCommit обращаться к xSession::xppCallStack()
А!
Я так и хотел.
И этот способ не работает в 2009-й и 2012-й. Вызов в эти методы приходит из ядра. Ноэто геинформативно - Не видно стека, по которому произошел вызов ttsbegin.
Старый 19.03.2021, 11:21   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,507 / 2619 (97) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Записей в блоге: 5
Оно не в cil исполняется? mfp: X++ Debugging Tips and Tricks #2 – xSession::xppCallStack()
__________________
blog | twitter
Старый 19.03.2021, 11:41   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
1,983 / 1080 (40) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от belugin Посмотреть сообщение
Не, тут неважно где выполняется. Когда работают методы Application.ttsNotify* стек видно только начиная с этого метода и в отладчике и при программном получении. Там уже где не ставь точку останова - в самом методе или там, кого он вызывает, на вершине стека метод Application.ttsNotify*, а откуда он сам вызван уже не видно.
Старый 19.03.2021, 11:43   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 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.
Старый 19.03.2021, 11:52   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Так, прошу прощенья, похоже меня обманули.
Если джоб 145 запустить на сервере через серверный менюитем, то стек вызовов не теряется.
Цитата:
(S)\Classes\Global\callStack2infolog 6
(S)\Classes\Application\ttsNotifyPostBegin 11
(S)\Jobs\Job145 3
(S)\Classes\xMenuFunction\runServer
похоже, какие-то ограничения для обращения на клиент.
Старый 19.03.2021, 11:56   #11  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
1,983 / 1080 (40) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Хотя нет.
В отладчике видно, если как советует Ace of Database включить точки останова на АОСе (ну понятно, если их не включить, то и остановки не будет). А вот из джоба Logger, действительно, программно стек не ловится.
Старый 19.03.2021, 12:23   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Набросал тестовую форму
потыкал по кнопкам
в инфолог вывалилось

Цитата:
Запустили ttsBegin на clicked кнопки
(S)\Classes\Global\callStack2infolog 6
(S)\Classes\Application\ttsNotifyPostBegin 11

Запустили ttsBegin в серверном методе класса вызванном с clicked метода кнопки на форме.
(S)\Classes\Global\callStack2infolog 6
(S)\Classes\Application\ttsNotifyPostBegin 11
(S)\Classes\Jobs_MRC\testServer 3
(C)\Forms\Form20\Designs\DesignList\Button2\Methods\Clicked 5

Запустили ttsBegin в серверном методе класса вызванном с метода формы.
(S)\Classes\Global\callStack2infolog 6
(S)\Classes\Application\ttsNotifyPostBegin 11
(S)\Classes\Jobs_MRC\testServer 3
(C)\Forms\Form20\Methods\test3 3
(C)\Forms\Form20\Designs\DesignList\Button3\Methods\Clicked 5

Запустили ttsBegin в методе формы вызванном с clicked кнопки.
(S)\Classes\Global\callStack2infolog 6
(S)\Classes\Application\ttsNotifyPostBegin 11
Вложения
Тип файла: xpo PKoz_Form20_dev.xpo (4.4 Кб, 3 просмотров)
Старый 19.03.2021, 12:24   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,478 / 2370 (86) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вывод:
Обсуждаемый баг имеет место когда ttsBegin или ttsCommit написан в клиентском X++ коде.
Если писать на серверном то все ок.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 19.03.2021, 12:30   #14  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
1,983 / 1080 (40) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Кстати, да.
В отлидчике та часть, которая на клиенте в стеке обычным шрифтом представлена, а начиная с Application.ttsNotifyPostBegin жирным.
Теги
stack trace, стек вызовов

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Стек вызовов в инфологе в D365FO sukhanchik DAX: Программирование 4 08.06.2018 20:13
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, время: 13:58.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.