VB6 IDE падает после завершения работы приложения - PullRequest
0 голосов
/ 25 октября 2018

У некоторых разработчиков в моей команде есть эта проблема.Мы можем нормально запустить наше приложение в IDE, но когда мы в конечном итоге выйдем из приложения, сама IDE будет аварийно завершать работу .

Авария принимает форму

«Visual Basic перестал работать»

enter image description here

Не имеет значения, если мы выйдем из приложения или принудительно остановим его вотладчик;тот же результат (сбой IDE).


Последовательность выхода для приложения:

  1. Пользователь выбирает «выход» из меню

  2. Вызовы обработчика событий меню Unload Me

  3. Form_QueryUnload срабатывания обработчика событий

  4. Form_Unload срабатывания обработчика событий.Это делает:

'close all sub forms
For i = Forms.Count - 1 To 1 Step -1
    Unload Forms(i)
Next

Затем сохраняет некоторые данные и затем Exit Sub.


Мы склонны управлять группойфайл с 5-6 проектами в нем.

Эта ошибка иногда кажется исчезающей, в других случаях это происходит, по-видимому, случайно.Я не знаю, какой фактор влияет на это.

Если мы на самом деле не запускаем приложение, только IDE, то оно работает нормально, и мы можем нормально работать с самой IDE.

Любойвидел это раньше?Есть идеи?Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я полагаю другой ответ правильно в своей технической оценке причины проблемы.Но также может быть полезно кратко описать процедуру, которую я использовал для сужения строк исходного кода.В моем случае эта проблема казалась ПОЛНОСТЬЮ случайной, поэтому было трудно понять, с чего начать.

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

После этого я рекурсивно прокомментировал примерно половину кода, каждый раз проверяя проблему.Каждый блок был оценен как логический - это или не вызывало проблему.Затем продолжите снова в блоке, который не исключен.

В конечном итоге (и быстрее, чем я ожидал) это привело к единственной строке кода, которая получила доступ к свойству стороннего элемента управления.

0 голосов
/ 26 октября 2018

Это наиболее определенно вызвано утечками объектов VB6, которые участвуют в создании подклассов / перехвате, а не только этих.

Что мы сделали, чтобы избавиться от этих сбоев, так это были инструменты всех наших классов (включая формыпользовательские элементы управления, дизайнеры и все, что можно создать) с помощью вызовов DebugInstanceInit и DebugInstanceTerm в соответствующих событиях Class / Form / UserControl Initialize и Terminate.

Public Sub DebugInstanceInit(sModuleName As String, sDebugID As String, oObj As Object)

Public Sub DebugInstanceTerm(sModuleName As String, sDebugID As String)

Они в основном отслеживают в любое время, сколько и какие экземпляры использует приложение.Каждому экземпляру присваивается уникальный sDebugID в DebugInstanceInit, который используется в качестве ключа в коллекции DebugIDs.Эта коллекция создается пустым в Sub Main, и когда приложение заканчивается (т.е. в основной форме Form_Unload), эта коллекция должна быть пустой или с фиксированным числом оставшихся экземпляров (например, ровно 4), в противном случае ее содержимое является видом объектовмы просачиваемся.

Что исправило сбои в среде IDE?

Обратите внимание, что экземпляр создается еще до Sub Main, что означает, что он должен оставаться Nothing при проектировании-время.Мы просто добавили в DebugInstanceInit простую проверку, например,

    If DebugIDs Is Nothing Then
        If Left$(sModuleName, 3) <> "ctx" Then
            DebugPrint "DebugInstanceInit", "mdErrorHandling", sDebugID & " " & LIB_NAME & "." & sModuleName & "." & FUNC_NAME_INITIALIZE & " (This should not happen)"
        End If
    Else
       ...
    End If

В основном это предотвратило создание всего , кроме необработанных пользовательских элементов управления, помещенных в формы, во время разработки.Это включает в себя GlobalMultiUse объекты, в том числе все, к чему UC-свойства обращаются, поскольку UC-свойства являются своего рода процедурами, к которым, безусловно, обращаются во время разработки.

Таким образом, нам пришлось сильно посыпать большую часть кода UC с помощью Ambient.UserMode проверок, подобных этой

    If Ambient.UserMode Then
        Set .Picture = LoadStdPicture(ucsPicHelp)
    End If

Оказалось, что наша глобальная функция LoadStdPicture была создана, например, для некоторых cDibSections,Приятно, что когда вы ставите точку останова на (This should not happen) отладочный оператор печати, стек вызовов показывает вам именно свойство offenting UC-нарушителя.

...