Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2016, 22:02   #1
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию Зависание программы.

Запускаю программу. Она работает несколько часов, потом зависает. В Windows 7 выдает ошибку "завершение работы программы.".
Пробовал запускать в Debug режиме в отладчике. Но в нем пока ни разу не зависло.
Вопрос: с чем может быть связана проблема и как ее найти? Память не переполняется точно.
stlcrash вне форума Ответить с цитированием
Старый 06.06.2016, 22:14   #2
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 393
По умолчанию

Заглянь в четвертый файл, обязательно поставь сортировку по размеру и по возрастанию, чтобы точно найти нужный pas-файл. Даю гарантию, что зависон в 147-148 строчках

Слухай, а как давно ты играешь в игру Delphi и какие карты тебе больше всего нравятся?
Вы там держитесь.

Последний раз редактировалось TaLadno; 06.06.2016 в 22:17.
TaLadno вне форума Ответить с цитированием
Старый 06.06.2016, 22:50   #3
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

я могу кинуть исходники. но вряд ли кто то станет копать 2к строчек кода.. Еще и бесплатно Просто мб есть какие то наиболее частые случаи, которые приводят к подобному зависанию.
stlcrash вне форума Ответить с цитированием
Старый 06.06.2016, 23:20   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

В релизе автоматической чистки мусора и переинициализаций после всяких действий нет. Если дебажная версия не глючит, то, возможно, ожидание доступа, например, в результате блокировки при синхронизации (маловероятно, но не исключено) или монопольном доступе к объекту, или открытие уже открытого другим объектом/потоком и т.п.
А может просто зацикливается на каком-нибудь while, а точка выхода рассчитывается неверно.
Это всё чисто гадание, исходил из того, с чем сам встречался.

Заведи лог в файл в каждой процедуре на входе и на выходе. Так можно узнать кто виноват. Когда узнаем какая процедура виновата, то можно писать лог после каждой команды в процедуре.
eoln вне форума Ответить с цитированием
Старый 07.06.2016, 02:32   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от stlcrash Посмотреть сообщение
Запускаю программу. Она работает несколько часов, потом зависает. В Windows 7 выдает ошибку "завершение работы программы.".
Пробовал запускать в Debug режиме в отладчике. Но в нем пока ни разу не зависло.
Вопрос: с чем может быть связана проблема и как ее найти? Память не переполняется точно.
Как правило это результат AV. (Это я о "завершение работы программы.").
Со всем прочим не видя кода разобраться невозможно.
northener вне форума Ответить с цитированием
Старый 07.06.2016, 06:31   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Да всё что угодно может быть.
1) Утечка памяти.
2) Срыв указателей. Выход указателя за рамки массива, и тп.
2) Утечка ресурсов.
К примеру закончились Handle, слишком много создали BMP.
4) Обращение к удаленному объекту.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 07.06.2016, 07:42   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 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.
Pavia вне форума Ответить с цитированием
Старый 07.06.2016, 23:46   #8
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Код:
[dcc32 Warning] BCPort.pas(107): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(107): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(138): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(138): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(179): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(179): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(268): W1000 Symbol 'Resume' is deprecated
[dcc32 Warning] BCPort.pas(946): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] BCPort.pas(946): W1002 Symbol 'TThreadPriority' is specific to a platform
[dcc32 Warning] HotKeyMgr.pas(114): W1023 Comparing signed and unsigned types - widened both operands
[dcc32 Warning] HotKeyMgr.pas(264): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[dcc32 Warning] Unit1.pas(384): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
[dcc32 Warning] Unit1.pas(384): W1000 Symbol 'StrPCopy' is deprecated: 'Moved to the AnsiStrings unit'
[dcc32 Warning] Unit1.pas(384): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
[dcc32 Warning] Unit1.pas(384): W1000 Symbol 'StrPCopy' is deprecated: 'Moved to the AnsiStrings unit'
[dcc32 Warning] Unit1.pas(563): W1057 Implicit string cast from 'AnsiChar' to 'string'
Предупреждений куча. Часть из компонента для работы с COM портами.
stlcrash вне форума Ответить с цитированием
Старый 08.06.2016, 01:25   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от stlcrash Посмотреть сообщение
Предупреждений куча. Часть из компонента для работы с COM портами.
Это плохо, но не критично.
Как вариант советую попробовать Эврику в триальном режиме. За 30 дней триала при должном усердии вполне реально отладить любую программу.
northener вне форума Ответить с цитированием
Старый 08.06.2016, 09:00   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
[dcc32 Warning] BCPort.pas(107): W1002 Symbol 'TThreadPriority' is specific to a platform
значит потоки имеют место быть
Цитата:
Да всё что угодно может быть.
+ 5) Взаимная блокировка потоков.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание программы (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