24.12.2013, 10:26 | #1 |
Снова балуюсь косаптой :)
|
Отладка "оффлайн"
Ситуация такая. Время от времени у пользователей возникает некая ошибка (полю автоматически присваивается то значение, которое не должно присваиваться).
Нужно "размотать" ситуацию и понять, что именно в бизнес процессе и/или настройках и/или коде неправильно. Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться". НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени. Хочу иметь на руках полную "картину преступления" в тот момент, когда в данное ошибочное место пользователь "провалится" в следующий раз. Собственно вопрос: есть ли в аксапте некий метод (назовем его getSnapshot()), вызов которого запишет в некий журнал - таблицу БД или в файл следующую информацию:
AX 4.0 sp3.
__________________
Бесты и регарды! |
|
24.12.2013, 11:08 | #2 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: konfet (1). |
24.12.2013, 11:26 | #3 |
Снова балуюсь косаптой :)
|
Спасибо. Но не совсем это то... там нету
Цитата:
Значения всех локальных и объектных переменных того места, откуда метод был вызван, а также всех локальных и объектных переменных всех уровней выполнения выше по стеку (кроме BLOB);
__________________
Бесты и регарды! |
|
24.12.2013, 11:32 | #4 |
Участник
|
Цитата:
Сообщение от konfet
Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться".НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени.
|
|
|
За это сообщение автора поблагодарили: MikeR (5). |
24.12.2013, 11:50 | #6 |
Снова балуюсь косаптой :)
|
Цитата:
Цитата:
Сообщение от gl00mie
Как писал Джон Роббинс в своей широко известной в узких кругах книге, лучший способ отладки - это вообще не доводить дело до отладки. Можно использовать, к примеру, контрактный подход и проверять пред-/пост-условия (см. также вспомогательные классы для этого). Это обычно позволяет быстро выявлять проблемы и не допускать распространения кривых данных по системе.
В приложении толпой его авторов (стажеров одной из ведущих конс. фирм) просто навалена куча г-на, и никаких "классов проверок" в помине нет. Ладно. Попробую допилить инструмент, предложеннный Ace of database, если что получится - отпишусь сюда.
__________________
Бесты и регарды! |
|
|
За это сообщение автора поблагодарили: Kabardian (1). |
24.12.2013, 11:54 | #7 |
Участник
|
По идее, если сделать crashdump в этот момент, то можно в нем все есть. Осталось только проанализировать.
Я сам не пробовал. Еще вариант дождаться первого появления - сбросить стек в файлик в потом прологгировать весь код вверх по колстеку. Еще вариант, при появлении вывести сообщение "срочно позовите техподдержку" и сделать там инструкцию breakpoint (правда, не уверен, что включение отладки для всех не является понижением быстродействия и дырой в безопасности). |
|
24.12.2013, 12:10 | #8 |
Снова балуюсь косаптой :)
|
А есть ли в аксапте методы типа, наверное, toString() которые выведут в xml или куда нибудь еще содержимое закладок Locals, Globals, This дебаггера?
__________________
Бесты и регарды! |
|
24.12.2013, 13:08 | #9 |
Участник
|
Цитата:
В том-то и дело, что нет, штатно только отладчик умеет это все разбирать и наглядно показывать. |
|
24.12.2013, 14:46 | #10 |
MCTS
|
Сделайте проверку значения и если оно не то, тогда генерируйте Error exception (транзакции там должны быть корректными, чтобы ничего из-за этого не рассинхронизировалось). Пользователи к вам обратятся по этой ошибке и можно будет зайти в отладчик и проанализировать.
__________________
I could tell you, but then I would have to bill you. |
|
24.12.2013, 15:12 | #11 |
Снова балуюсь косаптой :)
|
Цитата:
Сделайте проверку значения и если оно не то, тогда генерируйте Error exception (транзакции там должны быть корректными, чтобы ничего из-за этого не рассинхронизировалось). Пользователи к вам обратятся по этой ошибке и можно будет зайти в отладчик и проанализировать.
__________________
Бесты и регарды! |
|
25.12.2013, 02:20 | #12 |
Участник
|
Добрый день. Может у вас ситуация и не в этом, но обратите внимание на класс xSysLastValue и его метод getlast().
|
|
25.12.2013, 08:07 | #13 |
Участник
|
Цитата:
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 |
Снова балуюсь косаптой :)
|
Спасибо всем участникам темы.
Остановился на модифицированном варианте Belugin: показал ребятам из поддержки, как (ручками) вытаскивать данные с дебагера, и вставил в проблемное место примерно такой код: X++: res = UserInfoHelp::userInUserGroup(curUserId(), "Admin") && UserInfoHelp::userInUserGroup(curUserId(), "Support"); if (!res) { throw info("Нештатная ситуация номер 001. Для завершения операции обратитесь в поддержку!"); } else { breakpoint; }
__________________
Бесты и регарды! |
|
27.12.2013, 08:33 | #15 |
Участник
|
Не забудьте потом отключить debug на рабочей базе!
__________________
Ivanhoe as is.. |
|
27.12.2013, 09:28 | #16 |
Ищущий знания...
|
Цитата:
Сообщение от konfet
Ситуация такая. Время от времени у пользователей возникает некая ошибка (полю автоматически присваивается то значение, которое не должно присваиваться).
Нужно "размотать" ситуацию и понять, что именно в бизнес процессе и/или настройках и/или коде неправильно. Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться". НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени. Хочу иметь на руках полную "картину преступления" в тот момент, когда в данное ошибочное место пользователь "провалится" в следующий раз. Собственно вопрос: есть ли в аксапте некий метод (назовем его getSnapshot()), вызов которого запишет в некий журнал - таблицу БД или в файл следующую информацию:
AX 4.0 sp3. Я для поиска "откуда это ... взялось" использую следующее: 1. Добавялете поле "CallStack" в журнал БД (SysDataBaseLog) (можно сделать отдельную связную табличку, что бы не корячить SysDataBaseLog). 2. Доработать метод insert() на таблице SysDataBaseLog, что бы в добавленное поле писался стэк вызова (xSession::xppCallStack()). 3. На проблемную таблицу включить Журнал БД. 4. Когда начнут жаловатся, открываем журнал БД и смотрим стэк вызова. Первые два пункта мне кажется на форуме где то есть, можете поискать. Конечно заполнение данного поля приведет к распуханию БД. Поэтому лучше сделать параметр, который бы включал и выключал запись стэка вызова в БД. И включать этот параметр только при необходимости (при ловле "блох" ) P.S. мне это ОЧЕНЬ помогает в жизни, т.к. приходится работать с кодом очень низкого качества. Только так смогли выудить кучу различных багов, которые делают полный бред, но в глаза не брасаются
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.12.2013, 10:56 | #17 |
Участник
|
Да, модифа со стеком вызова очень удобная.
Помогает понять в спорных ситуациях - это система сглючила или пользователь накосячил сам, а потом дурака включил. |
|
Теги |
debugger, отладка, отладчик |
|
|