![]() |
Delphi-Version: 5
Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Hallo zusammen,
Gibt es eine möglichkeit die zeit die in einer Methode verbracht wird zu tracen? Klar ich könnte bei jedem methodenstart und ende eine Zeile einfügen, das ist jedoch nicht die Lösung die ich suche. Ich möchte an einem ort etwas machen das jeder Methodenstart und stop getracet wird und zwar mit Classenname und Methodenname nach möglichkeit. geht das irgendwie? Ein simples Nein würde auch reichen wenns dann stimmt. Weil ich selber hätte keine ahnung wo das Delphi das anbieten sollte und wo die Logik dafür untergebracht währe. gruss Severin |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Hallo...
welche Delphi Version hast du ? Ab DXE ist AQtime dabei (Standard). Damit kann man sowas einfach realisieren. PS: Passe in deinem Profil einfach die Delphi Version an :zwinker: |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
AQTime ist super. Die größere Kaufversion kann auch Zeiten auf Quellcode-Zeilen profilen.
Damit haben wir schon einige Flaschenhälse behoben ... |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Delphi 2006 sorry das habe ich vergessen zu schreiben. AQ time habe ich jedoch auch als Software zur verfügung. Ich möchte das jedoch nicht über AQ time lösen da ich es für weitere Analysen benötige die AQ Time mir nicht liefern kann da es Produktspezifisch ist.
Ausserdem läuft bei gewissen usecases AQ time nicht sauber und schmeisst exceptions weil wohl gewisse Programmierer etwas "verbotenes" gemacht haben. |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Tja, einen allgemeinen und vorallem einfachen Weg gibt es nunmal nicht.
Entweger man sucht sich nachträglich (nach dem Kompilieren) aus den erweiterten Debuginfos die Methoden-Anfänge (erste Codezeile) und deren Ende (letzte Codezeile) und patcht sich dann überall einen Funktionsaufruf (Logfunktion) rein, bzw. erstellt überall dort Haltepunkte, auf die ein eigener Debugger hört. Oder man baut sich einen Precompiler, welcher vor dem compilieren die Quellcodes parst und überall diese Log-Funktionsufrufe reinmacht (nur für's Compilieren), bzw. man läßt den Parser so drüberlaufen und läßt sich direkt in seine Quellcodes die Aufrufe reinbauen. Oder man geht selber durch und macht die manuell rein. :stupid: |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
eine recht billige Variante ist mit einem Interface implementierbar - allerdings muss dann jede Methode, die gemessen werden soll, mit einer Zeile instrumentiert werden. Ich zeige hier mal ein kurzes Beispiel (aus dem Kopf runtergetippelt)
Delphi-Quellcode:
Die Verwendung ist dann so:
type
IAutoDestroy = interface(IInterface) end; TMeasure = class(TInterfacedObject, IAutoDestroy) protected FMessage: string; procedure Log(const msg: string); public class function MeasureThis(const msg: string): IAutoDestroy constructor Create(const msg: string); reintroduce; destructor Destroy; override; end; // ... class function TMeasure.MeasureThis(const msg: string): IAutoDestroy begin Result := TMeasure.Create(msg); end; constructor TMeasure.Create(const msg: string); begin inherited Create; // Log msg FMessage := msg; Log('Beginn: ' + FMessage); end; destructor TMeasure.Destroy(); Log('Ende: ' + FMessage); end; procedure TMeasure.Log(const msg: string); begin Writeln(FormatDateTime('HH:MM:SS', Now), ' [', GetCurrentThreadId(), '] ', msg); end;
Delphi-Quellcode:
die Ausgabe ist dann etwa so:
procedure TForm.ButtonClick(...)
begin TMeasure.MeasureThis('TForm.ButtonClick'); Writeln('Muuh'); Sleep(1000); end;
Code:
Das lässt sich natürlich noch beliebig verfeinern :)
11:12:00 [123] Beginn: TForm.ButtonClick
Muuh 11:12:01 [123] Ende: TForm.ButtonClick |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Für eine zeilenweise Analyse habe ich mir mal notdürftig etwas zusammengestrickt:
![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
danke für die Zahlreichen Antworten
Mit der die wir hier haben und der Trial der neusten weil ich auch herausgefunden habe das unter win7 alte AQ time versionen Probleme machen ;) um deine Fragezeichen zu beantworten. Wir haben noch eine eigene Scriptingsprache integeriert und messen diese ebenso messen wir SQL statements aus dem Script und aus dem Delphi sourcecode. Die Scriptingsprache selber und die Methodenaufrufe tracen wir auch und können dann Informationen herausfiltern. Selbst der Java teil welcher delphi Code integriert können wir messen. Bis jetzt fehlt halt nur der Delphi Teil der bis jetzt als unbekante Zeitaufwand angegeben wird.Aber um herauszufinden wo das dann der Flaschenhals liegt müsste man die Methodenaufrüfe selber Tracen können ;) Gruss gibb |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Die VAriante mit dem Interface ist eigentlich genial. :thumb:
Das darf ich mir doch mopsen? :angle2: Bastle mir grade eine kleine rudimentäre Log-Klasse, welche ich in meinen Klassen/Komponenten verbauen will, wo unter Anderem auch ein EnterMethode-/ExitMethod-LogAufruf implementiert ist, allerdings muß ich bis jetzt das Exit noch selber aufrufen (OK, da wo man das Result mitloggen will, da kommt man um den händischen Aufruf nicht drumrum) Die soll dann mal als Weiterleitung zu irgendeinem beliebigen Logsystem genutzt werden können. Aber ich hab auch grade eine Idee, wie man in dem automatischen "Ende:" mitbekommt, ob dieses durch einen regulären Ausstieg (Methodenende oder ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz