Per Code die vorgängerroutine abfragen

  1. 10 months ago

    Stefan M

    11 Feb 2018 Germany, NRW, Kirchlengern (Kr...
    Edited 10 months ago

    Hallo in die Runde.
    Ich suche eine Möglichkeit, im Programmcode zu protokollieren, von welcher Methode/Event in die aktuell laufende Routine gesprungen wurde. Also genau das, was ich im Debugger im Bereich Stack sehen kann.

    Mein Problem ist, dass eine Refresh-Routine manchmal die falschen Daten aktualisiert und ich nicht erkennen kann, wo der Aufruf mit falschen Daten erfolgt.
    Innerhalb der Refresh-Routine schreibe ich ohnehin aktuelle Informationen in ein Array. Wenn ich da auch eintragen könnte, von wo der Aufruf erfolgt ist, könnte ich die Fehlersuche eingrenzen.
    Ich muss also nicht auch auf die Variablen der aufrufenden Routine zugreifen. Es reicht mir vermutlich der Name der Methode oder des Events.

    Gruß, Stefan Mettenbrink.

  2. Markus W

    11 Feb 2018 Pre-Release Testers, Xojo Pro #JeSuisHuman Germany, Heidelb...

    http://www.realsoftwareblog.com/2012/07/preserving-stack-trace-when-catching.html

  3. Markus W

    11 Feb 2018 Pre-Release Testers, Xojo Pro #JeSuisHuman Germany, Heidelb...

    Or basically create a new class that writes where it is created and destroyed to your log file
    Create an instance of your class in each method you want to trace (it will go out of scope at the end of the method which will call its destructor)

  4. Tobias B

    12 Feb 2018 Pre-Release Testers, Xojo Pro Bern, Switzerland

    Das Problem kenne ich. Da habe ich folgendes im Fundus:

    Public Function CallStack() as String()
      // returns the signatures of the current CallStack
      // workaround for <feedback://showreport?report_id=14501>
      
      Dim result() As String
      
      Try
        #Pragma BreakOnExceptions OFF
        Raise New RuntimeException
      Catch e As RuntimeException
        Dim stack() As String = e.Stack
        If stack.Ubound >= 2 Then
          // 0 is this Method
          // 1 is requesting Method
          // 2 is first calling Method
          stack.Remove(0)
        End If
        result = stack
      Finally
        #Pragma BreakOnExceptions Default
      End Try
    
      Return result
    End Function
    
    Public Function CalledBy() as String
      // returns the signature of the method that called the current method
      // similar to CurrentMethodName
      // this is a String, not an Object nor Introspection Reference. So IsA queries are not possible on the result
      
      Dim stack() As String  
      stack = CallStack
      
      // 0 is this mehthod
      // 1 is the method that called this
      // 2 is the method that was asked for
      Select Case stack.Ubound 
      Case Is >= 2
        Return stack(2)
      Case 1 
        //this can happen if we are called from the run event of an thread
        Return stack(1) 
      End Select
    End Function
  5. Stefan M

    13 Feb 2018 Germany, NRW, Kirchlengern (Kr...

    Erst mal vielen Dank. Da muss ich mich mal reindenken.
    So wie ich es verstehe, muss ich wohl erst eine Exception erzeugen um an die Info zu kommen. Schade, ich hatte gehofft, dass man auf diesen Stack generell zugreifen kann.

    Wenn es doch noch einfacher geht, bin ich daran interessiert :-)
    Ich komme in den nächsten Tagen vermutlich ohnehin nicht dazu, das umzusetzen. Wird also bestimmt noch ne Woche dauern.

  6. Beatrix W

    13 Feb 2018 Pre-Release Testers Europe (Germany)

    Die Exceptions sind außerdem langsam. Man kann sonst nur den Code mit CurrentMethodName dekorieren.

  7. Stefan M

    13 Feb 2018 Germany, NRW, Kirchlengern (Kr...

    Jede Methode und alle Events mit CurrentMethodName zu dekorieren ist aber auch für alle 75 Stellen, an denen die Refreshroutine aufgerufen wird, eine Fleißarbeit. Darum würde ich halt gern in der Refreshroutine herausbekommen wollen, von wo der Aufruf erfolgte.

  8. Markus W

    16 Feb 2018 Pre-Release Testers, Xojo Pro #JeSuisHuman Germany, Heidelb...
    Edited 10 months ago

    Dan ändere deine Refreshmethode zu

    RefreshMethode( Optional currentMethod as String )

    Und via Find/Replace ersetze alle Aufrufe mit

    RefreshMethode( CurrentMethod )

or Sign Up to reply!