Можно ли программно получить стек вызовов в VB6?

StackOverflow https://stackoverflow.com/questions/127645

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Я почти уверен, что вам придется сделать это трудным путем.На моей предыдущей работе у нас был очень элегантный процесс обработки ошибок для VB6 с компонентами DCOM.Однако в каждый метод приходилось добавлять много избыточного кода, настолько много, что у нас были собственные инструменты, позволяющие вставить все это за вас.

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

ХТХ

Другие советы

Вам придется сделать это с трудом, но это еще не все что жесткий...Серьезно, после того, как вы написали шаблон один раз, его нужно быстро скопировать/вставить/изменить, чтобы сопоставить имя функции в операторе Err.Raise с фактическим именем функции.

Private Function DoSomething(ByVal Arg as String)

    On Error GoTo Handler

    Dim ThisVar as String
    Dim ThatVar as Long

    ' Code here to implement DoSomething...

    Exit Function

Handler:
    Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description

End Function

Если у вас есть вложенные вызовы, это прекращается, когда каждая подпрограмма обращается к своему обработчику и добавляет свое имя в описание ошибки.В функции верхнего уровня вы получаете «стек вызовов», показывающий список вызванных подпрограмм, а также номер ошибки и описание фактически произошедшей ошибки.Это не идеально, поскольку вы не получаете номеров строк, но я обнаружил, что они обычно не нужны, чтобы найти путь к проблеме.(И если вам действительно нужны номера строк, вы можете поместить их в функцию и ссылаться на них в операторе Err.Raise, используя переменную Erl.Без номеров строк возвращается просто 0.)

Также обратите внимание, что внутри самой функции вы можете вызывать свои собственные ошибки со значениями интересных переменных в сообщении, например:

Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"

(В предварительном просмотре подсветка синтаксиса выглядит шатко...Интересно, как это будет выглядеть, когда опубликуют?)

Жесткий ручной способ — практически единственный способ.Если вы выедете этот вопрос, кто-то предложил инструмент под названием MZTools, который сделает за вас большую часть тяжелой работы.

Как говорили другие люди (много лет назад, я вижу...но так много людей все еще используют VB6!:) ), я думаю, что невозможно программно получить стек вызовов, если вы не используете какой-либо сторонний инструмент.

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

Sub MyRoutine
    (...)  ' Your code here
    call DoSomething (Var1, Var2, Var3, "MyRoutine")
    '                                       ^
    '     Present routine's name -----------+

    (...)  ' Your code here

End Sub


Public DoSomething (DoVar1, DoVar2, DoVar3, Optional Caller as string = "[unknown]")
    Debug.Print " DoSomething Routine Called. Caller = " & Caller

    ... ' (your code here)

End Sub

Возможно, это не так элегантно, но мне это помогло.

С уважением, Макс - Италия

Compuware (или в то время это была Numega) DevStudio для Visual Basic 6 делала это.Способ заключался в добавлении инструментов к каждому вызову, который вызывал очень маленький фрагмент, который добавлялся в стек кода.При любой ошибке он выгружал этот стек вызовов, а затем отправлял по почте или отправлял на веб-сервер всю отладочную информацию.Добавление и удаление инструментов было потенциально смертельной операцией (особенно тогда, когда мы использовали VSS в качестве системы контроля версий), но если это работало, то работало хорошо.

Как Даррел отметил, вы можете добавить что-то очень похожее, используя MZTools и настроив шаблон.Это большая работа, и, вероятно, это больше усилий, чем было бы вознаграждением, но если вам очень сложно отслеживать ошибки, это может помочь).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top