Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

НТН

Ответ 2

Вам нужно сделать это нелегко, но это не все , что сложно... Серьезно, как только вы написали шаблон один раз, он быстро скопирует/вставляет/изменяет сопоставьте имя функции в выражении 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 & """"

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

Ответ 3

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

Ответ 4

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

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

Sub MyRoutine
    (...)  ' Your code here
    call DoSomething (Var1, Var2, Var3, "MyRoutine")
    '                                       ^
    '     Present routine 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

Не так элегантно, может быть, но это сработало для меня.

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

Ответ 5

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

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