|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
Когда в Windows падает какая-то майкрософтовская софтина, то появляется окно "Отправить отчёт об ошибке Биллу?". Всегда интересовало - что ж там отправляется? Вобщем, после деплоймента проекта на удалённый сервер, появилась необходимость поддержки софта не имея возможности стоять над ним с отвёрткой. В частности стало нужно получать как можно больше информации об условиях, при которых произошла ошибка - это здорово экономит время при багофиксе. Так вот, 1. я как-то написал процедуру, которая в случае ошибки пробегалась с помощью классов Reflection по цепочки вложенных друг в друга функций и собирала список что чего вызывало пока не рухнуло. Каково же было моё удивление, когда оказалось что на продакшн-серваке эта процедура просто не стала работать! Трэйс видать отрублен... 2. тогда я добавил в софтину (интранет портал, ASP.Net 2.0), в базовый класс, от которого наследуются все страницы, глобальный список - типа стек. Во всех функциях изменил возвращаемый тип на boolean - флаг успешности или не успешности выполнения функции, а все возвращаемые значения запихнул в параметры передаваемые по ссылке (о, сколько времени занял этот мега-рефакторинг! сразу надо было так делать, да вот только умнеешь всегда после такого как уже наступил на грабли). Соответственно в каждой функции при вызове дочерней проверяется код, который она возвращает, и если он false, то дальше ничего не выполняется, в стек записывается [название класса+название функции+точка на которой всё споткнулось] и идёт выход из функции с возвратом false. В parent-функции ловится этот false, добавляется информация в стек и снова идёт выход с false. И так далее. В самом же низу - везде поставлены try-catch, которые ловят собственно все исключения. Вобщем в итоге в трэйс попадает вся цепочка функций, которые вызывались до ошибки. Это здорово помогает при отладке. 3. однако бы хотелось вместе с названиями функций добавлять в трэйс также и список входящих переменных этих функций и их значения. С помощью классов Reflection нельзя выцепить значения переменных - это я уже узнавал, выцепить их список можно - но вдруг тоже не станет работать из-за настроек сервера? Единственным решением, как мне кажется, является добавление первой строкой в каждую функцию вызова специальной процедуры, передавая ей в качестве параметров всё что получает текущая функция, которая бы сохраняла значения входящих переменных на тот случай если трэйс информация понадобится. Однако это опять сложный рефакторинг (хотя если удачно подобрать рекурсивное выражение, то дело на пару часов). Вобщем, прежде чем пускаться во все тяжкие, я хотел сначала узнать мож кто как уже организовывал передачу отладочной информации в саппорт? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2008, 22:49 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
почему не сделать обычный вывод в лог файл? поменять выходные параметры методов это ты долго думал? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2008, 11:25 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
905почему не сделать обычный вывод в лог файл? поменять выходные параметры методов это ты долго думал? Да уж... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2008, 17:14 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
AutomaterВо всех функциях изменил возвращаемый тип на boolean - флаг успешности или не успешности выполнения функции, О, это мой любимый подход. Уже пятнадцать лет как изобретены исключения - но нет, программисты под разными соусами снова и снова возвращаются к идее кодов завершения. Воистину, это лучше всех учителей доказывает тезис "не знающий ошибок истории будет повторять их снова и снова". Automaterсразу надо было так делать, AutomaterСоответственно в каждой функции при вызове дочерней проверяется код, который она возвращает, и если он false, Утираю слезы умиления. И небось еще в каждой функции стоит catch, чтобы ловить исключения и преобразовывать их в эту суперпуперофигенную систему образца 1960-го года. AutomaterВ самом же низу - везде поставлены try-catch, которые ловят собственно все исключения. О! Я знал, я знал. AutomaterВобщем, прежде чем пускаться во все тяжкие, я хотел сначала узнать мож кто как уже организовывал передачу отладочной информации в саппорт? В общем, это все делается достаточно просто. Тем более в .NET, в котором, если мне не изменяет память, класс Exception заточен как носитель дополнительной информации. Простой пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
В итоге на выходе получается примерно следующее сообщение об ошибке: Ошибка при чтении конфигурационного файла Ошибка при чтении файла Файл не найден (os error code = 2) Имя файла: c:\config.ini Это сообщение можно показать грамотному пользователю, можно записать в лог, отправить по почте итп. Оно дает вполне адекватную информацию, позволяющую исправить ошибку. Разумеется, не обязательно все пихать именно в текст сообщения - как я говорил, сколь мне помнится, Exception в .NET умеет тащить с собой список пар имя-значение, что позволяет запихнуть туда тексты sql-запросов, значения переменных и все прочее, что захочется знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2008, 21:34 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
авторя как-то написал процедуру, которая в случае ошибки пробегалась с помощью классов Reflection по цепочки вложенных друг в друга функций и собирала список что чего вызывало пока не рухнуло. просто реализовали свой call stack? ok, а остальное, имхо от лукавого. softwarer AutomaterВобщем, прежде чем пускаться во все тяжкие, я хотел сначала узнать мож кто как уже организовывал передачу отладочной информации в саппорт? В общем, это все делается достаточно просто. Тем более в .NET, в котором, если мне не изменяет память, класс Exception заточен как носитель дополнительной информации. заточен не более, чем наличие текстового поля describe (а там уж хоть супер-пупер-свой xml формат используйте). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 13:11 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
AutomaterКогда в Windows падает какая-то майкрософтовская софтина, то появляется окно "Отправить отчёт об ошибке Биллу?". Всегда интересовало - что ж там отправляется? StackTrace Automater Так вот, 1. я как-то написал процедуру, которая в случае ошибки пробегалась с помощью классов Reflection по цепочки вложенных друг в друга функций и собирала список что чего вызывало пока не рухнуло. Каково же было моё удивление, когда оказалось что на продакшн-серваке эта процедура просто не стала работать! Трэйс видать отрублен... Мня бы за такой подход уволили :-) Automater 2. тогда я добавил в софтину (интранет портал, ASP.Net 2.0), в базовый класс, от которого наследуются все страницы, глобальный список - типа стек. Во всех функциях изменил возвращаемый тип на boolean - флаг успешности или не успешности выполнения функции, а все возвращаемые значения запихнул в параметры передаваемые по ссылке (о, сколько времени занял этот мега-рефакторинг! сразу надо было так делать, да вот только умнеешь всегда после такого как уже наступил на грабли). Соответственно в каждой функции при вызове дочерней проверяется код, который она возвращает, и если он false, то дальше ничего не выполняется, в стек записывается [название класса+название функции+точка на которой всё споткнулось] и идёт выход из функции с возвратом false. В parent-функции ловится этот false, добавляется информация в стек и снова идёт выход с false. И так далее. В самом же низу - везде поставлены try-catch, которые ловят собственно все исключения. Вобщем в итоге в трэйс попадает вся цепочка функций, которые вызывались до ошибки. Это здорово помогает при отладке. Это именно то, чего не нужно было делать, ибо все ужа ДАВНО сделано отлажено и работает! Automater 3. однако бы хотелось вместе с названиями функций добавлять в трэйс также и список входящих переменных этих функций и их значения. С помощью классов Reflection нельзя выцепить значения переменных - это я уже узнавал, выцепить их список можно - но вдруг тоже не станет работать из-за настроек сервера? Единственным решением, как мне кажется, является добавление первой строкой в каждую функцию вызова специальной процедуры, передавая ей в качестве параметров всё что получает текущая функция, которая бы сохраняла значения входящих переменных на тот случай если трэйс информация понадобится. Однако это опять сложный рефакторинг (хотя если удачно подобрать рекурсивное выражение, то дело на пару часов). Вобщем, прежде чем пускаться во все тяжкие, я хотел сначала узнать мож кто как уже организовывал передачу отладочной информации в саппорт? Да, microsoft уже такое сделал. 5 лет назад. называеться Exception. try { do_some_work(); } catch (Exception ex) { SendToSupport(ex.ToString()); } ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 13:36 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarerУже пятнадцать лет как изобретены исключения 1) Для обработки ошибок в коде согласен 2) Для обработки данных ... вот тут уж извольте использование данного механизма не всегда есть хорошо ______________________________________________________ Задолбали вихри яростных атак ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:05 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
shelsoft softwarerУже пятнадцать лет как изобретены исключения 1) Для обработки ошибок в коде согласен 2) Для обработки данных ... вот тут уж извольте использование данного механизма не всегда есть Что имеется ввиду под обработкой данных? Анализ ошибок? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:14 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
shelsoft1) Для обработки ошибок в коде согласен 2) Для обработки данных ... вот тут уж извольте использование данного механизма не всегда есть хорошо Соглашусь, но к проблемам автора это явно отношения не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:19 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
авторЧто имеется ввиду под обработкой данных? Анализ ошибок? Неоднократно сталкивался (в т.ч. не только при внедрении) с такой проблемой когда 1) Алгоритм обработки данных "верный" - все тестовые примеры "шелкаются" на ура. 2) Данные, взятые из реальных источников тоже "идеальные" - выборочный контроль отдельной информации из массива данных показывает 100% достоверность 3) А на выходе, извините "г" В таком случае в т.ч. спасают коды завершения. Однако обычно такой добавочный проверочный код маскируется в а) #IF MYDEBUG ... #ENDIF б) Application.ini (mydebug=enable) Есть и другие примеры :) ______________________________________________________ Задолбали вихри яростных атак ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:25 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
shelsoft авторЧто имеется ввиду под обработкой данных? Анализ ошибок? Неоднократно сталкивался (в т.ч. не только при внедрении) с такой проблемой когда 1) Алгоритм обработки данных "верный" - все тестовые примеры "шелкаются" на ура. 2) Данные, взятые из реальных источников тоже "идеальные" - выборочный контроль отдельной информации из массива данных показывает 100% достоверность 3) А на выходе, извините "г" В таком случае в т.ч. спасают коды завершения. Однако обычно такой добавочный проверочный код маскируется в а) #IF MYDEBUG ... #ENDIF б) Application.ini (mydebug=enable) Есть и другие примеры :) Понятно, т.е. нужно обнаружить с какими параметрами ф-я работает не сильно корректно? UnitTest не для этого ли нужен? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:34 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
shelsoftВ таком случае в т.ч. спасают коды завершения. Вот тут стопроцентно несогласен. Это ситуация как раз для Exception, в дополнительной информации которого должно идти "какие именно данные левые и чем". Скажем, id обрабатываемой записи и/или значения всех полей из нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:37 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarer shelsoftВ таком случае в т.ч. спасают коды завершения. Вот тут стопроцентно несогласен. Это ситуация как раз для Exception, в дополнительной информации которого должно идти "какие именно данные левые и чем". Скажем, id обрабатываемой записи и/или значения всех полей из нее. а если что то типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 14:46 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
thejediknight Об этом я и говорю. С теми замечаниями, что SendToSupport в данном конкретном коде прилеплен совершенно не на месте, а такой Dictionary давно уже есть и нафиг не надо придумывать его еще раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 15:04 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarerВот тут стопроцентно несогласен ... Ну в принципе пожалуй вы правы если если это дешевле . Главное чтобы используемое средство реализации позволяло пропустить через такой механизм " верные " данные отобрав " неверные " допустим в пакетном режиме, дабы разобраться с ними позднее не прерывая технологический процесс. ______________________________________________________ Задолбали вихри яростных атак ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 15:12 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarer thejediknight Об этом я и говорю. С теми замечаниями, что SendToSupport в данном конкретном коде прилеплен совершенно не на месте, а такой Dictionary давно уже есть и нафиг не надо придумывать его еще раз. Я знаю, что есть, написал для наглядности. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 15:15 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
thejediknightЯ знаю, что есть, написал для наглядности. Для наглядности стоит как раз делать явные оговорки.... иначе обязательно многие воспримут как прямое руководство к действию :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 15:19 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
shelsoftГлавное чтобы используемое средство реализации позволяло пропустить через такой механизм " верные " данные отобрав " неверные " допустим в пакетном режиме, Для этого я поступаю примерно так: в основном цикле "пакетной обработки" коплю вылетающие исключения в список, а дальше, например, выплевываю их как одно суммарное (ну или иначе, по обстановке - например, если речь идет о загрузке плагинов, то логирую список проблематичных, но не торможу дальнейшую работу). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 15:23 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarer Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Трудно тут что-либо возразить опираясь на теорию. Но могу оперевшись на практику: Вы при таком подходе забьёте весь код try-catch конструкциями. У меня же они только на нижнем уровне. При вот таком вот коде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 18:18 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
shelsoft авторЧто имеется ввиду под обработкой данных? Анализ ошибок? Неоднократно сталкивался (в т.ч. не только при внедрении) с такой проблемой когда 1) Алгоритм обработки данных "верный" - все тестовые примеры "шелкаются" на ура. 2) Данные, взятые из реальных источников тоже "идеальные" - выборочный контроль отдельной информации из массива данных показывает 100% достоверность 3) А на выходе, извините "г" В таком случае в т.ч. спасают коды завершения. Однако обычно такой добавочный проверочный код маскируется в а) #IF MYDEBUG ... #ENDIF б) Application.ini (mydebug=enable) Трщи, не уходим от темы. Отладка логики - другое дело. Все "врайт-элэны" пишут... Софтварер пишет что не пишет, но скорее всего лукавит. Как чего по-быстрому надо выяснить наверняка по-быстрому вставляет вывод в файл. Ну да не об этом речь. Вобщем, я так понимаю никто список входящих параметров в каждой процедуре на тех же catch'ах в дебаг-лог не выводит? Т.е. все знают только место в котором софтина упала, а почему она упала на этих данных, хотя на тестах работала - это выясняется уже вручную, путём повторения ситуации созданной юзерами и путём вывода "врайт-элэнами" промежуточных данных в тестовый файл? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 18:27 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarer thejediknightЯ знаю, что есть, написал для наглядности. Для наглядности стоит как раз делать явные оговорки.... иначе обязательно многие воспримут как прямое руководство к действию :)Тогда [от меня] ещё одна оговорка - УДОБОЧИТАЕМОСТЬ кода. И, как следствие, снижение: стоимости замены специалиста; стоимости поддержки кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 18:30 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
AutomaterТрудно тут что-либо возразить опираясь на теорию. Но могу оперевшись на практику: Позволю себе замечание "вообще", не имея в виду использовать его как аргумент в конкретном случае: попытка противопоставить теорию практике.. редко является чертой компетентного специалиста. Не стоит двигаться в эту сторону. AutomaterВы при таком подходе забьёте весь код try-catch конструкциями. У меня же они только на нижнем уровне. :) А какая у нас конечная цель - написать короткую хорошо работающую программу? Или освободить часть кода от гнета страшных трайкэтчей, попутно раздув ее втрое в размерах и забив жутким нечитаемым кодом проверки статусов? AutomaterВы получите ошибку 'Ошибка при чтении файла'. Т.е., в общем случае, трудно установить на какой строчке произошла ошибка. Чтобы установить строчку, я использую стектрейс, но только потому, что он есть и практически бесплатен. На самом деле в хорошо написанном коде "устанавливать строчку" не требуется, по описанной информации проблема и без того видна практически сходу - это я говорю, опираясь на опыт тех времен, когда стектрейса не было. AutomaterА если каждую строчку "окальцовывать" try-catch'ами, то код будеть выглядеть пугающе. Точнее, так же, как он выглядит окольцованный if-ами. AutomaterВсе "врайт-элэны" пишут... Я бы не стал априори обзывать ламерами всех коллег. AutomaterСофтварер пишет что не пишет, но скорее всего лукавит. Софтварер за возникновение в коде "врайт-элэнов" увольняет. Вернее, предупреждает, что первый же найденный dbms_output.put_line, System.out.println, MessageBox итп станет последним, и отмазки типа "да я сейчас уберу, в релизе не будет" не прокатят. Желающих проверить это на практике он пока не встречал. Как чего по-быстрому надо выяснить наверняка по-быстрому вставляет вывод в файл. Ну да не об этом речь. AutomaterВобщем, я так понимаю никто список входящих параметров в каждой процедуре на тех же catch'ах в дебаг-лог не выводит? В общем ты еще и читать не умеешь. AutomaterТогда [от меня] ещё одна оговорка - УДОБОЧИТАЕМОСТЬ кода. Да, код с обработкой исключений действительно куда удобочитаемее. Но это не главное его достоинство, всего лишь третье по значимости. Первое - он куда надежнее, второе - легче в модификации. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 18:53 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
softwarerредко является чертой компетентного специалиста. По моему глубокому убеждению, программист должен быть "толковым", а не заумным. Это означает что он как не должен почитать Страуструпа как священную корову. Стремление писать простой код я нахожу уместным в бизнесе. softwarerЧтобы установить строчку, я использую стектрейсА у меня удалённый сервак где любой трэйс запрещён. softwarerТочнее, так же, как он выглядит окольцованный if-ами.Не хочу приводить сравнительные примеры - лень. У меня - плюс одна строчка, у него - плюс пять. Не пойму о чём разговор. softwarer AutomaterВсе "врайт-элэны" пишут... Я бы не стал априори обзывать ламерами всех коллег.Я бы не стал скрывать очевидное. softwarerКак чего по-быстрому надо выяснить наверняка по-быстрому вставляет вывод в файл. Чудно: вывод в сообщение и вывод в файл - разные методы отладки. softwarerПервое - он куда надежнее, второе - легче в модификации.Добавление if'а совершенно не уменьшает надёжность. Все критические ошибки всё равно ловятся catch'ами. При модификации легче изменить то что написано рядом с потенциально опасной строчкой, а не то что находится catch'е на несколько экранов ниже. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 20:16 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
Automater часто пишу 2 варианта: 1 вариант Код: plaintext 1. 2.
______________________________________________ Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2008, 09:49 |
|
Отправка отладочной информации саппорту?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
OUTPUT: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
any questions? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2008, 11:27 |
|
|
start [/forum/topic.php?fid=33&fpage=45&tid=1548793]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 180ms |
0 / 0 |