Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Große Strings im Debugger (https://www.delphipraxis.net/211060-grosse-strings-im-debugger.html)

Der schöne Günther 22. Jul 2022 12:07

Große Strings im Debugger
 
Schon vor über zehn Jahren haben sich Leute gefragt, wie man eigentlich zur Laufzeit, im Debugger an das Ergebnis von
Delphi-Quellcode:
meinGedöns.ToJson()
oder
Delphi-Quellcode:
.ToXML()
kommt.

Klar kann ich das im Debugger in der Watch-List anzeigen, und er zeigt mir die ersten paar hundert Zeichen an. Aber wenn ich wirklich den kompletten String haben möchte, wie komme ich da dran? Ist ja wirklich heute nichts ungewöhnliches mehr, dass ein String etwas länger wird.

himitsu 22. Jul 2022 12:40

AW: Große Strings im Debugger
 
Geht es nur ums reingucken, oder auch ums rauskopieren?

Wenn Ersteres, dann den langen String als StringList oder StringArray im Debugger ausgeben. (lange Zeile in mehrere Kürzere aufgeteilt)
Delphi-Referenz durchsuchenSplitString

Das ginge sofort und ohne Änderungen/Erweiterungen.



Ansonsten könntest du dir auch einen passenden DebugViewer basteln. (glaub da gab es sogar Beispiele/Tutorial hier im Forum)



Per se ist es ja OK, dass Strings/Daten (erstmal) gekürtzt ausgegeben werden, damit es nicht zu langsam/aufwändig wird,
aber es wäre schon toll, wenn man dann dennoch eine Möglichkeit hätte mehr/alles zu laden.

PS: Genauso nervig ist es, dass der Stacktrace gern mal abbricht.
Beim letzten Stackoverflow hätte ich gern gewusst wo der Ursprung ist. (wobei es hier ja ein leichtes wäre einfach in der Mitte was wegzulassen, anstatt das ganze Ende Anfang)

Der schöne Günther 22. Jul 2022 12:45

AW: Große Strings im Debugger
 
Im Endeffekt natürlich ums Rauskopieren, denn ich untersuche eine 5000 Zeilen lange, unformatierte JSON sicher nicht im dem kleinen Textfenster im Debugger.

Redeemer 22. Jul 2022 13:35

AW: Große Strings im Debugger
 
Delphi-Quellcode:
Clipboard.AsText := MeinString;
So?

Oder eine Methode schreiben, die einen String schreibt:
Delphi-Quellcode:
procedure SaveStringToFile(const s: string; const fn: TFileName; const Encoding: TEncoding; const BOM: Boolean);
var
  ss: TStringStream;
begin
  ss := TStringStream.Create(IfThen(BOM and not Encoding.IsSingleByte, #$FEFF) + s, Encoding, False); // BOM nicht bei SingleByteEncodings (das ist alles außer ASCII und Default)
  try
    ss.SaveToFile(fn);
  finally
    ss.Free;
  end;
end;

Uwe Raabe 22. Jul 2022 13:58

AW: Große Strings im Debugger
 
Zitat:

Zitat von Redeemer (Beitrag 1509063)
Oder eine Methode schreiben, die einen String schreibt:

Sowas wie TFile.WriteAllText?

Dann kann man bei Auswerten/Ändern z.B.
Delphi-Quellcode:
TFile.WriteAllText('c:\temp\dump.txt', MeinString)
eingeben und auf Auswerten klicken. Dazu muss im aktuellen Scope dann aber auch System.IOUtils in der uses stehen.

Alternativ könnte man sich auch einen
Delphi-Quellcode:
record helper for string
schreiben mit einer
Delphi-Quellcode:
CopyToClipboard
Methode. Aber das ist wegen des Highlander Prinzips bei Helpern nicht so schön.

himitsu 22. Jul 2022 14:16

AW: Große Strings im Debugger
 
Jupp, wollte ich auch grade vorschlagen, da etwas schreiben zu lassen.

Nicht den Haken bei "Seiteneffekte zulassen" vergessen, bzw. diese Funktion standardmäßig in den IDE-Optionen aktivieren.


Zitat:

Zitat von Uwe Raabe (Beitrag 1509065)
Aber das ist wegen des Highlander Prinzips bei Helpern nicht so schön.

Oftmals gab es aber das Problem, dass das Auswerten nicht von Helpern fand.

Und ich hatte da auch grade den anderen Fall.
Vom Highlander war nichts verfügbar, nur von dem was eigentlich vorher da war.
(lokaler Helper in der Implemtation ... lief jahrelang, bis jetzt ein Helper über die Uses rein kam und plötzlich war vom lokalen Helper nichts mehr nutzbar ... nichtmal Helper-Vererbung half)

mytbo 22. Jul 2022 14:30

AW: Große Strings im Debugger
 
Ich weiß nicht, ob ich deine Frage richtig verstanden haben. Ich würde es einfach loggen. Mit mORMot geht es einfach. Das Limit z.B. für Log() kannst du selbst festlegen. Die Vorgabe ist MaxInt. Einfaches Beispiel:
Delphi-Quellcode:
var
  logFamily: TSynLogFamily;

begin
  logFamily := TSynLog.Family;
  logFamily.Level := LOG_VERBOSE;
  logFamily.PerThreadLog := ptIdentifiedInOneFile;
  logFamily.HighResolutionTimestamp := True;
  Application.Initialize;
  ...

uses
  mormot.core.base,
  mormot.core.buffers,
  mormot.core.unicode,
  mormot.core.log,
  mormot.crypt.core;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  log: ISynLog;
  text: RawUtf8;
begin
  log := TSynLog.Enter(Self);
  text := BinToBase64(TAesPrng.Main.FillRandom(20 shl 20));
  log.Log(sllInfo, text);
end;
Bis bald...
Thomas

Rolf Frei 22. Jul 2022 15:24

AW: Große Strings im Debugger
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1509055)
Schon vor über zehn Jahren haben sich Leute gefragt, wie man eigentlich zur Laufzeit, im Debugger an das Ergebnis von
Delphi-Quellcode:
meinGedöns.ToJson()
oder
Delphi-Quellcode:
.ToXML()
kommt.

Klar kann ich das im Debugger in der Watch-List anzeigen, und er zeigt mir die ersten paar hundert Zeichen an. Aber wenn ich wirklich den kompletten String haben möchte, wie komme ich da dran? Ist ja wirklich heute nichts ungewöhnliches mehr, dass ein String etwas länger wird.

Mit Ctrl-F7 sollte doch alles im folgenden Dialog/Memo sichtbar sein oder gibt es da ab 1-2 KB auch eine Grenze? Ich nutze eigentlch immer Ctrl-F7, wenn ich einen längeren String im Debugger sehen will.

Der schöne Günther 22. Jul 2022 16:19

AW: Große Strings im Debugger
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Rolf Frei (Beitrag 1509074)
Mit Ctrl-F7 sollte doch alles im folgenden Dialog/Memo sichtbar sein oder gibt es da ab 1-2 KB auch eine Grenze?

Vielen Dank! Der macht leider auch ziemlich früh Schluss, aber ein bisschen mehr Puste hat er schon. Das ist immerhin schon mal ein Fortschritt!

einbeliebigername 22. Jul 2022 20:19

AW: Große Strings im Debugger
 
Hallo,

wenn man wärend des Debugens an einer Stelle den Inhalt eines langen Strings haben will, dann Start -> Auswerten/Ändern,
Delphi-Quellcode:
Copy(<Variable>, 1, 2000)
eingeben und Ausführen. Die erste Zahl entsprechen erhöhen und nochmal. Die Grenze bei Strings im Debugger ist 2k.

himitsu 22. Jul 2022 23:16

AW: Große Strings im Debugger
 
Zitat:

Zitat von einbeliebigername (Beitrag 1509101)
wenn man wärend des Debugens an einer Stelle den Inhalt eines langen Strings haben will, dann Start -> Auswerten/Ändern,
Delphi-Quellcode:
Copy(<Variable>, 1, 2000)
eingeben und Ausführen. Die erste Zahl entsprechen erhöhen und nochmal. Die Grenze bei Strings im Debugger ist 2k.

Jupp, darum siehe Post #2.

die Grenze "eines" Strings,
aber da wird deine Lösung ihn noch mehr nerven, da er jeden Teilstring manuell auswählen muß.
Bei meinem Vorschlag, hat man insgesamt den ganzen String sichtbar, aber eben auch in vielen kleineren Teilen (gleichzeitig und nicht immer nur ein Teil),
was natürlich dennoch ein Bearbeiten des "ganzen" Strings etwas erschwert.



Lösung wäre dann noch den Debugger dazuzu bringen eine Funktion auszuführen, welche in einer Datei speichert/löscht.


Oder eben ein passender DebugViewer.

einbeliebigername 23. Jul 2022 09:57

AW: Große Strings im Debugger
 
Hallo,

Zitat:

Zitat von himitsu (Beitrag 1509106)
Jupp, darum siehe Post #2.

Bei deinen Lösungsvorschlägen außer DebugView habe ich nicht verstanden wie sie funktionieren sollen. Habe mal mit einem Demoprojekt experimentiert. Und verstehe es immer noch nicht.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.StrUtils,
  System.Classes;

var
  vS: string;
  vI: Integer;

function DepugString(const aStr: String): TStringList;
begin
  Result:= TStringList.Create;
  Result.Text:= aStr;
end;

begin
  try
    for vI:= 0 to 9999 do
      vS:= vS+ IntToHex(vI, 4)+ '|';

//  Auswerten/Ändern -> SplitString(vS,'|') -> Die aufzurufende Funktion SplitString wurde vom Linker entfernt
//  Auswerten/Ändern -> DepugString(vS) -> Die aufzurufende Funktion SplitString wurde vom Linker entfernt
    Writeln(vS);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Haltepunkt auf das
Delphi-Quellcode:
Writeln(vS);
und versuchen den String komplett aus dem Debuger zu bekommen.

Das Problem im Debuger, man kann in der Regel nur das aufrufen was der Linker nicht entfernt hat. Mit Copy hatte ich im Debuger noch nie Probleme.

Musste jetzt aber auch feststellen das mindesten ab 10.4.2 (das hatte ich gerade offen) die mögliche Länge von Standard-Strings im Auswerten/Ändern auf 16381 Zeichen vergrößert wurde.

jaenicke 24. Jul 2022 10:47

AW: Große Strings im Debugger
 
Zitat:

// Auswerten/Ändern -> DepugString(vS) -> Die aufzurufende Funktion SplitString wurde vom Linker entfernt
Du musst die Funktion DebugString natürlich irgendwo als Dummy einmal verwenden, damit der Debugger sie nutzen kann, und sei es, dass du deren Adresse verwendest.

Bei mir klappt das allerdings nicht. Der Stringlisten-Viewer bleibt leer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr.

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