![]() |
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 ![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Einfach im Callstack den passenden Methodennamen rausholen und als Text ausgeben. Dann könnte man mit einer einfachen Methode das komplett erschlagen
Delphi-Quellcode:
Verwendung:
procedure StartMeasure: IAutoDestroy;
begin result := TMeasure.MeasureThis(_STACK...._); end;
Delphi-Quellcode:
procedure TForm.ButtonClick(...)
begin StartMeasure; Writeln('Muuh'); Sleep(1000); end; |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Okay das klingt schonmal nicht schlecht...
Interface + JEDI klasse ergibt immerhin einen einzeiler der dynamisch klassen+methodenname ausliest... jetzt nur noch an einer stelle implementieren + einen schalter einbauen ob das tracing stattfinden soll. Aber diese stelle gibt es wohl nicht oder? es gibt ja nichts was die methodenaufrufe sozusagen verarbeitet und man noch einfluss darauf nehmen kann... |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
{$ifdef debug} ... {$endif}
?? |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
oder ein boolean als class var in TMeasure - wenn der false ist, einfach im Log nichts schreiben.
edit: @bernhard geyer das mit der jcl muß ich mir nochmal anschauen, haben wir sowieso im projekt :) Danke ^^ |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Darf man mal fragen wozu du das brauchst?
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Bei 'ner Multithreadanwendung, mit "ausreichend" (tausenden/millionen) Funktionen, da möchte ich dan die "kleinen" Logdateien sehn und vorallem den, welcher damit dann auch wirklich noch was anfangen kann (den, der in dieser Masse dann noch das Wichtige findet). |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Hm, gibt es da nicht schon Software für? Profiler oder wie die sich nennt?
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
:-D das mit dem Flag war keine Frage sondern eine Feststellung ;) das krieg ich noch gerade so hin...
Die frage ist nur wie schiebe ich das stückchien code allen Methoden unter die im Programm sind und das nur bei bedarf. Ansonsten möchte man ja diesen Code nicht unbedingt in jeder funktion finden ;) daher müsste das irgendwie automatisch gehen. oder halt wie bereits gesagt eine stelle ganz weit hinten versteckt. Gruss Gibb |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
ja aber ich habe die hoffnung nicht aufgegeben das es einen einfacheren weg gibt ;)
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Ein einfacher Weg wäre, wenn es ein Event gäbe, welches schon eingebaut ist (zu Beginn und am ende jeder Prozedur), aber sowas gibt es in Delphi nicht.
Bei Scriptsprachen, wie JavaScript und auch teilweise bei gemanagten Sprachen (vielleicht .NET) sähe die Sache anders aus. Also vorwiegend dort, wo ein Programm den Code interpretiert und wo man sich in den Interpretierer reinhängen kann. Du willst ja überall einen Funktionsaufruf reinhaben und der muß ja auch erstmal überall rein. Wäre halt zu schön, wenn man ganz einfach im Delphi einen Precompiler registrieren könnte. (den vermisse ich ganz doll) In neueren Delphis gäbe es die PreCompile- und AfterCompile-Events, wo man sowas gewisser Maßen unterbringen könnte. (auch wenn kein echter PreCompiler möglich wäre, welcher die QuellCodes unverändert läßt) |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Wie auch immer: Ohne Konfigurationsaufwand (sei es per Attribute, xml-File oder hardcodierte Funktionsaufrufe) wird es wohl nicht, zumindest aber nicht vernünftig gehen. |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Ich konnte bisher nicht herauslesen, ob das Tracen Teil der Entwicklung ist, oder ob das auch irgendwie beim Kunden aktivierbar sein muss. Speziell für Debugging/Profiling Zwecke ist auch der ![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Und das ginge dann wohl auch nur für virtuelle Methoden und nicht für "alle" Methoden/Prozeduren.
Aufrufe der WinAPI und anderer DLL-Funktionen könnte man auch leicht umbiegen, aber Methoden/Prozeduren, welche direkt angesprungen werden, sind da schon schwerer, da es dort keine "zentrale" Stelle für die Eintrittsadresse gibt, außer man überschreibt den Methoden-Code und quetsch so seinen Log-Methodenaufruf dazwischen. |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Da auch eine Info fehlt, wie viele Prozeduren überhaupt gemonitort oder getracet (S..-Denglisch) werden sollen, würde ich unserem Eid-Delphi-Genossen ![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Oder der TE hat vergessen es anzugeben. D5 ist die Standardeinstellung.
![]() Zitat:
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
*doppelpost*
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
haha witzbold ;)
ich würde nicht nach einer solchen Lösung fragen wenn ich nur 3 methoden hätte... ich werde mir dann halt die anderen wege genauer anschauen und versuchen den flexibelsten weg zu nehmen. danke jedenfalls, gruss Gibb EDIT: nach dem wieder überfliegen stelle ich fest das es nur der PreCompiler für mich nen gangbaren weg währe. Aber ich habe jetzt dazu ne frage... Soll ich mir etwa hierzu ein Programm schreiben das die Pas file anpasst und anschliessend Compiliert und wieder die änderungen rückgängig macht? Oder wie macht man das normalerweise? |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Hatte jbg nicht mal einen Precompiler für Generics (bevor es sie von Haus aus gab)? Finde ich leider nicht mehr... aber du könntest mal danach suchen oder ihn fragen.
|
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
![]() |
AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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