Ich habe Delphi Debug Visualizer für TDataSet geschrieben, um Werte der aktuellen Zeile, Quelle + Screenshot anzuzeigen: Ссылка . Funktioniert gut, aber sehr langsam. Ich habe einige Optimierungen vorgenommen (wie man Feldnamen bekommt), aber immernoch für nur 20 Felder dauert es 10 Sekunden - sehr schlecht.
Hauptproblem scheint langsam zu sein IOTAThread90.Evaluate von Hauptcode unten verwendet, diese Prozedur kostet die meiste Zeit, Linie mit ** etwa 80% Zeit. FExpression ist der Name von TDataset im Code.
%Vor%Jetzt habe ich keine Ahnung, wie ich die Leistung verbessern kann.
Das Evaluate muss erstaunlich viel Arbeit leisten. Der Compiler muss sie kompilieren, indem er Symbole in Speicheradressen auflöst, während das Auswerten von Eigenschaften zum Aufruf von Funktionen führt, die den Debugger benötigt, um die Argumente in den Debugee zu kopieren, einen Stapelrahmen aufzubauen, die Funktion aufzurufen, zu sammeln die Ergebnisse - und dies beinhaltet die Pause und die Wiederaufnahme des debugee.
Ich kann nur vorschlagen, mehr Arbeit in den Evaluate
Call zu packen. Ich bin nicht 100% sicher, wie die Interaktion zwischen dem Debugger und dem Evaluator (der Teil des Compilers ist) für diese Visualizer funktioniert, aber das Stapeln von so viel Arbeit wie möglich kann helfen. Versuchen Sie, vor dem Aufruf von Evaluate
nach der Schleife einen komplizierteren Ausdruck aufzubauen. Möglicherweise müssen Sie eine Entweichungs- oder Begrenzungskonvention verwenden, um die Ergebnisse zu entpacken. Stellen Sie sich beispielsweise vor, wie ein Ausdruck, der die Liste der Feldwerte erstellt und sie als kommagetrennte Zeichenfolge zurückgegeben hat, wie folgt aussieht - Sie müssten jedoch Kommas in den Werten selbst zurücklassen.
Da Delphi ein anderer Prozess ist als Ihre debugged exe, können Sie die Speicherzeiger Ihrer exe nicht direkt verwenden, daher müssen Sie ".Evaluate" für alles verwenden.
Sie können zwei verschiedene Ansätze verwenden:
Ich habe Option 1 in Arbeit, 2 sollte auch möglich sein, aber ein bisschen komplizierter und "hässlicher" wegen der Hacker-Taktik ... Mit dem folgenden Code (nur zu dpr hinzufügen) können Sie verwenden:
%Vor%Demo-Code der Option 1, ändern Sie es für Ihr TDataset (möglicherweise CSV-String aller Werte machen?):
%Vor%Edit: falls jemand interessiert ist: Ich habe Option 2 auch zu arbeiten (bpl injection)
Ich hatte noch keine Gelegenheit, mit den Debug-Visualisierern zu spielen, also weiß ich nicht, ob das funktioniert, aber haben Sie versucht, mithilfe von Evaluate () FExpression
in seine tatsächliche Speicheradresse zu konvertieren? Wenn Sie dies tun können, geben Sie diese Speicheradresse in einen TDataSet
-Zeiger ein und verwenden Sie ihre Eigenschaften normal, ohne zusätzliche Aufrufe von Evaluate () zu durchlaufen. Zum Beispiel: