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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2014, 10:35   #1  
AndrewRa is offline
AndrewRa
Участник
 
6 / 10 (1) +
Регистрация: 20.12.2012
Падение АОС с диагностикой «Cursor bulding error 2»
Всем доброго времени суток!

В рабочее время с частотой примерно 1 – 3 раза в день перегружается основной АОС.
При этом, в eventlog сервера пишется ошибка:
Object Server 01: Unexpected situation
More Information: Cursor bulding error 2

Ошибку устойчиво воспроизвести не можем.

Зависимость падений от выполнения каких-либо периодических пакетных заданий или регулярных операций не выявлена.
Падения начались в начале декабря, когда был внедрен проект, активно использующий открытие сессий АХ на терминальном сервере…

Наши шаги:

1. На сервере АОСа настроено снятие дампов памяти при падении процесса Ax32Serv.exe (с помощью утилиты Debug Diagnostic Tool 1.2).

2. С помощью инструмента WinDbg (x64) из пакета Debugging Tools for Windows (x64) проанализированы полученные дампы и выявлено место в коде АХ, которое вызывает ошибку (Процедура анализа дампов).
Анализ дампа всегда указывает на один и тот же метод класса, в качестве клиентской машины всегда указан терминальный сервер.

3. Настроено логгирование выполнения всех этапов найденного метода в таблицу.
В результате сопоставления данных лога и анализа дампов выявлено конкретное место в коде метода, в котором происходит падение.
Но ничего подозрительного в коде не обнаружено – просто попытка доступа к объекту args.record()!..

У нас Axapta 2009 RU 5.

Может быть, кто-то сталкивался с подобной ситуацией?
В чем может быть причина падений?
Старый 22.01.2014, 10:49   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от AndrewRa Посмотреть сообщение
активно использующий открытие сессий АХ
Что конкретно под этим имеется в виду? Клиентские сесси плодит?
Цитата:
Сообщение от AndrewRa Посмотреть сообщение
просто попытка доступа к объекту args.record()!..
А что там передается и откуда?
__________________
Isn't it nice when things just work?
Старый 22.01.2014, 12:52   #3  
AndrewRa is offline
AndrewRa
Участник
 
6 / 10 (1) +
Регистрация: 20.12.2012
По поводу терминальных сессий:
Имеется в виду, что всегда, когда имеет место падение АОС, анализ указывает на метод Main() определенного класса (всегда одного и того же), используемый формой, которую открывает удаленный пользователь, запустивший клиент АХ на терминальном сервере.
В декабре были разработаны отдельные формы для удаленных пользователей, так что падения могут быть обусловлены новым функционалом, а не изменениями в инфраструктуре.

По поводу объекта args.record():
Выявленный метод Main класса активно используется как в новых формах для удаленных пользователей, так и в существующих.
В аргументе args.record() передается запись таблицы источника данных формы.
Анализ указывает как место падения простую строку кода: if (args.record().RecId), т.е. - есть ли запись.
Кстати, для класса свойство RunOn установлено в значение Server.
Старый 22.01.2014, 13:32   #4  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
Спасибо, так понятнее. Рекомендую вам воспользоваться услугами квалифицированного AX разработчика. Я бы попробовал, для начала, что-то вроде:
if (args && args.record())
Но без доступа в систему это игра "в угадайку"
__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 22.01.2014 в 13:37.
Старый 22.01.2014, 13:45   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Соглашусь.
Когда мы только стартовали на ax2009 то бывали проблемы с кодом который на сервере пытался использовать курсоры созданные на клиенте.

попробуйте вариант Маклакова. Если не получится то можно, указанные анализх вынести в статический метод помеченный как client server - тогда проверка на клиенте пойдет. но это уже танцы с бубном.
Старый 22.01.2014, 14:03   #6  
AndrewRa is offline
AndrewRa
Участник
 
6 / 10 (1) +
Регистрация: 20.12.2012
По поводу проверки if (args && args.record()):
На самом деле у нас так и есть:
boolean argsDataSetCorrect;
...
if (args)
{
if (args.dataset() == tablenum(SalesTable))
{
argsDataSetCorrect = true;
}
}
if (argsDataSetCorrect && args.record().RecId)
...
Для локализации места падения мы вынесли дополнительные проверки в отдельный блок кода.
Ранее я упростил код, чтобы не замутнять...

По поводу совета Логгера:
Спасибо! Попробуем.
О результатах напишу.
Старый 22.01.2014, 15:09   #7  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
RecId зачем?
__________________
Isn't it nice when things just work?
Старый 22.01.2014, 16:12   #8  
AndrewRa is offline
AndrewRa
Участник
 
6 / 10 (1) +
Регистрация: 20.12.2012
Чтобы проверить, есть ли текущая запись.
После этого If идут разные алгоритмы обработки.

Кстати, уже вынесли проверки в отдельный метод с модификатором Client (выполняемый на клиенте).
Ждем результатов...
Старый 22.01.2014, 16:53   #9  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Коллеги имеют в виду написать вместо args.record().RecId просто args.record().

См. также: if (record) vs if (record.RecId)
Старый 22.01.2014, 17:47   #10  
AndrewRa is offline
AndrewRa
Участник
 
6 / 10 (1) +
Регистрация: 20.12.2012
После выноса проверки в клиентский метод анализ дампа очередного падения указал на другое место!
Спасибо за советы, - ситуация сдвинулась с места!


Теперь падение происходит дальше по коду, просто при переначитке записи: salesTable.reread();
Может, попробовать перенести на клиент и эту часть функционала, или даже весь класс (свойство класса RunOn)?

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

Я тут подумал, на терминальном сервере у нас установлена другая операционка - Windows Server 2012 R2 (а на сервере АОСа Windows Server 2008 R2).
Не могут ли с этим быть связаны подобные нерегулярные ошибки при чтении на сервере созданного на клиенте курсора?

Если связь есть, не значит ли это, что дальнейший перенос функциональности с сервера на клиент грозит ухудшением производительности?
Поскольку ошибки могут появляться в самых неожиданных местах и потребуется много таких переносов?..

По поводу "написать вместо args.record().RecId просто args.record()" - уже пробовал, в первоначальном варианте было именно args.record().
Читал где-то на форуме, что это может помочь (хотя, судя по приведенной Олегом ссылке на тему, большинство за args.record())...
Старый 23.01.2014, 02:45   #11  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от AndrewRa Посмотреть сообщение
Читал где-то на форуме, что это может помочь (хотя, судя по приведенной Олегом ссылке на тему, большинство за args.record())...
В вашем случае, может приходить не cursor а null. У null RecId быть не может. Система на такое ругнется, как минимум.
Но это была просто попытка угадать. Без возможности посмотреть на то, что происходит на форме и вдумчиво оттестировать взаимодействие под дебагером, о чем-то конкретном говорить сложно.
P.S. Да и на то, как клиент установлен, тоже интересно взглянуть было бы.
__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 23.01.2014 в 02:49.
Старый 23.01.2014, 09:40   #12  
AndrewRa is offline
AndrewRa
Участник
 
6 / 10 (1) +
Регистрация: 20.12.2012
Внимательно прочитал системные требования (за ноябрь 2013):
Там явно не сказано о совместимости АХ2009 и Windows Server 2012 (можно не выше Windows Server 2008 R2)!!!
Значит, сам MS не дает гарантий корректной работы ах2009 на этой операционке....

Последний раз редактировалось AndrewRa; 23.01.2014 в 09:49.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Периодическая остановка службы АОС MaxBor DAX: Администрирование 14 24.05.2012 17:12
Загрузка сервера АОС tolstjak DAX: Администрирование 0 10.09.2007 16:23
Не работает подключение к АОС VORP DAX: Администрирование 5 29.05.2006 17:55
Соединение м/у АОС и базой RFC DAX: Администрирование 4 30.07.2004 10:00
Разработка в кластере АОС ravil DAX: Администрирование 8 29.07.2004 11:19

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

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

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