Разрушение программы при выполнении циклического алгоритма

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ozyabkin
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 16.11.2005 (Ср) 0:02

Разрушение программы при выполнении циклического алгоритма

Сообщение ozyabkin » 20.11.2021 (Сб) 17:36

Добрый день. У меня программа, написанная на VB6 с одинаковыми модулями OCX для отображения 2D графиков функций.
Столкнулся с проблемой, что в модулях OCX происходит нарушение передачи данных.
Одни модули видят значения переменных других модулей несмотря на то, что переменные объявлены как Dim или Private, а в каждой подпрограмме стоят перехваты ошибок On Error.
В результате этого при выполнении алгоритма в OCX происходит смешивание данных от модулей и нарушение функциональности, что приводит к ошибкам Out of Memory; Массив не определён и т.д. Визуально проявляется в том, что график в области UserControl прекращает прорисовываться, а рабочий экран Windows начинает прорисовывать функции графика. Далее по цепочке вылетают все остальные модули. В данном случае переход в режим пошаговой отладки не возможен. Программа VB6 слетает из памяти. Если же ошибку удаётся отловить, такую как Out of Memory, удаётся перейти в режим отладчика. При этом отрисовка на рабочем столе Windows нарушена, но после нескольких обращений к функциям VB6 иногда удаётся посмотреть, в какой подпрограмме возникла ошибка. Нажав Ctrl + L (стек обращений), видно, что уровень стека насчитывает до 15-20 уровней.

У меня такой вопрос, как можно отладить алгоритм. Ранее такого не наблюдалось.
https://disk.yandex.ru/i/jvHtF_H_QgxMZw

Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Разрушение программы при выполнении циклического алгорит

Сообщение Хакер » 21.11.2021 (Вс) 9:44

с одинаковыми модулями OCX для отображения 2D графиков функций.

Что такое «модуль OCX»? Это скомпилированная OCX-библиотека, существующая в виде .ocx-файла? Или это UserControl в рамках VB-проекта?

ozyabkin писал(а):Столкнулся с проблемой, что в модулях OCX происходит нарушение передачи данных.

Что это значит? Слишком туманная формулировка.

ozyabkin писал(а):Одни модули видят значения переменных других модулей несмотря на то, что переменные объявлены как Dim или Private

Такого быть не может.

ozyabkin писал(а):В результате этого при выполнении алгоритма в OCX происходит смешивание данных от модулей и нарушение функциональности, что приводит к ошибкам Out of Memory; Массив не определён и т.д. Визуально проявляется в том, что график в области UserControl прекращает прорисовываться, а рабочий экран Windows начинает прорисовывать функции графика. Далее по цепочке вылетают все остальные модули. В данном случае переход в режим пошаговой отладки не возможен. Программа VB6 слетает из памяти. Если же ошибку удаётся отловить, такую как Out of Memory, удаётся перейти в режим отладчика. При этом отрисовка на рабочем столе Windows нарушена, но после нескольких обращений к функциям VB6 иногда удаётся посмотреть, в какой подпрограмме возникла ошибка. Нажав Ctrl + L (стек обращений), видно, что уровень стека насчитывает до 15-20 уровней.


Звучит как свидетельство того, что в программе полный и беспросветный кошмар в архитектуру, выражающийся как на уровне изоляции доступа к данным, так и на уровне контроля за ходом выполнения, что проявляется возникновение неконтролируемых и бессмысленных рекурсий высокой глубины, утечками памяти, а если практикуются операции прямого доступа к памяти (GetMem/PutMem/CopyMemory), то возможно и порче памяти.

ozyabkin писал(а):У меня такой вопрос, как можно отладить алгоритм. Ранее такого не наблюдалось.
https://disk.yandex.ru/i/jvHtF_H_QgxMZw


А чем нам поможет скриншот? Выкладывать надо исходники. А так можно только посоветовать убрать дурь и безграмотные решения из кода, которые и вызывают всё это безобразие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ozyabkin
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 16.11.2005 (Ср) 0:02

Re: Разрушение программы при выполнении циклического алгорит

Сообщение ozyabkin » 24.11.2021 (Ср) 23:10

Спасибо за ответ.
Я обнаружил, что действительно имеется утечка памяти, за 3500 циклов обращения к 10 графикам функции (модулям ocx) оперативная память увеличивается с 47 Мбайт до 120, после чего программа разрушается.
Нашёл информацию, что действительно такое возможно. Вот ссылка
==> для платформы NET (https://www.youtube.com/watch?v=iwpz7C3738U);
==> для платформы VB ([url]https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=135371&TITLE_SEO=135371-ochistka-pamyati-pri-vypolnenii-makrosa&tags=notes%2Cвба[/url])

Подскажите, пожалуйста, какие средства диагностики имеются для VB6.

Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Разрушение программы при выполнении циклического алгорит

Сообщение Хакер » 26.11.2021 (Пт) 1:51

ozyabkin писал(а):Подскажите, пожалуйста, какие средства диагностики имеются для VB6.

Средства диагностики чего?

Средства диагностики утечек памяти для языков без автоматического управления ресурсами — вещь действительно полезная, потому что маленькая оплошность в хорошей программе может привести к той самой утечке, которую будет ой как сложно вычислить и устранить.

В VB же управление ресурсами происходит автоматически, и утечка памяти в принципе не может быть следствием маленького просчёта во вцелом хорошей программе. Если в VB-проекте есть утечка памяти, значит он написан из рук вон плохо. И тут не средство диагностики нужно, а нужно научиться программировать нормально.


Предлагаю или выложить код проекта, чтобы мы поразбирались, или задавать конкретные вопросы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ozyabkin
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 16.11.2005 (Ср) 0:02

Re: Разрушение программы при выполнении циклического алгорит

Сообщение ozyabkin » 26.11.2021 (Пт) 10:37

Большое спасибо за совет о возможной утечке памяти при обращении к API функциям. Пересмотрел все обращения и нашел две оплошности, исправив которые программа заработала.
Всего Вам хорошего.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList