Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Утечка памяти, как посмотреть список загруженных в память UserControl-s / 25 сообщений из 26, страница 1 из 2
22.08.2009, 16:16
    #36158187
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
VB6

При некоторых обстоятельствах (если кому-то интересно, напишу каких) возникает такая ситуация: юзерконтрол остается загруженным в память, несмотря на то, что форма, на котором он был расположен, выгружается из памяти. Контрол таким образом "повисает в воздухе". Если открыть/закрыть эту форму еще раз, повиснет еще один экземпляр. Если контрол "тяжелый" а форму открывают часто, через некоторое время возникает "OutOfMemory" и приложение падает.

Как сделать так, чтобы этого не происходило, я разобрался и в новых формах этого уже не будет. Однако, проект большой и умозрительно просмотреть все старые формы на предмет зависающих контролов нереально. Проще помониторить память на эту тему, но не знаю, как это сделать, подскажите плиз.
...
Рейтинг: 0 / 0
26.08.2009, 23:46
    #36165026
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
up :(
...
Рейтинг: 0 / 0
28.09.2009, 23:10
    #36221602
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
up
...
Рейтинг: 0 / 0
29.09.2009, 09:34
    #36221874
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Shocker.Pro,

Ну смотрите, вам нужно обойти все формы и найти на них все usercontrol's, так все они потенциальны будут загружены в память. ОБойти можно попробовать через VB IDE.
...
Рейтинг: 0 / 0
29.09.2009, 09:41
    #36221896
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Что значит ОБОЙТИ? Руками перетряхнуть?

в проекте полторы сотни форм и тысячи контролов на них
...
Рейтинг: 0 / 0
29.09.2009, 09:48
    #36221905
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Shocker.Pro,

Во-первых, я написал , что можно через VB IDE. Для VBA - это возможно через VBIDE ( программный доступ к проекту)
Во-вторых, можно обойти ( не руками, а программно) все файлы *.frm ( или *.frx) и найти в них определения UserControls.
...
Рейтинг: 0 / 0
29.09.2009, 09:57
    #36221914
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Я не понял, допустим я нашел все определения. Что мне с ними делать дальше? Моя задача найти все, что осталось в памяти в рантайме.
...
Рейтинг: 0 / 0
29.09.2009, 09:59
    #36221921
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Shocker.Pro,

Ну смотрите. Я предположил, что вы через файлы найдете все usercontrols и добавите для них код, исключающий утечку памяти.
...
Рейтинг: 0 / 0
29.09.2009, 10:08
    #36221931
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Я и так могу найти все юзерконтролы, они все лежат в отдельном проекте в группе. Проблема в том, что "зависание" контрола в памяти НЕ ЗАВИСИТ от кода самого контрола, а зависит от кода формы или класса, из-за которых контрол не был терминирован извне автоматически средой выполнения.
...
Рейтинг: 0 / 0
29.09.2009, 11:30
    #36222126
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
> Автор: Shocker.Pro
> Я и так могу найти все юзерконтролы, они все лежат в отдельном проекте в группе. Проблема в том, что "зависание"
> контрола в памяти НЕ ЗАВИСИТ от кода самого контрола, а зависит от кода формы или класса, из-за которых контрол не был
> терминирован извне автоматически средой выполнения.

Пройдись по всем классам и добавь логирование в Initialize и Terminate, потом проанализируй получившийся лог, на предмет
есть запись о создании объекта - нет записи об уничтожении, и вычмсляй, где они создаются и почему не освобождаются.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.09.2009, 11:56
    #36222216
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Утечки памяти происходят при загрузке-выгрузке форм и юзерконтролов. Полторы сотни форм в VB6 это слишком круто для него. Утечки будут даже в идеально вылизанном проекте, они есть даже в проектах с одной формой, просто до какого-то предела они несущественны и с ними можно мириться.

Можно уменьшить утечки, если юзерконтролы засунуть в отдельный ocx.

Jah loves you.
...
Рейтинг: 0 / 0
29.09.2009, 12:15
    #36222290
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Игорь Горбонос
Пройдись по всем классам и добавь логирование в Initialize и Terminate, потом проанализируй получившийся лог, на предмет
есть запись о создании объекта - нет записи об уничтожении, и вычмсляй, где они создаются и почему не освобождаются.

Ну это, конечно, первое, что приходит в голову, просто достаточно трудоемко. Я предполагаю, что есть какой-то простой доступ к "куче", или как там называется вся совокупность созданных объектов...

AntonariyУтечки памяти происходят при загрузке-выгрузке форм и юзерконтролов. Полторы сотни форм в VB6 это слишком круто для него. Утечки будут даже в идеально вылизанном проекте, они есть даже в проектах с одной формой, просто до какого-то предела они несущественны и с ними можно мириться.

Можно уменьшить утечки, если юзерконтролы засунуть в отдельный ocx.


Контролы засунуты в отдельный ocx.
Просто есть утечки, с которыми легко побороться, стоит только их идентифицировать.
...
Рейтинг: 0 / 0
29.09.2009, 12:23
    #36222311
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Создайте проект с пустой формой, модулем и скомпилируйте проект.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub Main()
For x =  1  To  1000 
    Load Form1
    Form1.Show
    Unload Form1
    DoEvents
Next
MsgBox "done"
End Sub
Внимательно наблюдайте за расходом памяти, а потом попробуйте устранить утечку.

Jah loves you.
...
Рейтинг: 0 / 0
29.09.2009, 12:37
    #36222359
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
AntonariyВнимательно наблюдайте за расходом памяти, а потом попробуйте устранить утечку.


Зачем вы передергиваете?
Свою проблему я изложил в первом посте.

Человек спокойно работает в этом проекте весь рабочий день, буквально СОТНИ раз открывая и закрывая формы, в который нет указанной мной проблемы и проблем не наблюдается.

В то же время открывая формы, точно обладающие указанной мной проблемой, на десятый раз открытия этой формы, он получает "Out Of Memory" или "Отправить отчет..."

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

P.S. Указанная вами утечка хорошо проявлялась на win95/98, начиная с 2000-х этот момент заметно пофиксили...
...
Рейтинг: 0 / 0
29.09.2009, 12:42
    #36222383
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
AntonariyВнимательно наблюдайте за расходом памяти, а потом попробуйте устранить утечку.


Сделал. Расход памяти (той, которую показывает диспетчер задач) не пронаблюдал.

Подскажите, куда смотреть, чтобы увидеть.
...
Рейтинг: 0 / 0
29.09.2009, 13:46
    #36222591
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Shocker.ProЗачем вы передергиваете?Зачем вы инкриминируете мне то, чего я не делаю?
Свою проблему я изложил в первом посте.Я заметил. Ваша проблема не имеет решения. Вернее имеет одно решение и одно недорешение, но вас они не устроят.
1) Переход на другую платформу.
2) Разнесение логики на 2 и более разных форм.

точно обладающие указанной мной проблемойВсе формы обладают этой проблемой, какие-то больше, какие-то меньше. Особенно имеют те, где используется динамическое создание контролов.

Указанная вами утечка хорошо проявлялась на win95/98, начиная с 2000-х этот момент заметно пофиксили...К версии Windows она не имеет отношения, пофиксили движок VB. Какой версии у вас MSVBVM60.DLL? Последняя 6.0.97.82, проверьте заодно у клиентов.

Сделал. Расход памяти (той, которую показывает диспетчер задач) не пронаблюдал.

Подскажите, куда смотреть, чтобы увидеть.Смотреть именно там, у меня расход был пару килобайт. Можно цикл увеличить или контролов накидать чтобы заметнее было.

Jah loves you.
...
Рейтинг: 0 / 0
29.09.2009, 13:51
    #36222614
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Кстати Out Of Memory это не утечка, это ваш рукотворный баг. При больших утечках проект просто вылетает с непредвиденной ошибкой и попыткой отправить отчет самизнаетекуда.
Воспользуйтесь советом Игоря и добавьте счетчик инициализаций/удалений контролов.

Jah loves you.
...
Рейтинг: 0 / 0
29.09.2009, 14:02
    #36222649
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
AntonariyЗачем вы инкриминируете мне то, чего я не делаю?
AntonariyВсе формы обладают этой проблемой, какие-то больше, какие-то меньше. Особенно имеют те, где используется динамическое создание контролов.

Извините, вы не передергиваете, вы просто игнорируете топовый пост. В результате вы достаете проблему, которую я не поднимал , и пытаетесь предложить решение, которое мне не нужно.

Есть конкретная проблема, с конкретной утечкой памяти, которую можно решить конкретным способом. А с общей философией утечки памяти в VB - это в другую ветку.

AntonariyShockerСвою проблему я изложил в первом посте.Я заметил. Ваша проблема не имеет решения.

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

AntonariyСмотреть именно там, у меня расход был пару килобайт. Можно цикл увеличить или контролов накидать чтобы заметнее было.

Изложенная мной в топпосте проблема не связана с утечкой памяти, выделенной приложению, которую видно в диспетчере задач (потому никакого существенного увеличения памяти перед падением программы в диспетчере задач не наблюдается). Видимо, заканчивается какая-то конкретная область памяти, выделенная средой исполнения для юзерконтролов.
...
Рейтинг: 0 / 0
29.09.2009, 14:05
    #36222663
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
В общем, в Initialize нужно добавить увеличение счетчика, в Terminate — уменьшение. При закрытии формы счетчик должен быть равен нулю.

Jah loves you.
...
Рейтинг: 0 / 0
29.09.2009, 15:19
    #36222911
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
> Автор: Shocker.Pro
> Ну это, конечно, первое, что приходит в голову, просто достаточно трудоемко.

Т.е. ты хочешь сказать, что такой большой проект не снабжен средствами логирования происходящих действий?
Ну если все делать руками, это конечно долго, напиши програмку, которая будет открыввать *.frm *.cls и др. и добавлять 2
метода, если их там ещё нет с определенным кодом, если методы есть, то просто определенный код логирования и все, делов
на пару часов.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.10.2009, 01:25
    #36236313
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Игорь Горбонос
> Автор: Shocker.Pro
> Ну это, конечно, первое, что приходит в голову, просто достаточно трудоемко.

Т.е. ты хочешь сказать, что такой большой проект не снабжен средствами логирования происходящих действий?
Ну если все делать руками, это конечно долго, напиши програмку, которая будет открыввать *.frm *.cls и др. и добавлять 2
метода, если их там ещё нет с определенным кодом, если методы есть, то просто определенный код логирования и все, делов
на пару часов.


Не снабжен за ненадобностью. Обработка данных логируется (при необходимости) на SQL-сервере, это всего лишь клиент.

Ну что ж, значит придется сделать. Просто в папке, которую создает энтерпрайз-студия при установке, есть куча утилит, назначение которых я представляю себе довольно смутно. Вот и предполагал, что там должно быть что-то готовое для мониторинга объектов в памяти с целью отладки.
...
Рейтинг: 0 / 0
07.10.2009, 09:37
    #36236534
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Shocker.ProСоответственно, я хочу вычислить те формы, которые обладают такой проблемой, но я об этом не знаю, потому что либо их редко используют, либо зависающие в памяти контролы не такие тяжелые.

Зависший контрол не даст выгрузиться своей форме. Соответственно можно просто логировать время Inizialisaze/Terminate форм (как тут уже говорилось) - лучше в табличку (хотя бы в MDB). Соответственно по ней будет видно какие формы остались открыты в зависшем приложении и уже можно будет делать выводы...
...
Рейтинг: 0 / 0
07.10.2009, 11:36
    #36236906
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
AndrFЗависший контрол не даст выгрузиться своей форме. Соответственно можно просто логировать время Inizialisaze/Terminate форм (как тут уже говорилось) - лучше в табличку (хотя бы в MDB). Соответственно по ней будет видно какие формы остались открыты в зависшем приложении и уже можно будет делать выводы...

1) читайте тему с первого поста! ФОРМА ВЫГРУЖАЕТСЯ. Terminate у формы СРАБАТЫВАЕТ. Не выгружается именно контрол.

2) для описанного вами случая городить огород не требуется, достаточно заглянуть в коллекцию Forms
...
Рейтинг: 0 / 0
07.10.2009, 14:15
    #36237475
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
Shocker.Pro1) читайте тему с первого поста! ФОРМА ВЫГРУЖАЕТСЯ. Terminate у формы СРАБАТЫВАЕТ. Не выгружается именно контрол.

Именно контрол или компонент? CDO, к примеру, в свое время довольно усердно жрало память до полного ее исчерпания (может и сейчас жрет - давненько на этот счет не пробовал)...
...
Рейтинг: 0 / 0
07.10.2009, 14:36
    #36237536
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти, как посмотреть список загруженных в память UserControl-s
AndrFИменно контрол или компонент?

ActiveX UserControl
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Утечка памяти, как посмотреть список загруженных в память UserControl-s / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]