Herausfinden woher meine Procedure aufgerufen wird
Re: Herausfinden woher meine Procedure aufgerufen wird
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
@#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.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- HeX0R
- Beiträge: 2961
- 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
Ist der Debugger nicht auch OpenSource mittlerweile?
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: Herausfinden woher meine Procedure aufgerufen wird
Hallo Mijikai
habe Deinen Code etwas verändert. Vielleicht hilft er beim finden von schwierigen oder rekursiven Aufruffehlern:
Hätte gerne Feedback wenn der Code hilfreich war oder mit Beispiel wenn nicht.
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