|  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
			   Я локализовал то место в коде, которое в конечном счете инициирует ошибку, и куда выполнение при данном наборе условий по идее не должно "проваливаться".НО: код очень сложный, многоуровневый, этот набор условий - большой, воссоздать ситуацию и вычленить именно то условие или событие, которое привело к ошибке - трудно да и нет времени.  Если это - стандартный код (типа сопоставления или сводного), то вам можно только посочувствовать, если же код самописный... ну вы поняли  Как писал Джон Роббинс в своей широко известной в узких кругах книге, лучший способ отладки - это вообще не доводить дело до отладки. Можно использовать, к примеру, контрактный подход и проверять пред-/пост-условия (см. также вспомогательные классы для этого). Это обычно позволяет быстро выявлять проблемы и не допускать распространения кривых данных по системе. "Минус" такого подхода в том, что его преимущества не даются бесплатно - требуются определенные трудозатраты на этапе написания кода, а если код уже написан, то придется его доработать напильником. Если сложность кода в том, что есть куча итераций обработки данных, в ходе которых состояния объектов и/или данные в таблицах меняются нетривиальным образом, то тут можно приделать некий код трассировки, который бы выводил куда-либо текущую информацию о наиболее важных объектах/таблицах (тем более если используются временные таблицы). Затем можно проанализировать трассировку и попытаться понять, что пошло не так.По-моему, в Аксапте штатно нет средств, позволяющих получить "снимок" всего состояния сессии, включая локальные переменные значимых и ссылочных типов каждого фрейма стека выполнения. В 4-ке работает Trace Parcer, но в вашем сценарии, я так понимаю, он не подходит (кажется, 4-ка еще не умеет циклически перезаписывать файл трассировки, ограничив его определенным размером). В общем, без доработки кода напильником с целью получения некой "телеметрии" тут, мне кажется, не обойтись. | 
|  | |
| За это сообщение автора поблагодарили: 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, отладка, отладчик | 
|  | 
| 
 |