Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Arraydaten im Debugger anzeigen (https://www.delphipraxis.net/213946-arraydaten-im-debugger-anzeigen.html)

ManfredU 24. Okt 2023 15:14

Arraydaten im Debugger anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo.
Ich habe jetzt neu Delphi 11.3 installiert und ein Delphi 10.3 Android Projekt verändert. So weit läuft alles, jedoch beim Debuggen wenn ich mit der Maus auf einen Array (ein- oder mehrdimensional) zeige, braucht die Anzeige sehr lange, und gibt nur Schrott aus. Teilweise chinesische Zeichen.
In zwei Fotos ist es unter Windows 32Bit. So war die Anzeige auch früher, auch unter Android 32 oder 64 Bit. Unter Delphi 11.3 zeigt er immer 254 Zeilen und 254 Spalten mit Werten die ich nie eingegeben habe. Daher dauert die Anzeige auch teilweise eine Minute.
Habe ich hier etwas falsch eingestellt, oder wie kann ich dieses Problem lösen.
Vielleich hat jemand auch dieses Problem und konnte es lösen.
Danke und lG
Manfred

Kas Ob. 24. Okt 2023 15:34

AW: Arraydaten im Debugger anzeigen
 
There is no problem in this screenshots, everything is fine.

That junk is from uninitialized values, eg. when you set the length of an array to lets say 10 then it will receive un-zeroed memory from the memory manager (could be recycled and previously used by something like a TBitmap), so what ever was there it will stay there until been written on, so unless you fill it with data the data inside it will be junk from your prospective but it is just residue.

The Chinese chars are from the junk of data because the uninitialized strings might have a value that land on valid and accessible memory showing arbitrary lengths and content.

To be on safe side you can/should zero such arrays with managed types before start to fill them.

ManfredU 24. Okt 2023 16:01

AW: Arraydaten im Debugger anzeigen
 
Danke für die Rasche Antwort. Ich habe nur im Musterbeispiel vergessen SetLength(array, 0, 0) zu setzten. Trotzdem ist immer noch der gleiche Effekt. Er zeigt immer 254 Zeilen und 254 Spalten an. Wenn ich aber in einer Schleife alle anzeige gibt er die richtige Anzahl Einträge und Inhalte zurück. Auch bei length(array) kommt die richtige Anzahl zurück.
Wieso kann er es für Windows und nicht für Android?
Lg
Manfred

himitsu 24. Okt 2023 16:33

AW: Arraydaten im Debugger anzeigen
 
Zitat:

Zitat von Kas Ob. (Beitrag 1528577)
That junk is from uninitialized values

Dynamische Arrays und LongStrings (String, UnicodeString, AnsiString und deren Ableitungen / nicht ShortString) sind immer initialisiert,
so wie es bei allen managed Typen der Fall ist.

Aber es kann sein, dass hier der Compilier diese Variable bereits weg optimiert hat, da dort unten diese Variable nicht mehr benuitzt wird,
und dann die DebugInfos an eine Stelle zeigen, wo kein Array mehr ist, also anderer "Datensalat" dort im Arbeitsspeicher liegt.


Im Windows-Compiler (Win32) wird so eine Variable normaler Weise erst im "end" der Methode freigegeben, aber im Android-Compiler kann es anders aussehen.

ManfredU 24. Okt 2023 16:38

AW: Arraydaten im Debugger anzeigen
 
In Delphi 10.3 war aber die Anzeige aber richtig, wieso dann in 11.3 nicht mehr?
Lg
Manfred

Kas Ob. 24. Okt 2023 16:53

AW: Arraydaten im Debugger anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1528581)
Zitat:

Zitat von Kas Ob. (Beitrag 1528577)
That junk is from uninitialized values

Dynamische Arrays und LongStrings (String, UnicodeString, AnsiString und deren Ableitungen / nicht ShortString) sind immer initialisiert,
so wie es bei allen managed Typen der Fall ist..

Thank you and i know that, also saw what Delphi IDE/Compiler can do, please have a look at this code and see why it is crashing on x32 while crashing the debugger itself on x64, on my XE8, so no guarantee on the behavior on newer version though.

Code:
procedure TForm10.FormCreate(Sender: TObject);
var
  a:array of string;
begin
  SetLength(a,4);
  a[0]:='string1';
  a[1]:='string2';
  a[2]:='string3';
  a[3]:='string4';
  SetLength(a,2);
  SetLength(a,4);
  ShowMessage(a[4]);
end;
Anhang 56373

Kas Ob. 24. Okt 2023 17:03

AW: Arraydaten im Debugger anzeigen
 
Ok that was a bad and unreliable example, it takes many times of running and retrying on x64 to crash the debugger and the content of the array goes junk.

himitsu 24. Okt 2023 17:26

AW: Arraydaten im Debugger anzeigen
 
Der Index 4 muß knallen, da es ja nur 4 Items gibt, also der Größte die 3 ist, wenn man bei 0 anfängt zu zählen. :zwinker:

In aktuellen Delphis sind nun standardmäßig die Überlauf- und Bereichsprüfung aktiviert, für neu erstellte Projekte (leider auch die dämlichen DebugDCUs),
womit dort ein anderer Fehler zu sehen ist, bezüglich der 4:
Zitat:

Im Projekt Project27.exe ist eine Exception der Klasse ERangeError mit der Meldung 'Fehler bei Bereichsprüfung' aufgetreten.
PS: :stupid:
Delphi-Quellcode:
procedure TForm25.FormCreate(Sender: TObject);
var
  a: array of string;
begin
  a := ['string0', 'string1', 'string2', 'string3'];
  SetLength(a, 2);
  SetLength(a, 4);
  ShowMessage(a[3]); // High(a) = 3
end;

Kas Ob. 24. Okt 2023 17:41

AW: Arraydaten im Debugger anzeigen
 
I am stupid :oops: sorry !

Anyway, try my example on x64, run it few times and the debugger might start to show junk everywhere or crash, like the debugger itself have problem of uninitialized stuff, also if you tried with cross platform too with x64 (LLVM), the IDE itself might will start to freeze or crash.

ManfredU 24. Okt 2023 19:30

AW: Arraydaten im Debugger anzeigen
 
Mein System kommt ja nicht zum Absturz oder Fehlermeldung, da ja Lenght(array) das Richtige zurückgibt.
Mein Problem ist nur beim Debuggen, wenn ich den Curser auf ein Array setze, zeigt er mir immer 255 Elemente an (und das braucht Zeit), obwohl nur wenige mit setlength definiert sind. Bei String-Variablen oder Numerischen-Variablen funkt es perfekt. Nur nicht bei Array, und das erst sein Delphi 11.3. Auch ohne Cursor auf den Array setzen, nur mit F8 braucht er sehr lange um in die nächste Zeile weiter zu gehen.
Lg Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz