Seite 2 von 2

Re: Herausfinden woher meine Procedure aufgerufen wird

Verfasst: 13.01.2021 13:03
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.

Re: Herausfinden woher meine Procedure aufgerufen wird

Verfasst: 13.01.2021 13:25
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.

Re: Herausfinden woher meine Procedure aufgerufen wird

Verfasst: 13.01.2021 15:44
von HeX0R
Ist der Debugger nicht auch OpenSource mittlerweile?

Re: Herausfinden woher meine Procedure aufgerufen wird

Verfasst: 15.01.2021 11:13
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.