Страница: 1 | 2 |
Вопрос: Проблемы с компиляцией большого проекта
Добавлено: 14.09.05 12:09
Автор вопроса: Comanche
Есть "большой" проект на VB6 - куча форм, подцеплено большое количество контролов и библиотек. Из VB IDE запуск с полной компиляцией проходит успешно: всё работает. При попытке собрать EXE-шник - на стадии "Writing EXE..." слетает с ошибками "Error loading [имя_формы], подробности смотрите в файле [имя_формы].log". Это мессаджбокс большого (нестандартного) размера, в котором вышеприведённый текст написан здоровенным шрифтом типа System или Terminal. Таких мессаджей выскакивает штук несколько, после чего Бэйсик падает окончательно (типовое окно WinXP с предложением прибить "плохое" приложение). К тому же начинается фигня с GDI-подсистемой: коверкаются все открытые окна, слетают шрифты и т.д. и т.п.
Если смотреть таск-менеджером, то слёт происходит, когда число GDI-объектов, открытых процессом VB6.EXE, доходит до 10 тысяч. Насколько я понимаю, это некая "квота".
Винда - WinXP SP2 со всеми патчами. Студия - с последним (шестым) сервис-паком.
Вместе с тем, на отдельном - "специальном сборочном" - компе с WinNT 4.0 (и с минимумом запущенных служб) сборка EXE-шника происходит более или менее нормально. Т.е. иногда наблюдается та же фигня, а иногда - EXE-шник создаётся нормально.
Понятно, что грабли связаны с утечкой GDI-ресурсов, но вот как это исправить?! Проект модифицировать нельзя - это просто догма. Пытался компилить не из VB IDE, а из командной строки - тот же результат, т.е. даёт дуба на 10 тысячах GDI-объектов (ну разве что мессаджей выскакивает поменьше).
При всём при этом, откомпилённый проект работает нормально, никаких GDI-утечек в run-time режиме не наблюдается, проблем с экраном тоже нет никаких.
Я и раньше такое наблюдал, но перезагрузка (бэйсика или в крайнем случае компа) всегда помогала. Помогала также выгрузка "лишних" служб и процессов. Однако сейчас - никакого эффекта.
Очень это всё похоже на какой-то баг бэйсика. Хотя на сайте MS ничего найти не удалось... Есть идеи?!
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #1
Добавлено: 14.09.05 13:01
Возможно VB не может справиться с большим обьектом, не хватает ресурсов компильнуть его.
Тоже самое происходит когда ты бытаешься в блокноте открыть файл в допустим мегабайт 20ть.
Единственное решение, я думаю, уменьшить сам проэкт.. Вынести некоторые его функции в DLLки, и загружать их в проэкт;
Поэтому все ПО больших размеров имеют кучу вспомагательных дров.
Есть у кого-небудь решение лучше??
Номер ответа: 2
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #2
Добавлено: 14.09.05 13:04
Гм.. какова конфигурация самого компа и какого же размера у тебя получается exeшник?!
Номер ответа: 3
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #3
Добавлено: 14.09.05 13:22
Комп - P-IV 3200MHz, 1GB RAM. Video - Intel 82865G. EXE-шник - 2.54MB.
Менять структуру проекта - не могу. Пока не могу. Обойти ограничение на 10 тысяч GDI-объектов - вряд ли возможно (это, наверное, на уровне ядра винды сделано). Но тот факт, что существует комп, на котором всё же компиляция проходит, говорит о том (имхо), что на этом компе бэйсик просто ведёт себя по-другому... вероятно - пошустрее захлопывая GDI-объекты, которые ему становятся не нужны - вот в итоге число открытых (живых) GDI-объектов и не доходит до планки в 10 тысяч штук...
Номер ответа: 4
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #4
Добавлено: 14.09.05 13:27
2.54Мб?
Друг мой, это у тебя с VB что-то или действительно 10 тысяч GdI..
Номер ответа: 5
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #5
Добавлено: 14.09.05 13:29
Размер EXE-шника тут ни при чём - разве что косвенно. Не о том речь. Да и не сказал бы я, что для "промышленного" приложения это особо много...
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 14.09.05 20:40
2Comanche, если проблемма винды, то может имеет смысл откомпилить попробовать проект на x64 версии ?? Разумеется что для этого потребуется и 64-битный проц... (пусть она сейчас и не подходит для повседневной работы, драйверов не хватает , но для тестов и пр. ерунды - вполне мона ))
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 14.09.05 21:00
Если на другом компе скопилила, значит собака скорее в самом компе а не в проекте или в басике... Вообще-то 10 тыс. GDI объектов это смешно, пока читаешь такое на форуме ) Не смешно когда действительно их у тебя 10 тыс. Мне кажеться это через чур много, т.е. надо как-то переделать проект изменив в нём GDI структуру, и/или самому пробовать избавлятся от ненужныйх GDI объектов. Если прокт нивкакую нельзя трогать, то пробуй компилировать там где оно получается, т.е. там где винда и комп не загинается..
Номер ответа: 8
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #8
Добавлено: 14.09.05 21:03
хоть бы иногда звкрывал ненужные hDC что ли ... или не в этом бан?
Номер ответа: 9
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #9
Добавлено: 14.09.05 22:05
Короче, есть некое учреждение (штук 200-300 компов), и самописная система (VB6 + хренова туча таблиц и хранимок на MS SQL Server 2000). Работает отлично, написана натурально "самородком" (ну просто "монстром бэйсика" каким-то), но... очень громоздкий проект (хотя и так всё, что можно, вынесено в DLL-ки!). Куча контролов типа от Sheridan'а, ComponentOne etc. Ничего трогать нельзя (по крайней мере - ничего "глобального" - типа "работает - ну и чудненько" Но периодически вносятся мелкие изменения, и надо бывает полностью перекомпилить EXE-проект (хотя чаще изменения касаются DLL-функционала, слава богу). И вот тут нет уверенности: а вдруг "сборочная тачка" загнётся, - и чё тады делать?! Пока нет ясности в причине вышеописанного бага - нет и уверенности... нет и возможности найти баг-фикс...
Не думаю, что досконально разберусь в чужом проекте быстрее, чем за 3-4 месяца. А ведь только тогда я бы смог ещё что-нибудь вынести из EXE в DLL... но пока рано об этом говорить - вот и парюсь
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 15.09.05 03:47
10 тыс. - это не ограничение Винды, это она просто не проверяет, когда твои GDI-объекты начинают затирать другие - я писал прогу, которая по таймеру GetDC, но потом не ReleaseDC, память, занимаемая программой росла до тех пор, пока ее зарезервированные и не освобожденные DC не затирали DC Винды, тогда сразу начинались артефакты подобные описанным тобой (сообщения шрифтом System объясняются тем же: Винда не может создать шрифт, потому что память занята GDI-объектами). Поскольку при компиляции как-то контролы уже исполняют свой код, засирая память своими GDI-объектами, ошибка вылетает при компиляции. В рабочей программе без изменения можно было бы исправить баг - повесить монитор, который отслеживает создание GDI-объектов и убивает те, к которым не было обращений или т.п. (типо GC), но как это сделать при компиляции, хз. Объясни начальству (или заказчику), чтобы не использовали кривые компоненты, или использовали их поменьше.
Номер ответа: 11
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #11
Добавлено: 15.09.05 09:14
Однако, откопал вот эту ссылку:
http://support.microsoft.com/?kbid=838283
Цитирую (фрагмент):
Похоже, всё-таки есть ограничение...
Номер ответа: 12
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #12
Добавлено: 15.09.05 09:33
При помощи одной проги посмотрел, на каких именно GDI-объектах идёт слёт. Это битмапы и кисточки. А вот как бы понять, откуда у них "ноги растут"?! Т.е. в идеале - отловить, какой именно из компонентов, участвующих в сборке проекта, является хозяином этих битмапов... такое вообще возможно?
Номер ответа: 13
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #13
Добавлено: 15.09.05 13:38
Гы, изврат поганый И Винда, как водится, вместо того, чтобы послать программу, пытающуюся создать еще объект, начинает глючить и затирать свои объекты после создания программой совершенно неестественного числа объектов
Номер ответа: 14
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #14
Добавлено: 15.09.05 14:57
Не, ну после 10-20 "кривых" мессаджбоксов она всё же пишет, что "VB has encountered a problem and must be closed" )
Номер ответа: 15
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #15
Добавлено: 15.09.05 14:58
И вообще: каким боком при компиляции могут создаваться битмапы и кисточки?!?!?! да ещё в таких количествах!