Per Code die vorgngerroutine abfragen

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.

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

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)

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

[code]Public Function CallStack() as String()
// returns the signatures of the current CallStack
// workaround for <https://xojo.com/issue/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
[/code]

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 :slight_smile:
Ich komme in den nchsten Tagen vermutlich ohnehin nicht dazu, das umzusetzen. Wird also bestimmt noch ne Woche dauern.

Die Exceptions sind auerdem langsam. Man kann sonst nur den Code mit CurrentMethodName dekorieren.

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.

Dan ndere deine Refreshmethode zu

RefreshMethode( Optional currentMethod as String )

Und via Find/Replace ersetze alle Aufrufe mit

RefreshMethode( CurrentMethod )