VB6에서 프로그래밍 방식으로 통화 스택을 검색 할 수 있습니까?

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

  •  02-07-2019
  •  | 
  •  

문제

함수에서 오류가 발생하면 특히 그 기능이 12 개의 다른 장소에서 호출 될 때 이벤트 순서를 알고 싶습니다. VB6에서 통화 스택을 검색하는 방법이 있습니까? 아니면 어려운 방법으로 수행해야합니까 (예 : 모든 기능 및 오류 핸들러의 로그 항목 등)?

도움이 되었습니까?

해결책

나는 당신이 어려운 방법으로해야한다고 확신합니다. 이전의 작업에서, 우리는 DCOM 구성 요소가있는 VB6에 대해 매우 우아한 오류 처리 프로세스를 가졌습니다. 그러나 모든 방법에 추가되어야하는 많은 중복 코드였습니다.

나는 그 구현에 대해 너무 많은 통찰력을 제공 할 수 없습니다 (둘 다 대부분의 것을 잊어 버렸고 그들이 그것을 무역 비밀이라고 생각할 가능성이 있기 때문입니다). 눈에 띄는 한 가지는 런타임에 메소드 이름을 도출 할 수 없어 문자열 변수로 추가되었다는 것입니다 (일부 개발자는 도구를 사용하는 대신 복사 할 수 있으며 거짓말을하는 오류 스택으로 이어질 것입니다. ..).

HTH

다른 팁

당신은 그것을 어려운 방법으로해야하지만, 그것은 정말로 전부가 아닙니다. 저것 템플릿을 한 번 작성한 후에는 템플릿을 한 번 작성하면 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 명령문에 참조 할 수 있습니다.

또한 함수 자체 내에서는 메시지의 흥미로운 변수 값으로 자신의 오류를 다음과 같이 제기 할 수 있습니다.

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

(구문 하이라이트는 미리보기에서 Wonky처럼 보입니다 ... 게시 될 때 어떻게 보일지 궁금합니다.)

단단하고 수동적인 방법은 거의 유일한 방법입니다. 체크 아웃하면 이것 질문, 누군가가 당신을 위해 많은 일을 할 Mztools라는 도구를 제안했습니다.

다른 사람들이 말했듯이 (몇 년 전, 나는 ... 그러나 여전히 VB6을 사용하는 사람들이 너무 많습니다! :)), 3 파트 타운 도구를 사용하지 않는 한 콜 스택을 프로그래밍 방식으로 검색하는 것은 불가능하다고 생각합니다.

그러나 디버깅 목적으로이를 수행 해야하는 경우 호출 루틴에 옵션 입력 문자열 변수를 추가하는 것을 고려할 수 있습니다. 발신자 이름을 넣을 수 있습니다.

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

그렇게 우아하지는 않지만 아마도 저에게 효과적이었습니다.

간부, 맥스 - 이탈리아

Visual Basic 6의 Compuware (또는 당시 Numega) Devstudio가 사용하는 데 사용되었습니다. 그 길은 코드 스택에 추가 된 매우 작은 스 니펫이라고 불리는 모든 호출에 인스 커멘 화을 추가하는 것이 었습니다. 어떤 오류가 발생하면 해당 Callstack이 버려진 다음 메일이나 게시와 같은 작업을 웹 서버에게 디버깅 정보를 게시했습니다. 계측을 추가하고 제거하는 것은 잠재적으로 치명적인 작업 (특히 소스 제어로 VSS를 사용할 때)이지만 효과가 있으면 잘 작동합니다.

처럼 다렐이 지적했다, mztools를 사용하고 템플릿을 설정하여 매우 simlar를 추가 할 수 있습니다. 그것은 많은 일을하고 있으며 아마도 보상보다 더 많은 effeort 일 것입니다. 그러나 버그를 추적하기가 매우 어려운 경우 도움이 될 수 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top