2008-09-24 4 views
12

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

ответ

9

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

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

HTH

+0

Это единственный способ, которым я знаю, чтобы сделать это. Как предложено ниже, MZTools может помочь. В шаблоне для обработчика ошибок, если вы собираетесь распространять ошибку, добавьте текущую функцию/к югу от err.source. – 2008-11-11 05:08:14

+0

Я убежден, что нет никакого способа, чтобы сделать то, что я просил, поэтому я принимаю этот ответ. – raven 2009-09-03 14:16:14

3

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

+0

Я использую MZTools в течение многих лет, и я согласен, что это отличный инструмент. Тем не менее, я искал альтернативу «трассировке стека бедных». Я не думал, что есть один, но я думал, что здесь не может обидеться. – raven 2008-09-26 02:26:19

0

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

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

11

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

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

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

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

+1

upvoted для письма нагрузки ПК – rpetrich 2008-10-25 12:44:06

1

Как говорили другие люди (лет назад, я вижу ... но есть так много людей, которые все еще используют 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 

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

С уважением, Max - Италия