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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.12.2013, 10:26   #1  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Отладка "оффлайн"
Ситуация такая. Время от времени у пользователей возникает некая ошибка (полю автоматически присваивается то значение, которое не должно присваиваться).
Нужно "размотать" ситуацию и понять, что именно в бизнес процессе и/или настройках и/или коде неправильно.
Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться".
НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени.
Хочу иметь на руках полную "картину преступления" в тот момент, когда в данное ошибочное место пользователь "провалится" в следующий раз.
Собственно вопрос: есть ли в аксапте некий метод (назовем его getSnapshot()), вызов которого запишет в некий журнал - таблицу БД или в файл следующую информацию:
  1. Стек вызова;
  2. Значения всех локальных и объектных переменных того места, откуда метод был вызван, а также всех локальных и объектных переменных всех уровней выполнения выше по стеку (кроме BLOB);
  3. Возможно, выдаст и некое уведомление о факте проваливания, например на емейл.
Подозреваю, что похожая задача в аксапте решалась многими, и не хочу изобретать лисапед.

AX 4.0 sp3.
__________________
Бесты и регарды!
Старый 24.12.2013, 11:08   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Оплата поставщику
Создание снимков изменений в базе данных
За это сообщение автора поблагодарили: konfet (1).
Старый 24.12.2013, 11:26   #3  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Спасибо. Но не совсем это то... там нету
Цитата:
Значения всех локальных и объектных переменных того места, откуда метод был вызван, а также всех локальных и объектных переменных всех уровней выполнения выше по стеку (кроме BLOB);
Хотя, на безрыбье...
__________________
Бесты и регарды!
Старый 24.12.2013, 11:32   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от konfet Посмотреть сообщение
Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться".НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени.
Прелестно!.. Если это - стандартный код (типа сопоставления или сводного), то вам можно только посочувствовать, если же код самописный... ну вы поняли Как писал Джон Роббинс в своей широко известной в узких кругах книге, лучший способ отладки - это вообще не доводить дело до отладки. Можно использовать, к примеру, контрактный подход и проверять пред-/пост-условия (см. также вспомогательные классы для этого). Это обычно позволяет быстро выявлять проблемы и не допускать распространения кривых данных по системе. "Минус" такого подхода в том, что его преимущества не даются бесплатно - требуются определенные трудозатраты на этапе написания кода, а если код уже написан, то придется его доработать напильником. Если сложность кода в том, что есть куча итераций обработки данных, в ходе которых состояния объектов и/или данные в таблицах меняются нетривиальным образом, то тут можно приделать некий код трассировки, который бы выводил куда-либо текущую информацию о наиболее важных объектах/таблицах (тем более если используются временные таблицы). Затем можно проанализировать трассировку и попытаться понять, что пошло не так.
Цитата:
Сообщение от konfet Посмотреть сообщение
Хочу иметь на руках полную "картину преступления" в тот момент, когда в данное ошибочное место пользователь "провалится" в следующий раз.
По-моему, в Аксапте штатно нет средств, позволяющих получить "снимок" всего состояния сессии, включая локальные переменные значимых и ссылочных типов каждого фрейма стека выполнения. В 4-ке работает Trace Parcer, но в вашем сценарии, я так понимаю, он не подходит (кажется, 4-ка еще не умеет циклически перезаписывать файл трассировки, ограничив его определенным размером). В общем, без доработки кода напильником с целью получения некой "телеметрии" тут, мне кажется, не обойтись.
За это сообщение автора поблагодарили: MikeR (5).
Старый 24.12.2013, 11:50   #6  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Прелестно!.. Если это - стандартный код (типа сопоставления или сводного), то вам можно только посочувствовать, если же код самописный... ну вы поняли
Код, увы, полностью самописный и как вы наверное догадываетесь, никакого описания или рулезов к нему нет так что отладчик в данной ситуации похоже единственный помощник.
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Как писал Джон Роббинс в своей широко известной в узких кругах книге, лучший способ отладки - это вообще не доводить дело до отладки. Можно использовать, к примеру, контрактный подход и проверять пред-/пост-условия (см. также вспомогательные классы для этого). Это обычно позволяет быстро выявлять проблемы и не допускать распространения кривых данных по системе.
Это советы из серии "лучше быть здоровым и богатым чем бедным и больным", которые, к сожалению, имеют мало успеха в России - у нас как правило сначала делают, а потом думают
В приложении толпой его авторов (стажеров одной из ведущих конс. фирм) просто навалена куча г-на, и никаких "классов проверок" в помине нет.
Ладно. Попробую допилить инструмент, предложеннный Ace of database, если что получится - отпишусь сюда.
__________________
Бесты и регарды!
За это сообщение автора поблагодарили: Kabardian (1).
Старый 24.12.2013, 11:54   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
По идее, если сделать crashdump в этот момент, то можно в нем все есть. Осталось только проанализировать.

Я сам не пробовал. Еще вариант дождаться первого появления - сбросить стек в файлик в потом прологгировать весь код вверх по колстеку.

Еще вариант, при появлении вывести сообщение "срочно позовите техподдержку" и сделать там инструкцию breakpoint (правда, не уверен, что включение отладки для всех не является понижением быстродействия и дырой в безопасности).
Старый 24.12.2013, 12:10   #8  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
А есть ли в аксапте методы типа, наверное, toString() которые выведут в xml или куда нибудь еще содержимое закладок Locals, Globals, This дебаггера?
__________________
Бесты и регарды!
Старый 24.12.2013, 13:08   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от konfet Посмотреть сообщение
Код, увы, полностью самописный и как вы наверное догадываетесь, никакого описания или рулезов к нему нет В приложении толпой его авторов (стажеров одной из ведущих конс. фирм) просто навалена куча г-на, и никаких "классов проверок" в помине нет.
Очень похоже на классическую ситуацию накопления технического долга, который в данном случае приходится теперь выплачивать вам. Мне кажется, присвоением одному полю "не того" значения тут дело не обойдется.
Цитата:
Сообщение от konfet Посмотреть сообщение
А есть ли в аксапте методы типа, наверное, toString() которые выведут в xml или куда нибудь еще содержимое закладок Locals, Globals, This дебаггера?
В том-то и дело, что нет, штатно только отладчик умеет это все разбирать и наглядно показывать.
Старый 24.12.2013, 14:46   #10  
twilight is offline
twilight
MCTS
MCBMSS
 
881 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Сделайте проверку значения и если оно не то, тогда генерируйте Error exception (транзакции там должны быть корректными, чтобы ничего из-за этого не рассинхронизировалось). Пользователи к вам обратятся по этой ошибке и можно будет зайти в отладчик и проанализировать.
__________________
I could tell you, but then I would have to bill you.
Старый 24.12.2013, 15:12   #11  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сделайте проверку значения и если оно не то, тогда генерируйте Error exception (транзакции там должны быть корректными, чтобы ничего из-за этого не рассинхронизировалось). Пользователи к вам обратятся по этой ошибке и можно будет зайти в отладчик и проанализировать.
Да, это самое простое, и я об этом думал, но... если меня не будет на рабочем месте, то бизнес-процесс встанет, и я буду "крайним"
__________________
Бесты и регарды!
Старый 25.12.2013, 02:20   #12  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Добрый день. Может у вас ситуация и не в этом, но обратите внимание на класс xSysLastValue и его метод getlast().
Старый 25.12.2013, 08:07   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от konfet Посмотреть сообщение
Да, это самое простое, и я об этом думал, но... если меня не будет на рабочем месте, то бизнес-процесс встанет, и я буду "крайним"
X++:
if (Box::YesNo("Вы можете позвать пользователя konfet?"))
{
     breakpoint;
}

Последний раз редактировалось sukhanchik; 25.12.2013 в 08:53. Причина: Орфография
За это сообщение автора поблагодарили: konfet (1), sukhanchik (2), gl00mie (1), S.Kuskov (2).
Старый 27.12.2013, 08:23   #14  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Спасибо всем участникам темы.
Остановился на модифицированном варианте Belugin: показал ребятам из поддержки, как (ручками) вытаскивать данные с дебагера, и вставил в проблемное место примерно такой код:

X++:
    res = UserInfoHelp::userInUserGroup(curUserId(), "Admin") && UserInfoHelp::userInUserGroup(curUserId(), "Support");
    if (!res)
    {
        throw info("Нештатная ситуация номер 001. Для завершения операции обратитесь в поддержку!");
    }
    else
    {
        breakpoint;
    }
__________________
Бесты и регарды!
Старый 27.12.2013, 08:33   #15  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Не забудьте потом отключить debug на рабочей базе!
__________________
Ivanhoe as is..
Старый 27.12.2013, 09:28   #16  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от konfet Посмотреть сообщение
Ситуация такая. Время от времени у пользователей возникает некая ошибка (полю автоматически присваивается то значение, которое не должно присваиваться).
Нужно "размотать" ситуацию и понять, что именно в бизнес процессе и/или настройках и/или коде неправильно.
Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться".
НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени.
Хочу иметь на руках полную "картину преступления" в тот момент, когда в данное ошибочное место пользователь "провалится" в следующий раз.
Собственно вопрос: есть ли в аксапте некий метод (назовем его getSnapshot()), вызов которого запишет в некий журнал - таблицу БД или в файл следующую информацию:
  1. Стек вызова;
  2. Значения всех локальных и объектных переменных того места, откуда метод был вызван, а также всех локальных и объектных переменных всех уровней выполнения выше по стеку (кроме BLOB);
  3. Возможно, выдаст и некое уведомление о факте проваливания, например на емейл.
Подозреваю, что похожая задача в аксапте решалась многими, и не хочу изобретать лисапед.

AX 4.0 sp3.
Мне кажется где то уже писалось на форуме, но что то не могу найти.
Я для поиска "откуда это ... взялось" использую следующее:
1. Добавялете поле "CallStack" в журнал БД (SysDataBaseLog) (можно сделать отдельную связную табличку, что бы не корячить SysDataBaseLog).
2. Доработать метод insert() на таблице SysDataBaseLog, что бы в добавленное поле писался стэк вызова (xSession::xppCallStack()).
3. На проблемную таблицу включить Журнал БД.
4. Когда начнут жаловатся, открываем журнал БД и смотрим стэк вызова.

Первые два пункта мне кажется на форуме где то есть, можете поискать.

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

P.S. мне это ОЧЕНЬ помогает в жизни, т.к. приходится работать с кодом очень низкого качества. Только так смогли выудить кучу различных багов, которые делают полный бред, но в глаза не брасаются
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 27.12.2013, 10:56   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Да, модифа со стеком вызова очень удобная.
Помогает понять в спорных ситуациях - это система сглючила или пользователь накосячил сам, а потом дурака включил.
Теги
debugger, отладка, отладчик

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
daxmusings: XLNT - A Most "Excellent" Framework for X++ Blog bot DAX Blogs 5 21.08.2013 10:45
emeadaxsupport: Adding a period to the Aging Period Definition and receive the error: "Unlimited can be used only in the first and last period" or "Unit must be less than 0" Blog bot DAX Blogs 0 29.03.2013 06:11
"Замещающая" или "дополнительная" транспортная накладная? samolalex DAX: Функционал 7 19.07.2011 23:09
rumicrosofterp: AX 2009: Видеокурс "Разработка часть 1" Blog bot DAX Blogs 6 18.06.2011 21:04
"LIKE" и "OR" в "qbds" @x DAX: Программирование 14 20.01.2004 13:20

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

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

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