Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Start und Stop jeder Methode Tracen an nur einer stelle Implementieren (https://www.delphipraxis.net/166648-start-und-stop-jeder-methode-tracen-nur-einer-stelle-implementieren.html)

gibb 23. Feb 2012 09:22

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

haentschman 23. Feb 2012 09:29

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:

Bernhard Geyer 23. Feb 2012 09:32

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 ...

gibb 23. Feb 2012 09:34

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.

himitsu 23. Feb 2012 10:07

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:

schlecki 23. Feb 2012 10:14

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:
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;
Die Verwendung ist dann so:

Delphi-Quellcode:
procedure TForm.ButtonClick(...)
begin
  TMeasure.MeasureThis('TForm.ButtonClick');
  Writeln('Muuh');
  Sleep(1000);
end;
die Ausgabe ist dann etwa so:

Code:
11:12:00 [123] Beginn: TForm.ButtonClick
Muuh
11:12:01 [123] Ende: TForm.ButtonClick
Das lässt sich natürlich noch beliebig verfeinern :)

stahli 23. Feb 2012 10:23

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: http://www.delphipraxis.net/165749-r...hleunigen.html

Bernhard Geyer 23. Feb 2012 10:33

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Zitat:

Zitat von gibb (Beitrag 1152469)
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.

???

Zitat:

Zitat von gibb (Beitrag 1152469)
Ausserdem läuft bei gewissen usecases AQ time nicht sauber und schmeisst exceptions weil wohl gewisse Programmierer etwas "verbotenes" gemacht haben.

Welche Version? Diverse Versionen haben so ihre Problem unter Win7. AQTime4 konnte ich unter Vista (32-Bit) einsetzen aber nicht mehr unter Win7 (64 Bit). Komischerweise läuft aber AQTime3 damit ganz gut. Die "verbotenen" Sachen macht hier eher AQTime als eure Entwickler.

gibb 23. Feb 2012 11:04

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

himitsu 23. Feb 2012 13:38

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 Delphi-Referenz durchsuchenExit), oder durch DAS vERLASSEN über eine Exception, eingetreten ist. :angle:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 Uhr.
Seite 1 von 7  1 23     Letzte »    

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