Seite 1 von 1

Aufrufsverfolgung ermitteln

Verfasst: 04.01.2014 03:41
von STARGÅTE
Hallo,

ich suche gerade nach einer Möglichkeit (ähnlich wie es der Debugger kann) zur Laufzeit im Quellcode per Macro oder Procedure eine Aufrufsverfolgung zu integrieren.
Es gibt ja die Konstante #PB_Compiler_Line, nur leider gibt mir diese ja nur die Zeile des aktuellen Aufrufs zurück.
In diesem Beispiel möchte ich aber irgendwie an die Zeilennummer des Aufrufs Beispiel(), sodass ich ermitteln kann, in welche "echten" Zeile Beispiel() mit einer negativen Zahl aufgerufen wurde.

Code: Alles auswählen

Procedure Beispiel(Number.i)
	If Number < 0
		Debug #PB_Compiler_Line ; Gibt Zeile 3 aus
	EndIf
EndProcedure

Beispiel(100) ; Zeile 7
Beispiel(0)   ; Zeile 8
Beispiel(-2)  ; Zeile 9
Aktuell verwende ich ein Macro dieser Art hier:

Code: Alles auswählen

Procedure Beispiel_Debug(Number.i, Line.i)
	If Number < 0
		Debug Line ; Gibt nun Zeile 13 aus
	EndIf
EndProcedure

Macro Beispiel(Number)
	Beispiel_Debug(Number, #PB_Compiler_Line)
EndMacro

Beispiel(100) ; Zeile 11
Beispiel(0)   ; Zeile 12
Beispiel(-2)  ; Zeile 13
Allerdings bietet es auch nur geringe Anwendungsmöglichkeiten, und hat den Nachteil, dass ich alle Proceduren zu Macros machen müsste und eine extra Procedure schreiben muss.

Wie macht das der PB-Debugger?

Re: Aufrufsverfolgung ermitteln

Verfasst: 04.01.2014 19:28
von RSBasic
Kannst du nicht einfach am Ende jeder Zeile deine Zeilendebug-Funktion anhängen, bevor es kompiliert wird?
Also etwa so:

Code: Alles auswählen

Procedure DebugProc(CurrentLine)
  Debug CurrentLine
EndProcedure

Procedure Proc1()
EndProcedure

Procedure Proc2()
EndProcedure

Procedure Proc3()
EndProcedure

Proc1() : DebugProc(#PB_Compiler_Line)
Proc2() : DebugProc(#PB_Compiler_Line)
Proc3() : DebugProc(#PB_Compiler_Line)
Oder habe ich dich falsch verstanden? Bestimmt. :mrgreen:
Vielleicht gibt es irgendeine interne PB-Funktion, die man importieren und verwenden kann, die beim PB-Debugger benutzt wird.

Re: Aufrufsverfolgung ermitteln

Verfasst: 04.01.2014 19:53
von STARGÅTE
Geht leider nur solange gut, solange man diese Prozeduren nicht verschachtelt aufruft.

Ich suche/vermisse halt sowas wie bei php: backtrace

Re: Aufrufsverfolgung ermitteln

Verfasst: 04.01.2014 20:07
von RSBasic
Hm okay...
Und wenn du nach allen Prozeduraufrufen suchst und bei jeder Aufrufzeile kennzeichnest, damit du nachher nachvollziehen kannst, welche Prozedur sich auf welche Prozedur bezieht, dann kannst du auch feststellen, welche Prozedur die Ursprungsprozedur ist, weißt du was ich meine? Quasi eine interne Baumstruktur für jede einzelne Prozedur.