Verbessern Sie die Geschwindigkeit Ihres eigenen Debug-Visualizers für Delphi 2010

8

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.

    
netcodecz 31.03.2010, 20:14
quelle

3 Antworten

9

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.

    
Barry Kelly 31.03.2010 20:43
quelle
4

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:

  1. Fügen Sie eine spezielle Debug-Dump-Funktion in die ausführbare Datei ein, die alle Werte in einem Aufruf abruft
  2. Spezielle dll in exe injizieren tut dasselbe wie 1 (mehr Hacking etc)

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)

    
André 17.08.2010 09:53
quelle
0

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:

%Vor%     
Remy Lebeau 01.04.2010 20:10
quelle

Tags und Links