Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.187.232] |
|
Сообщ.
#1
,
|
|
|
Через 5 минут после запуска программы из VS2022 в режиме Debug замирает лента памяти на вкладке Средства диагностики (последнее значение памяти 42 мб), при этом индикатор загрузки ЦП работает нормально. Диспетчер задача показывает, что программа использует 8% ЦП и 32 мб памяти. Программа примерно минут 30-40 рисует графики (хотя 2 нижних графика плохо обновляются) и сбрасывает данные в файл нормально. Примерно через час программа зависает и в диспетчере задач появляется надпись "Не отвечает". При этом в диспетчере потребление памяти 55 мб, а загрузка процессора - 18%. Я с помощью средств диагностики ранее нашел причину быстрого роста потребления памяти (забыл удалить точки графика при обновлении графика Points.Clear()), а вот как обнаружить причину зависания - не знаю. В программе использую BackgroundWorker для вывода на одну из вкладок графиков, а на другую вкладку - значений. Помогите, пожалуйста, советом, как найти причину зависания. Программу прикрепил.
Прикреплённый файлcsFormsTest.zip (14,63 Кбайт, скачиваний: 48) |
Сообщ.
#2
,
|
|
|
Подключи Serilog какой нить, и выводи в лог что происходит.
Если оно сразу не зависает, а через час зависает - просто вот так сходу сложно сказать в чем проблема. Но зависать прям "Программа не отвечает", может быть из за необработанного исключения, либо из за того что ты каким то образом заблокировал главный поток программы(допустим в обработчике какого то контрола - пошел лупить бесконечный цикл, не отдавая процессорное время ГУИ). Все это отслеживается с помощью логов. 1) Во первых, вынеси из обработчиков формы всю вот эту кашу в отдельный класс, в отдельные методы. Создай хотя бы просто класс Graphics, и в нем методы в которых завязана логика, не относящаяся к гуям вообще, и вызывай эти методы в обработчиках. Так по крайней мере ты разгрузишь обработчики в ГУИ. А то сейчас у тебя там мало того что код формы и контролов, так он еще и смешан с логикой, где всякие значения в циклах вычисляются, и к форме и контролам ну вообще не имеют никакого отношения. Так тебе проще будет читать хотя бы программу, а портянку кода ты изолируешь в отдельном классе(похорошему конечно там все надо переписывать, но хотя бы так.) 2) Во вторых каждый метод, где у тебя есть тобой написанный код - оберни в try/catch, и во всех catch выводи в лог запись об ошибке, ну или хотя бы брекпоинт поставь. У тебя куча кода подозрительного со всякими unsafe(зачем то, ты там что с указателями работаешь?), да и просто куча циклов и все намешано в кучу, и очень вероятно летит исключение, которое ты не обрабатываешь, ибо просто не видишь где оно может потенциально возникнуть. 3) В третьих - протрейси(в лог выводи) вообще все что можно, ну не просто каждую строчку конечно, а хотя бы что ты делаешь, типа какая функция вызывается, что в ней творится, то будет вызвано, выводи значения в лог, и результаты вычислений от которых зависят дальнейшие вычисления, так же выводи в лог. Вдруг ты проверку где то не вставил, а оно там нулевое. Вот после этого - воспроизводи проблему. Как только все зависло, открывай лог - и смотри, где оно встало, какая ошибка случилась. И уже от этого пляши. |
Сообщ.
#3
,
|
|
|
Иногда помогает в момент зависания программы в дебаге нажать паузу и программа остановиться на том месте где на данный момент находиться.
|