Herausfinden woher meine Procedure aufgerufen wird

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Herausfinden woher meine Procedure aufgerufen wird

Beitrag von #NULL »

Die Rücksprungadresse zur Laufzeit wird wohl wenig nützen, da ihr ja bereits zur Compilezeit den entsprechenden Debbugger-Command an der entsprechenden Stelle hart im Code stehen haben müsst. Außerdem müsstet ihr ja noch beachten, wieviele Rücksprünge ihr machen müsst, um aus eurem Modul im User-Code zu landen.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Herausfinden woher meine Procedure aufgerufen wird

Beitrag von STARGÅTE »

@#NULL:
Ich meine damit, dass das DebuggerWarning() wie in meinem Beispiel im Macro sein muss und ich somit "immer" Macros brauche. Ich hätte es aber gerne in der Prozedur an Ort und stelle.

Sowas wie: DebuggerWarning(Text, Level=0), wobei Level angibt, wie weit zurückgesprungen werden soll, um die entsprechende Zeile zu markieren.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Herausfinden woher meine Procedure aufgerufen wird

Beitrag von HeX0R »

Ist der Debugger nicht auch OpenSource mittlerweile?
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Herausfinden woher meine Procedure aufgerufen wird

Beitrag von juergenkulow »

Hallo Mijikai

habe Deinen Code etwas verändert. Vielleicht hilft er beim finden von schwierigen oder rekursiven Aufruffehlern:

Code: Alles auswählen

; Rücksprungadresse unter Linux - stimmt nicht ! 
EnableExplicit
CompilerIf #PB_Processor_x64<>#PB_Compiler_Processor
  CompilerError "Dies ist x64 Code."
CompilerEndIf
; CompilerIf #PB_OS_Linux<>#PB_Compiler_OS
;   CompilerWarning "Dies ist eine Linux-Version"
; CompilerEndIf

Global Register_rsp
Global Label_main
Global Label_letzte_EndProcedure
NewMap ProcMap.i()

Macro ShowStack()
  Protected Reg_rsp
  !mov [p.v_Reg_rsp],rsp
  Shared Register_rsp, Label_main, Label_letzte_EndProcedure
  Protected *i.Integer
  Protected j=0
  PrintN("RSP: $"+Hex(Reg_rsp))
  For *i=Reg_rsp To Register_rsp Step 8
    If *i\i>=Label_main And *i\i<=Label_letzte_EndProcedure
      PrintN( Hex(*i)+" +"+RSet(Hex(j),3,"0")+" "+RSet(Hex(*i\i),16, "0"))
    EndIf 
    j+8  
  Next
EndMacro

Macro DoubleQuote
    "
EndMacro

Macro AddProc(Proc) ; Erzeugt z.B. :ProcMap("p1")=@p1()
  ProcMap(DoubleQuote#Proc#DoubleQuote)=@Proc()
EndMacro

Procedure.i Proc1(a.i,b.i)
  ShowStack()
EndProcedure

Procedure.i Proc2(a.i,b.i,c.i,d.i,e.i,f.i,g.i,h.i)
  ShowStack()
EndProcedure

Procedure.i Proc2Para5(a.i,b.i,c.i,d.i,e.i)
  ShowStack()
EndProcedure

Procedure.i Main()
  Shared Label_letzte_EndProcedure
  Label_letzte_EndProcedure=?letzte_EndProcedure
  PrintN("MAIN: $" + Hex(@Main()))
  PrintN("Label_letzte_EndProcedure: $"+Hex(Label_letzte_EndProcedure))  ; Ende des Programmcodes
  PrintN("LabelProc1: $" + Hex(?LabelProc1))
  PrintN("LabelProc2: $" + Hex(?LabelProc2))
  PrintN("LabelProc2Praa5 mit 5 Parametern $"+Hex(?LabelProc2Para5))
  LabelProc1: 
  Proc1(1,2)
  LabelProc2:
  Proc2(1,2,3,4,5,6,7,8)
  LabelProc2Para5:
  Proc2Para5(1,2,3,4,5)
  Label_letzte_EndProcedure=?letzte_EndProcedure
  letzte_EndProcedure:
EndProcedure

EnableASM :DisableDebugger: 
MOV Register_rsp,rsp 
CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      MOV rax,main
    CompilerCase #PB_OS_Windows
      MOV rax,PureBasicStart
CompilerEndSelect
MOV Label_main,rax
DisableASM : ; EnableDebugger
AddProc(Main) : AddProc(Proc1) : AddProc(Proc2) : AddProc(Proc2Para5)
If OpenConsole(#Null$)
  PrintN("main: Hauptprogramm FASM: $"+Hex(Label_main)) ; Anfang des Programmcodes
  PrintN("HauptprogrammEnde: $"+Hex(?HauptprogrammEnde))
  ForEach ProcMap()
    PrintN("Procedure "+MapKey(ProcMap())+" $"+Hex(ProcMap())) 
  Next
  Main()
  Input()
  CloseConsole()
EndIf
HauptprogrammEnde:
End
; main: Hauptprogramm FASM: $402000
; HauptprogrammEnde: $4022F4
; Procedure Proc2Para5 $402327
; Procedure Proc1 $402561
; Procedure Proc2 $402771
; Procedure Main $4029D3
; MAIN: $4029D3
; Label_letzte_EndProcedure: $402C55
; LabelProc1: $402BD6
; LabelProc2: $402BE7
; LabelProc2Praa5 mit 5 Parametern $402C20
; RSP: $7FFE28C59860
; 7FFE28C59870 +010 0000000000402C20
; 7FFE28C598C0 +060 0000000000402C20
; 7FFE28C598C8 +068 0000000000402BE7 ; <--- 1. Rücksprung
; 7FFE28C59908 +0A8 00000000004022CF
; RSP: $7FFE28C59820
; 7FFE28C59820 +000 00000000004022CF
; 7FFE28C598B0 +090 0000000000402C20 ; <--- 2. Rücksprung
; 7FFE28C598B8 +098 0000000000402C1C
; 7FFE28C59908 +0E8 00000000004022CF
; RSP: $7FFE28C59850
; 7FFE28C598C0 +070 0000000000402C20
; 7FFE28C598C8 +078 0000000000402C44 ; <--- 3. Rücksprung
; 7FFE28C59908 +0B8 00000000004022CF


Hätte gerne Feedback wenn der Code hilfreich war oder mit Beispiel wenn nicht.
Antworten