![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 04.07.2010
Сообщений: 131
|
![]()
Запускаю программу. Она работает несколько часов, потом зависает. В Windows 7 выдает ошибку "завершение работы программы.".
Пробовал запускать в Debug режиме в отладчике. Но в нем пока ни разу не зависло. Вопрос: с чем может быть связана проблема и как ее найти? Память не переполняется точно. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 03.06.2015
Сообщений: 393
|
![]()
Заглянь в четвертый файл, обязательно поставь сортировку по размеру и по возрастанию, чтобы точно найти нужный pas-файл. Даю гарантию, что зависон в 147-148 строчках
Слухай, а как давно ты играешь в игру Delphi и какие карты тебе больше всего нравятся?
Вы там держитесь.
Последний раз редактировалось TaLadno; 06.06.2016 в 22:17. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 04.07.2010
Сообщений: 131
|
![]()
я могу кинуть исходники. но вряд ли кто то станет копать 2к строчек кода.. Еще и бесплатно
![]() |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
![]()
В релизе автоматической чистки мусора и переинициализаций после всяких действий нет. Если дебажная версия не глючит, то, возможно, ожидание доступа, например, в результате блокировки при синхронизации (маловероятно, но не исключено) или монопольном доступе к объекту, или открытие уже открытого другим объектом/потоком и т.п.
А может просто зацикливается на каком-нибудь while, а точка выхода рассчитывается неверно. Это всё чисто гадание, исходил из того, с чем сам встречался. Заведи лог в файл в каждой процедуре на входе и на выходе. Так можно узнать кто виноват. Когда узнаем какая процедура виновата, то можно писать лог после каждой команды в процедуре. |
![]() |
![]() |
![]() |
#5 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]() Цитата:
Со всем прочим не видя кода разобраться невозможно. |
|
![]() |
![]() |
![]() |
#6 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Да всё что угодно может быть.
1) Утечка памяти. 2) Срыв указателей. Выход указателя за рамки массива, и тп. 2) Утечка ресурсов. К примеру закончились Handle, слишком много создали BMP. 4) Обращение к удаленному объекту.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#7 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Как бороться с багами?
1) Первым на выручку спешит компилятор со статическим анализом. При компиляции он проверит ваш код и укажет на ошибки. Надо исправить все ошибки(errors) и все предупреждения(wornings). Есть ещё. FixInsight for Delphi Статический анализ в отличии от других методов позволяет поймать больше всех багов. Суммарно в этих программах уже заложено более 200 типичных ошибок. 2) Динамический анализ. FastMem в режиме debug, ErukaLog, AQTime. Эти утилиты умеют мониторить потребления ресурсов. 2-3 вида ошибок. 3) Автоматическое тестирование. Фазинг. Мощное средство, но вам stlcrash он не поможет. Часто баги являются не уловимыми и разбегаются как блохи. Из за детерминированности программы обычно работает по всегда одним и темже веткам if'ов и case'ов. А большая часть кода остаётся не задействованной. Или задействуются в крайне редких случаях. Фазинг предназначен что бы заставить выполниться все участки кода хотя бы один раз. 4) Логи. Протокол работы позволяет отследить какие части кода работали в обычных условиях. А какие в нештатных. ErukaLog на последних тактах, перед смертью программы раскрутит стек и сбросит в лог. Пожалуй самый лучший варинт протоколирования. 5) Рефакторинг. Прежде чем выполнять 3-4 пункты. Я вам советую переписать код, так что бы он стал простым. Чем проще тем лучше. Укоротите длинные процедуры. Утоньшить широкие процедуры. Вынесете где можно if и for в отдельные функции. Как делать рефакторинг можно почитать в книге "Совершенный код". Переписав код вы просто исключите места где можно допустить ошибку. А так же их станет проще находить. 6) Пишем тесты для программы. Пожалуй последнее оружие против багов. Писать тесты надо с головой. Их писать не чуть не легче, а даже сложнее чем сами программы. Надо правильно продумывать статегию тестирования, что бы не тратить в пустую своё время, свои ресурсы. Выбирайте вначале приёмосдаточные тесты. Затем тесты по интерфейсам. А после уже тесты логик (бизнес-логик). И юнит-тесты если вы уж решите всё покрыть тестами. И помните, прохождение всех тестов не означает отсутствие багов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 07.06.2016 в 08:19. |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 04.07.2010
Сообщений: 131
|
![]() Код:
|
![]() |
![]() |
![]() |
#10 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
Цитата:
программа — запись алгоритма на языке понятном транслятору
|
||
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Зависание программы (Delphi7) | nWizz | Помощь студентам | 1 | 29.04.2014 21:24 |
MFC зависание программы | Kukurudza | Общие вопросы C/C++ | 8 | 17.02.2012 21:41 |
Зависание программы. | kardinal94 | Общие вопросы Delphi | 2 | 23.08.2010 17:36 |
CriticalSection -> зависание программы | PUH | Помощь студентам | 1 | 05.11.2009 13:19 |