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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.06.2013, 07:59   #1  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Анализатор незакрытых транзакций
У нас нередко возникала проблема с незакрытыми транзакциями (непарные ttsbegin/ttscommit). Мы пытались их устранять, искали и исправляли код с такими ошибками, но это было медленно и не очень успешно.

Для возможно более полного решения этой проблемы я написал программу для автоматического поиска подобных ошибок, с помощью которой мы выявили (а затем устранили) немалое их количество.

Программа предназначена для Ax 3.0, (но, наверное, будет работать и с другими версиями Axapta, но с худшими результатами) и обрабатывает .xpo-файлы (но job-ы не обрабатываются). Принцип работы простой: считается, что все открытые в методе транзакции должны быть в нём закрыты. Вообще программа использует набор эвристик, из-за чего могут быть как ложноположительные, так и ложноотрицательные результаты. В частности, циклы обрабатываются очень приблизительно. Кроме того, макросы программа не раскрывает, а просто "угадывает", что там могло быть (синтаксически).

Как пользоваться:
1. Эскпортируете объекты в какой-нибудь файл.xpo.
2. В cmd.exe или его аналоге (analyzer --- консольное приложение):
> analyzer.exe этот_файл.xpo > result.txt
3. Упорно ждёте завершения обработки, затем анализируете result.txt.

Если хотите попробовать на новых версиях Dynamics AX, то указывайте кодировку обрабатываемых файлов, например:
> analyzer.exe aot.xpo utf-8 > aot_result.txt

При сбоях в работе анализатора выдаются такие сообщения:

. Parse error. Token <x> in block <y>, state <z>
Данное сообщение означает, что произошёл сбой синтаксического анализатора, при этом указанный метод НЕ анализируется. Пример:

public void insert()
{
if if(!this.ABCCalcJourID) ttscommit;

\Tables\ABCCalcJour\insert, line 3:
-- Parse error. Token <if> in block <CondExpr>, state <Start>

. !ParseWarning: Unrecognized command (something)
Данные сообщения означают, что выявлена неизвестная анализатору команда или слово, открывающее блок. Анализ при этом продолжается.

Выявляемые предупреждения:
. 'break' is used outside of a loop or switch!
. 'continue' is used outside of a loop!
-- использование break/continue вне циклов/switch-ей.
. 'ttsabort' inside 'catch' is useless!
-- ttsabort внутри catch бесполезен (в нашей Ax 3.0/MSSQL это так).
. multiple ttsbegin/ttscommit pairs in linear block!
-- несколько транзакций в линейном блоке, обычно это ошибка.

Выявляемые ошибки:
. 'try' is useless inside transaction!"
-- try внутри транзакции бесполезен (в нашей Ax 3.0/MSSQL это так).
. 'return' with incorrect ttslevel!
-- выход из метода с некорректным уровнем tts.
. ttslevel<0!
. unpaired transaction!

-------------------------------------------------
В нашем случае результаты для всего AOT такие:

Время анализа: около 5 минут (313 сек).
Всего выявлено ошибок и предупреждений: 335
Из них:
Корректных ошибок и предупреждений: 286, ~85%
Формально ошибочных, но корректных (методы 'ttsbegin' и т.п.): 30, ~9%
Некорректных предупреждений: 7, ~2%
Ложноположительных результатов: 10, ~3%
Hack-ов (while (appl.ttsLevel()>0) ttscommit; ) : 2, менее 1%

Интересно, какие результаты получатся у Вас.
Вложения
Тип файла: zip analyzer.zip (737.1 Кб, 105 просмотров)
За это сообщение автора поблагодарили: Logger (10), Raven Melancholic (1), alex55 (3), imir (2).
Старый 28.06.2013, 08:31   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Это конечно круто.

Но если вам приходится прибегать к таким ухищрениям, то какое же наследство вы разгребаете
Старый 28.06.2013, 09:53   #3  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Это да: "Корректных ошибок и предупреждений: 286". Из них около 40 ошибок с транзакциями в методах, которые реально используются. На этом приложении многие разрабатывали...

А Вы на своих приложениях/проектах попробовали?
Старый 28.06.2013, 10:56   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Такую задачу решают стандартные проверки best practics. Правда по всему приложению не за 5 минут (313 сек), а за то время, которое требуется на компиляцию.
Старый 28.06.2013, 11:02   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Ярослав Щекин Посмотреть сообщение
Это да: "Корректных ошибок и предупреждений: 286". Из них около 40 ошибок с транзакциями в методах, которые реально используются. На этом приложении многие разрабатывали...

А Вы на своих приложениях/проектах попробовали?
Нет.
Мы настолько все не запускали.

У нас другое развлечение было - диалоги в транзакциях.
Ну это легко отлавливается.
Старый 28.06.2013, 11:11   #6  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
А у Вас какая версия Axapta?
Я вот беру код типа:
------
X++:
ttsbegin;

if (!inventTable.AFPGroupId) {
   if (cry) warning(strfmt("@KCL2642", inventTable.ItemId));
   return;
   }

while select AFPGroupLines
            where AFPGroupLines.GroupId == inventTable.AFPGroupId {
            AFPUnit::createUnit(inventTable.ItemId, AFPGroupLines.InventLocationId, _combination);
        }
ttscommit;
----
Запускаю проверку Best Practices, и никаких предупреждений не вижу.
Старый 28.06.2013, 11:14   #7  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Цитата:
Сообщение от Logger Посмотреть сообщение
Нет.
Мы настолько все не запускали.
А откуда Вы знаете?
Я вот тоже до проверки думал, что у нас таких ошибок пара-тройка, ну максимум 5, а не около 40.
Старый 28.06.2013, 11:34   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Возможно я слишком самонадеян.
Попробую прогнать вашим инструментом.
Старый 28.06.2013, 12:43   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Да, и у нас встречалась пара - тройка таких косяков. Поскольку у нас ничего критичного(кроме неудобства) не происходило, остановились на том, что джобик с одной строчкой ttsabort; всегда есть под рукой.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 28.06.2013, 13:23   #10  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Pustik Посмотреть сообщение
Да, и у нас встречалась пара - тройка таких косяков. Поскольку у нас ничего критичного(кроме неудобства) не происходило, остановились на том, что джобик с одной строчкой ttsabort; всегда есть под рукой.
Ну по всякому бывает. Бывает что не сильно критично, а бывает что и очень даже. На моей памяти был косяк когда пакетник в трешке несколько суток импортировал из внешней системы документы и справочники. Из за вставленного кем-то посреди метода return всё это накопилось в очень длинные транзакции, "завершившиеся" только когда на оракловой базе в логах кончилось место вместе с вполне логичным откатом всего нажитого за эти дни
Старый 28.06.2013, 14:06   #11  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от db Посмотреть сообщение
Ну по всякому бывает. Бывает что не сильно критично, а бывает что и очень даже. На моей памяти был косяк когда пакетник в трешке несколько суток импортировал из внешней системы документы и справочники. Из за вставленного кем-то посреди метода return всё это накопилось в очень длинные транзакции, "завершившиеся" только когда на оракловой базе в логах кончилось место вместе с вполне логичным откатом всего нажитого за эти дни
Согласен, конечно. Я поэтому и отметил что "у нас". Наверняка, еще какие-нибудь каверзные случаи бывают, которые увидишь только тогда, когда на такие грабли наткнешься.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 29.06.2013, 16:53   #12  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Ярослав Щекин Посмотреть сообщение
А у Вас какая версия Axapta?
Я вот беру код типа:
...
Запускаю проверку Best Practices, и никаких предупреждений не вижу.
У нас DAX4. Я немного поторопился, заявив, что задачу решают стандартные проверки best practics. Посмотрел текущий метод проверки и не нашел того, что подразумевал. Стандарт просто тупо подсчитывает соответствие количества ttsBegin и ttsCommit в пределах одного метода.То есть он даже пропустит вариант написания:
X++:
ttsCommit;
... 
ttsBegin;
В общем, даже порядок вызова транзакций стандарт не отслеживает, не говоря уже про выход посреди транзакции при помощи return, break и continue.
Просто когда-то на одной из прошлых работ я расширял BP по поводу парности ttsBegin/ttsCommit таким образом, чтобы проверялось не только количество, но и порядок и наличие между началом и подтверждение транзакции возвратов, прерываний, продолжений (в этом случае выдавал не ошибку или предупреждение, а просто сообщение, поэтому ловилось только при определенной настройке BP). За давностью лет решил, что это и есть стандарт.
Ладно, вспомню что тогда делал и добавлю в наше приложение. А Вам рекомендую вписать Вашу проверку в метод checkSource класса SysBPCheckMemberFunction. В этом случае не нужно будет что-то выгружать в проекты, а контролировать все это дело в рамках текущей разработки.
Старый 04.07.2013, 14:37   #13  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Цитата:
Сообщение от Logger Посмотреть сообщение
Возможно я слишком самонадеян.
Попробую прогнать вашим инструментом.
Ну что, попробовали? Есть какие-то результаты?
Старый 15.07.2013, 12:44   #14  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Мощно конечно, но если возникают такие вещи в коде, напрашивается вопрос: Вы вообще рефакторинг делаете? Разбив сложный метод с транзакциями на несколько простых, можно все-таки транзакции вычленить примерно в такую форму:
X++:
void complexMethod()
{
    ttsbegin;
    simpleMethods();
    ttscommit;
}
__________________
// no comments
Старый 15.07.2013, 13:38   #15  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
В любом приложении должен быть на первом месте такой джоб
X++:
static void aaa_ttscommit(Args _args)
{
    ;
    info(int2str(appl.ttsLevel()));
    while (appl.ttsLevel())
        ttscommit;
}
Старый 15.07.2013, 19:41   #16  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Цитата:
Сообщение от dech Посмотреть сообщение
Мощно конечно, но если возникают такие вещи в коде, напрашивается вопрос: Вы вообще рефакторинг делаете?
Бывает. Но к нашей Axapta многие приложили руки, и непонятно, что и когда рефакторить. Вы на своём/своих приложениях попробовали, кстати?
Старый 16.07.2013, 07:37   #17  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Ярослав Щекин Посмотреть сообщение
Вы на своём/своих приложениях попробовали, кстати?
Попробовал на АХ3 и АХ4, пишет ошибку:

invalid command name "Exportfile"
while executing
"Exportfile for AOT version 1.0 or later"
Вложения
Тип файла: xpo _TestTTS.xpo (1.4 Кб, 460 просмотров)
__________________
// no comments
Старый 16.07.2013, 09:37   #18  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Цитата:
Сообщение от dech Посмотреть сообщение
Попробовал на АХ3 и АХ4, пишет ошибку:

invalid command name "Exportfile"
while executing
"Exportfile for AOT version 1.0 or later"
А у меня работает на этом файле. А как Вы запускаете (какая командная строка, с локального или сетевого диска), какая у Вас операционная система?
Старый 16.07.2013, 10:29   #19  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Ярослав Щекин Посмотреть сообщение
А у меня работает на этом файле. А как Вы запускаете (какая командная строка, с локального или сетевого диска), какая у Вас операционная система?
Windows 7, папка "Мои документы". Запускаю через FAR. Но я думаю, не в этом дело.
Просто, если он уже читает первую строчку "Exportfile for AOT version 1.0 or later" и пишет, что это invalid command, то вам надо смотреть в сторону обработки строк.
__________________
// no comments
Старый 16.07.2013, 11:32   #20  
Ярослав Щекин is offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Регистрация: 16.03.2009
Цитата:
Сообщение от dech Посмотреть сообщение
Windows 7, папка "Мои документы". Запускаю через FAR. Но я думаю, не в этом дело.
Просто, если он уже читает первую строчку "Exportfile for AOT version 1.0 or later" и пишет, что это invalid command, то вам надо смотреть в сторону обработки строк.
Нет, не нужно, дело не в этом. А вы под администратором запускаете или нет? А что будет, если просто запустить analyzer.exe без параметров? А если скопировать в корень какого-нибудь диска и запустить оттуда?

И ещё, можете попробовать версию из вложенного файла?
Вложения
Тип файла: zip analyzer.zip (737.0 Кб, 100 просмотров)

Последний раз редактировалось Ярослав Щекин; 16.07.2013 в 11:38.
Теги
ttscomit, best practice

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Чтение только завершенных транзакций. raz DAX: Программирование 4 19.05.2017 10:20
Неверный откат сопоставленных транзакций sgt.Pepper DAX: Программирование 4 17.01.2008 09:16
IMTS (Система множественных складских транзакций) yuranio DAX: Функционал 7 04.03.2005 17:56
Какая связь между Сводным планированием и Система множественных складских транзакций Wamr DAX: Функционал 6 27.09.2004 17:03
Очень частая фиксация транзакций - без этого никак? avzh DAX: Программирование 10 12.07.2004 10:35

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:34.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.