Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#1

Delphi 12.1p1 Assembler debuggen nicht mehr möglich?

  Alt 2. Jun 2024, 12:55
Delphi-Version: 12 Athens
Moin Moin,

früher hatte ich eher das Problem, dass ich schwer aus dem Assembler wieder raus kam, in den Quellcode,
aber jetzt hab ich das Problem andersrum, also dass es ständig zurück in den Quellcode springt, ohne dass ich es will.

Im Grunde wollte ich schauen ob und wann Delphi bei den Custom-Managed-Records das Standardverhalten ausführt und wie dazu die neuen Operatoren arbeiten.
Speziell beim Assign, hatte musste ich das genauer wissen.

Delphi 12.1 mit Patch 1
Neue Win32-VCL-Anwendung
der Dreck bezückglich DebugDCUs ist ja inzwischen immernoch standardmäßig aktiv.
und die beiden markierten Haltepunkte setzen (F5)
Delphi-Quellcode:
implementation

{$R *.dfm}

type
  TTest = record
    FInt: Integer;
    FStr: string;
    class operator Initialize(out Dest: TTest);
    class operator Finalize(var Dest: TTest);
    class operator Assign(var Dest: TTest; const [ref] Src: TTest);
  end;

class operator TTest.Initialize(out Dest: TTest);
begin
  Dest.FInt := 123;
  Dest.FStr := 'abc';
end;

class operator TTest.Finalize(var Dest: TTest);
begin
  Dest.FInt := 0;
  Dest.FStr := '';
end;

class operator TTest.Assign(var Dest: TTest; const [ref] Src: TTest);
begin
  Dest.FInt := Src.FInt;
  Dest.FStr := Src.FStr;
end;

procedure Test;
var
  A, B: TTest;
begin
  A.FInt := 456;
  A.FStr := 'def';
  B := A; {HALTEPUNKT}
  if B.FInt = 0 then;
end;

procedure TForm1.FormCreate(Sender: TObject); // Form1.OnCreate ;)
begin
  Test; {HALTEPUNKT}
  Test; {HALTEPUNKT}
end;

end.
* [F9] bis zum Haltepunkt im FormCreate
* Strg+Alt+C -> ins Assembler
* dann [F7]
* OK, hier nur ein CALL und es landet beim BEGIN der Test-Ptozedur, aber im Pascal.
* erneut Strg+Alt+C
* gut, es ist immernoch direkt am Anfang und der Code für die Initialisierung der lokalen Variablen ist noch nicht durch
* [F7]
* so, jetzt müsste ich den Assembler eigentlich mit [F7] mindestens Zeilenweise bis zum CALL kommen
* aber NEIN, ich lande wieder beim BEGIN der TEST-Prozedur
* Strg+Alt+C und es ging zum Glück doch bloß den einen ASM-Befehl
* wieder [F7], zurück im Pascal, immernoch beim BEGIN ... Strg+Alt+F7 und war doch bloß der eine ASM-Befehl

Ist das bei euch auch so?
Kann noch nicht sein ... beim ersten ASM-Befehl einer Zeile wäre es schon OK, aber die dazwischen

Das sind hier 17 ASM-Befehle ... bei jedem müßte ich hin und her,

Ganz pervers wird es beim [F8], dann sollte es nur den CALL abarbeiten und in die nächste Zeile,
aber MANCHMAL überspringt es nicht nur den CALL, sondern stoppt erst beim nächsten Haltepunkt.

Und beim Strg+F2 (Debuggen beenden), schließt Delphi einfach so bösartig mein, nicht automatisch, sondern von MIR manuell geöffneten CPU-Tab.




Ach ja, zu Beginn werden die beiden Variablen A und B initialisiert,
der FInt ist nicht initialisiert (Random), der String aber schon, also wie erwartet ... deswegen ja das TTest.Initialize,
aber ich hätte erwartet, dass vor dem Aufruf der Standard-Code vom delphi kommt, welcher den String initialisiert (NIL).
Hab gerade das Gefühl, als wäre er im BEGIN meiner Initialization-Prpzedur ... sicher bin ich mir noch nicht ... aber irgendwo muß das NIL sich ja verstecken (hoffe ich).

Beim Assign scheint das standardmäßige System.CopyRecord bzw. System.MoveRecord,
oder ein einfacher Register-Kopieren oder System.Move (für einfache Records ohne Managed-Types),
garnicht ausgeführt zu werden und man muß alles manuell machen.
Was passiert wohl, wenn man faul ist .... ähhhhh, ich meine auf Nummer sicher gehen will .... und Dest := Src; macht?
Nja, so weit bin ich noch nicht, da das Debuggen keinen Spaß macht und ich noch Stunden benötige, bis ich an der Stelle bin, weil mit vorher alle Finger weh tun.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Jun 2024 um 13:20 Uhr)
  Mit Zitat antworten Zitat