Автоматизация отладки проекта ...
Сталкнулся с такой проблемой при отладке программы:
Проект очень большой, многопользовательский и
он периодически (раз в 3-5 дней) вылетает с ошибками доступа к памяти...
Под отладчиком столько не проработаешь, особенно при большом кол-ве пользователей, а прописывать
во все места перехватчики исключений и разные
отладочные куски кода вставлять - работы минимум на неделю.
ЕСТЬ ИДЕЯ автоматизировать написание отладочного кода - для этого написать программу, которой скармливаем например такой код:
{
TMemoryStream * MS=NULL;
MS= new TMemoryStream;
if (MS==NULL) return;
// какой-то код .....
delete MS;
}
А программа на выходе делает так:
{
if(START_F>0) Log (START_F,"TFormProgram","FunctionA","")
TMemoryStream * MS=NULL;
try{
MS= new TMemoryStream;
}catch(...)
{
if(ERR_NEW>0) Log (ERR_NEW,"TFormProgram","FunctionA","MS= new TMemoryStream")
}
if (MS==NULL) return;
// какой-то код .....
try{
delete MS;
}catch(...)
{
if(ERR_DELETE>0) Log (ERR_DELETE,"TFormProgram","FunctionA","delete MS;
")
}
if(END_F>0) Log (END_F,"TFormProgram","FunctionA","")
}
Нужно чтобы эта программа автоматически добавляла к
файлу заголовок и определение функции Log (...)
и набор преременных START_F,END_F,ERR_NEW,ERR_DELETE - и т. п. ...
смысл которых - управление работой функции Log (...) - они должны инициализироваться из LogIni файла, который разработчик может править и тем самым - управлять глубиной отладочной информации без перекомпиляции проекта.
Конечно и фунция Log (...) не так проста - в конечном итоге нужно получить базу данных, содержащюю инф. о том какие функции сколько раз вызывались и в каком потоке, сколько времени потратили на выполнение, если в программе произошла ошибка - какая фунция в этот момент выполнялась и что делала, какие значения переменных были переданы функции....
Таким образом получается 2 версии проекта :
-1- "чистый вариант" - без отладочного кода , который читается легко и с ним работает программист
-2- "отладочный вариант" - отдаем тестовым пользователям, пусть глюки отлавливают
Написать такое можно сравнительно быстро, НО
ВОТ ВОПРОС - МОЖЕТ ТАКОЕ УЖЕ ЕСТЬ ?
Кто что знает или кто что думает по этому вопросу ?
А нельзя сразу писать нормально?
Если отладку сразу вставлять в код
-1-
Значительно ухудшается читаемость кода.
-2-
20-30% кода в программе будет повторяться - а все что часто повторяется ДОЛЖНО быть автоматизировано.
Или имеется ввиду писать нормально - это без ошибок ?
Ну это не реально,
особенно при написании многопользовательского сервера, чем я сейчас и занимаюсь, - предоставление самых разнообразных сервисов по множеству протоколов и работает 24/7/365 с неограниченным кол-вом пользователей, с внутренней логикой распределения нагрузки
я даже не в состоянии предсказать все возможные варианты развития событий, особенно при условии использования не совсем корректных клиентских программ, и различного качества каналов передачи данных , которыми эти клиенты подключаются.
...
ВОТ ВОПРОС - МОЖЕТ ТАКОЕ УЖЕ ЕСТЬ ?
...
Это было здесь ftp://194.226.246.33/
Это было здесь ftp://194.226.246.33/
- ошибка при попытке доступа к серверу, анонимного пользователя не пускает.
А что там есть ? :)
Если отладку сразу вставлять в код
-1-
Значительно ухудшается читаемость кода.
-2-
20-30% кода в программе будет повторяться - а все что часто повторяется ДОЛЖНО быть автоматизировано.
Или имеется ввиду писать нормально - это без ошибок ?
Ну это не реально,
особенно при написании многопользовательского сервера, чем я сейчас и занимаюсь, - предоставление самых разнообразных сервисов по множеству протоколов и работает 24/7/365 с неограниченным кол-вом пользователей, с внутренней логикой распределения нагрузки
я даже не в состоянии предсказать все возможные варианты развития событий, особенно при условии использования не совсем корректных клиентских программ, и различного качества каналов передачи данных , которыми эти клиенты подключаются.
Можно многого достичь, используя наследование, полиморфизм и обобщённое программирование. Например, сосредоточить отладочный сервис в малогабаритных шаблонных классах-примесях и инстанцировать по мере необходимости. Не будет потерь ни в читабельности, ни в повторяемости.
Читайте литературу по этой теме.
Если вы не в состоянии предсказать весьма ограниченный набор вариантов корректного развития событий, то, может быть, вам ещё рано писать многопользовательские серверы с претензией на автоматическую генерацию отладочного кода?
Можно многого достичь, используя наследование, полиморфизм и обобщённое программирование. Например, сосредоточить отладочный сервис в малогабаритных шаблонных классах-примесях и инстанцировать по мере необходимости. Не будет потерь ни в читабельности, ни в повторяемости.
Читайте литературу по этой теме.
Если вы не в состоянии предсказать весьма ограниченный набор вариантов корректного развития событий, то, может быть, вам ещё рано писать многопользовательские серверы с претензией на автоматическую генерацию отладочного кода?
Всем привет !
Сталкнулся с такой проблемой при отладке программы:
<skip>
Попробуй ввести в процесс разработки такую практику, как TDD (Test Drive Development - разработка через тестирование).
Test Drive Development - разработка через тестирование
Спасибо, куплю книжку, прочитпаю что за зверь.
Но есть подозрение, что это не совсем то, что нужно - если сравнивать постановку задачи (см. мой первый пост) и отзывы о технологии TDD на сайте
http://www.rsdn.ru/Forum/Message/818404.htm
to fellow:
По поводу твоих нападок
- я не обижаюсь, конечно я занаю про классы и наследованиеи полиморфизм и все это можно успешно применять ЕСЛИ заранее знать какова будет конечная архитектура приложения. А это совсем не очевидно.
В моем случае я разработал не менее 3 различных вариантов внутреннего устройства сервера и мне необходимо оценить производительность, эффективность некоторых решений.
Насчет кол-ва вариантов возможного развития событий -
я конечно не самый хороший математик, но по самым простым прикидкам кол-во возможных состояний
одного сеанса связи одного пользователя не менее 2034 , а скорее всего на несколько порядков больше. Откуда ?
а вот :
s_count=12 -кол-во используемых сокетов при проксировании одного FTP соединения одного пользователя (я не буду обьяснять механизм проксирования FTP - но это так);
s_state=12 -кол-во состояний сокета, которые должен обрабатывать мой сервер (указан минимум, на самом деле- больше - это с учетом виртуальных состояний, которые возникают исходя из логики работы сервера)
Login=2 - есть или нет разрешение на использование сервиса
Redirect=2 - есть или нет автоматическое перенаправление
Block=2 - есть или нет блокировка запрошеного сервера
System=2 - есть или нет системные ресурсы для выполнения - например хватает ли оперативной памяти и т.п.
многое, многое другое...
12*12*2*2*2*2=2034 * многое другое...
НАСЧЕТ рано мне писать такие сервисы - это ты хорошо пошутил, смешно :)
Вспомни первые версии Windows - как они глючили и падали, вероято Биллу Гейтсу ,было рано писать такие вещи... :)
Затем он встроил-таки отладку в саму операционную систему - см. запрос на отправку отчета ошибке разработчикам - и теперь все работает заметно лучше.
Хотя и не идеально работающий , но все-же мой сервер уже несколько месяцев активно используется и прокачивает гигабайты траффика (при возникновении ошибок соответствующий поток просто перезапускается, а т.к. ошибки возникают раз в неделю , то это не заметно)
РЕЗЮМЕ
Я говорю о механизме , автоматически добавляющем отладочный real-time функционал в абсолютно любой проект по выбору разработчика.
Главное я понял - такого механизма за 2-3 дня я не найду, а этого времени мне достаточно, чтобы реализовать эту идею самому.