Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Out of memory - как выявить причину / 16 сообщений из 16, страница 1 из 1
12.07.2013, 14:16
    #38329400
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
По форуму и по Гуглу ничего найти не смог.
Проблема в том, что ошибка возникает на некоторых компьютерах пользователей, тогда как на моем компьютере всё работает отлично.
Известно только, что ошибка возникает перед вызовом Sub.
У меня идет достаточно подробное логирование событий, но и это мне ничего не дает в этом случае, т.к. ошибка возникает до того, как начнет выполняться процедура. Код наподобие такого:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub main()
Dim b As String
MsgBox "Сообщение 1: Загрузка начата"
b = "123"
MsgBox "Сообщение 2: Переменной b присвоено значение 123"
'Дальше программа не работает - Out of memory
Call tutu
End Sub

Private Sub tutu()
MsgBox "Сообщение 3: Начинаю выполнять процедуру tutu"
Dim a As String
a = "123"
MsgBox "Сообщение 4: Начинаю загружать форму"
Form1.Show
MsgBox "Сообщение 5: Закончил выполнять процедуру tutu"
End Sub


Т.е. я вижу только "сообщение 1" и "сообщение 2". Дальше идет сообщение об ошибке

Повторюсь: код другой. Это только для демонстрации фразы "ошибка возникает до того, как начнет выполняться процедура".
Код привести не смогу, т.к. он очень большой и его не целесообразно публиковать.

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

Можно ли считать, что параллельно ничего больше не происходит при загрузке Main? (имеется в виду, что сообщение 1 - действительно самое первое что произошло)
Играет ли роль содержимое формы Form1 в данной ошибке?
...
Рейтинг: 0 / 0
12.07.2013, 14:25
    #38329416
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
donpaulsВ проекте множество форм и контролов.Я сталкивался с такой проблемой
а) когда на форме было очень много юзерконтролов (правда вроде с появлением 2000х виндов это прекратилось)
б) когда при выгрузке формы не выгружались юзерконтролы из памяти, потому что имелись ссылки на объекты внутри них наружу или наоборот (если похоже - найду пару своих тем) - но это происходило при неоднократной загрузке-выгрузке форм.
ну или Spy++ тебе в помощь
...
Рейтинг: 0 / 0
12.07.2013, 14:39
    #38329448
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Может еще быть переполнение стека при рекурсивном вызове процедуры
...
Рейтинг: 0 / 0
12.07.2013, 14:44
    #38329461
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Shocker.Pro,

Юзерконтролов нет ни одного в проекте.

Сомневаюсь также за реализацию "слушателя оконных сообщений", который загружается при загрузке формы:

Код: vbnet
1.
2.
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
    ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long


Код: vbnet
1.
OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf NewWindowProc) 


взято отсюда: Обмен сообщениями между двумя СВОИМИ приложениями

После применения данной функции теперь очень часто стала появляться ошибка Out of memory при работе с проектом. Однако скомпилированный файл данных ошибок на моем компе не вызывает.
...
Рейтинг: 0 / 0
12.07.2013, 14:44
    #38329462
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
donpaulsИграет ли роль содержимое формы Form1 в данной ошибке?если она не загружается до возниконовения ошибки, то - нет
...
Рейтинг: 0 / 0
12.07.2013, 14:45
    #38329467
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
donpaulsПосле применения данной функции теперь очень часто стала появляться ошибка Out of memory при работе с проектом.похоже, что ты где-то проглядел рекурсивный вызов этого обработчика. Отключи сабклассинг и проверь.
...
Рейтинг: 0 / 0
12.07.2013, 14:51
    #38329483
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Shocker.Proпохоже, что ты где-то проглядел рекурсивный вызов этого обработчикаНет, была бы ошибка про call stack.
...
Рейтинг: 0 / 0
12.07.2013, 14:52
    #38329485
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
AntonariyShocker.Proпохоже, что ты где-то проглядел рекурсивный вызов этого обработчикаНет, была бы ошибка про call stack.не всегда, иногда вылетает и с Out of memory
...
Рейтинг: 0 / 0
12.07.2013, 15:42
    #38329582
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Shocker.ProdonpaulsПосле применения данной функции теперь очень часто стала появляться ошибка Out of memory при работе с проектом.похоже, что ты где-то проглядел рекурсивный вызов этого обработчика. Отключи сабклассинг и проверь.
Как это сделать?
...
Рейтинг: 0 / 0
12.07.2013, 15:44
    #38329587
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Закомментирвать вызов SetWindowLong.
...
Рейтинг: 0 / 0
13.07.2013, 11:55
    #38330196
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Shocker.Proпохоже, что ты где-то проглядел рекурсивный вызов этого обработчика
Что значит рекурсивный вызов ?

Если я отключаю сабклассинг, то в процессе работы с проектом ошибка Out of memory не появляется. Но это я и так знаю, что сабклассинг влияет на ошибку в процессе выполнения проекта.
Причем ошибки возникают каждый раз в разных местах. Нету такого, чтобы что-то одно вызывало ошибку. Чаще всего возникает ошибка при попытке показать какую-нибудь форму.
Да, и ещё: после такой ошибки как правило проект либо зависает (приходится убивать через диспетчер задач), либо не зависает (но запустить выполнение его уже не удается, приходится закрывать и открывать заново)
...
Рейтинг: 0 / 0
13.07.2013, 12:01
    #38330199
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
И кстати ещё: иногда при просмотре форм в редакторе в режиме дизайна или вообще любых действий с проектом (например поиск текста) - проект вылетает.
Началось это вроде как я стал использовать юзерконтролы. Но сейчас их ни одного нет в проекте - а всё равно вылетает. Может ли это быть из за сабклассинга?
...
Рейтинг: 0 / 0
13.07.2013, 12:04
    #38330200
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
рекурсивный вызов - вызов самого себя - имеется.
Так он нужен или не нужен?
...
Рейтинг: 0 / 0
13.07.2013, 13:19
    #38330225
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
donpaulsрекурсивный вызов - вызов самого себя - имеется.
Так он нужен или не нужен?
Обработчик оконной процедуры порождает некое действие, которое инициирует SetWindowLong по какой-то причине - и так по кругу, пока память или стек не закончатся
...
Рейтинг: 0 / 0
16.07.2013, 12:32
    #38332541
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
Shocker.ProОбработчик оконной процедуры порождает некое действие, которое инициирует SetWindowLong по какой-то причине - и так по кругу, пока память или стек не закончатся
Так а что надо делать, чтобы этого не было?
donpaulsТак он нужен или не нужен?
Я пробовал удалить рекурсивный вызов - так прога вообще тогда не загружается..
...
Рейтинг: 0 / 0
16.07.2013, 12:39
    #38332553
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Out of memory - как выявить причину
donpaulsShocker.ProОбработчик оконной процедуры порождает некое действие, которое инициирует SetWindowLong по какой-то причине - и так по кругу, пока память или стек не закончатся
Так а что надо делать, чтобы этого не было?В смысле? Условно говоря, ты создаешь бесконечный цикл, а потом спрашиваешь, что делать? Не делать бесконечный цикл, что еще можно посоветовать при отсутствии кода.
donpaulsdonpaulsТак он нужен или не нужен?
Я пробовал удалить рекурсивный вызов - так прога вообще тогда не загружается..так откуда нам знать, нужен он тебе или не нужен. рекурсия может использоваться в определенных алгоритмах, например при обходе деревьев, но бесконечная рекурсия - это ошибка программиста. И, напоминаю, проблема с бесконечной рекурсией - это всего лишь мое предположение. Ты уже нашел, что дело в сабклассинге, так рой дальше, отключай функциональность по частям.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Out of memory - как выявить причину / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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