Delphi-PRAXiS
Seite 2 von 2     12   

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)

neo4a 27. Feb 2012 14:55

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

Zitat von Stevie (Beitrag 1153175)
Nicht nur ersten Post lesen, Andreas ;)

"Als ich dort zuletzt gelesen habe, stand davon definitiv nichts, Dr. House!" ;)

Stevie 27. Feb 2012 15:09

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

Zitat von neo4a (Beitrag 1153181)
Zitat:

Zitat von Stevie (Beitrag 1153175)
Nicht nur ersten Post lesen, Andreas ;)

"Als ich dort zuletzt gelesen habe, stand davon definitiv nichts, Dr. House!" ;)

Fordere mich nicht heraus, einen zynischen Kommentar, in Dr. House Manier von mir zu geben, sonst fließen wieder Tränen :mrgreen:

himitsu 27. Feb 2012 15:11

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

Zitat von NamenLozer (Beitrag 1153134)
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.

Ich glaub, den letzten PreCompiler, welchen ich sah, war für Delphi 7.
Ab D2006 hatte sich ja die ganze IDE geändert und wenn ich mich recht erinnere, gibt es dort einfach keinen ordentlichen Punkt, wo man den integrieren konnte, oder irgendwie sowas.

neo4a 27. Feb 2012 15:28

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

Zitat von Stevie (Beitrag 1153184)
Fordere mich nicht heraus, einen zynischen Kommentar, in Dr. House Manier von mir zu geben, sonst fließen wieder Tränen :mrgreen:

Sagt der Masochist zum Sadist: "Bitte, bitte schlag mich."
Sagt der Sadist: "Nein"

SCNR ;)

gibb 28. Feb 2012 08:51

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Ja wie jetzt? Heisst es zuerst du musst das über einen Precompiler machen und dann geht das nicht oder wie? :roll:

dann bleiben nur noch die erweiterten Debug informationen... der punkt ist jedoch das ich das nicht in der IDE laufen lassen möchte sondern auf einem Kundensystem wo ich nicht zuerst die IDE noch installieren kann. Ausserdem ist es mir ein rätsel wie das genau funktionieren soll, könnte aber auch nur an unwissenheit liegen ;)

Daraus schliesse ich, ich müsste ein Programm schreiben welches mir in einem verzeichnis rekursiv nach .pas files sucht und dort die Tracing klasse im Uses hinzufügt und diese in jeder methode einfügt. Leider wüsste ich gerade nicht wie ich herausfinden soll wo der methodenstart liegt. ich kann ja nicht einfach nach dem ersten nicht eingerückten begin suchen oder etwas in der art.


gruss Severin

Klaus01 28. Feb 2012 09:00

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
.. wenn Du das mit dem Interface probierts..

Kannst Du Deinem Programm doch ein Parameter mitgeben (-debugOn) um dann die Messungen durchzuführen.

Grüße
Klaus

gibb 28. Feb 2012 09:38

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
was aber voraussetzen würde das bereits beim Compilieren in jeder Methode die Zeile steht. Ich möchte diese Zeilen jedoch nur im Code haben wenn ich sie benötige und auch wieder herausnehmen wenn sie nicht benötigt sind.

Ich will auch nicht jede Methode von Hand anfassen und diese Zeile einfügen. Das ist schlicht und einfach idiotenarbeit ;)

gruss Gibb

omata 28. Feb 2012 11:33

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Liste der Anhänge anzeigen (Anzahl: 3)
Was spricht dagegen ein Tool zu schreiben, das das für einen übernimmt?

Edit: Oh, ich sehe gerade, dass es doch nicht so gut funktioniert. Sorry für den Müll.
Edit2: Kleine Korrektur. Verschachtelte Methoden funktionieren aber immer noch nicht.

Edit3: Anhang siehe weiter unten

Stevie 28. Feb 2012 12:11

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Ich würde da eher einen Parser für benutzen.

omata 28. Feb 2012 12:14

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

Zitat von Stevie (Beitrag 1153378)
Ich würde da eher einen Parser für benutzen.

Das war von vornherein klar. Aber geht es vielleicht auch minimaler? (zumindest war das meine persönliche Fragestellung).

Hier nochmal eine kleine Korrektur... (das war auf jedenfall eine kleine, schöne Fingerübung)

@gibb: Benutze den Parser, den Stevie verlinkt hat.

[Anhang gelöscht]

himitsu 28. Feb 2012 12:19

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

Zitat von omata (Beitrag 1153369)
Was spricht dagegen ein Tool zu schreiben, das das für einen übernimmt?

Edit: Oh, ich sehe gerade, dass es doch nicht so gut funktioniert. Sorry für den Müll.

Wobei das schon möglich ist, also ein toll, welche diese zeilen in den Quellcode einbaut, wenn man sie haben will und rausbaut, wenn nicht.

Ein echter Precompiler hääte nur den Vorteil, daß er diese Änderung virtuell/temporär/unsichtbar nur wärend des Compilierens machen könnte.

omata 28. Feb 2012 12:22

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Ja natürlich. Mir ging es auch nur darum, dass Problem zu lösen. Leider gibt es eben scheinbar keine schöne Lösung, dann würde ich die auch bevorzugen.

Stevie 28. Feb 2012 12:38

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
AOP in Delphi (Profiling wäre eine der Anwendungsgebiete) beschäftigt mich schon eine Weile und das lässt sich aktuell nur behelfsmäßig über virtual method interception lösen. Alternative wäre eine Art Preprozessor zu bauen oder die Binary nachträglich zu modifizieren.

Aber an dieser Stelle nochmal die Frage: ist es notwendig Bottlenecks in der Anwendung zur Entwicklungszeit zu finden oder Echtzeitdaten beim Kunden in Produktiveinsatz?

schlecki 29. Feb 2012 08:40

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
noch ein ganz pragmatischer Ansatz wäre GpProfile (http://17slon.com/gp/gpprofile/). Da gibt es iirc ein kleines Tool, welches alle Methoden in scannt und instrumentiert - oder auch wieder den original-Zustand herstellt.

Delphi-Quellcode:
procedure Foo
begin
...
end
wird glaube ich zu


Delphi-Quellcode:
procedure Foo
begin
{$ifdef gpprofile}gpStart; try {$endif}
...
{$ifdef gpprofile}finally gpEnd; end; {$endif}
end
wir hatten das ne zeitlang genutzt, haben dann aber die Funktionen gpStart und gpEnd entsprechend angepasst.

Stevie 29. Feb 2012 09:10

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

Zitat von schlecki (Beitrag 1153601)
noch ein ganz pragmatischer Ansatz wäre GpProfile (http://17slon.com/gp/gpprofile/).

Dann solltest du aber auch auf die aktuelle Version verlinken. ;)

gibb 29. Feb 2012 11:14

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Hallo, es geht darum in echtzeit beim Kunden auf seinem System das Festzustellen und nicht in der Entwicklungsphase. Weil der Kunde Entwickelt auch nur hat der kein Tool zur hand & wir auch erst seit kurzem so halb mit welchem er seine Performance probleme Analysieren kann. Unter umständen bedürfen seine Probleme anpassungen im Delphi sourcecode um das zu lösen. Schön wäre halt in dem Moment wenn man da schon einigermassen eingrenzen kann wo das ist und nicht zuerst die Kundendatenbank bei uns nachbauen muss um dann mit einem profiler drüber zu gehen (der unter umständen sowieso nicht funktioniert warum auch immer.)

Also ich fasse zusammen um auch sicher zu sein das ich alles richtig verstanden habe:
- Omata hat nach einem Search Patern gesucht welches Methodenanfänge erkennt um dann dort eine Zeile einzufügen. Und war leider nicht erfolgreich (wäre mein bevorzugter ansatz gewesen. Wenn ich auch nur eine kleine ahnung gehabt hätte wie ich zuverlässig Methodenanfänge erkennen könnte)
-Ich verwende einen Parser um damit einen Methodenanfang zu finden und dort meinen Inhalt einzufügen? Ich habe die pas mal überflogen und auf die schnelle nicht verstanden wie das genau zu verwenden ist.


Gruss Gibb

schlecki 29. Feb 2012 11:37

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
@Stevie: der link ist auf der von mir verlinkten Seite auch vorhanden :)

@gibb
Nein, ich habe eigentlich nur die Methode gezeigt, wie man mit möglichst wenig Aufwand ein Log einbauen kann. Die Aufrufe müssten schon von Hand geschrieben werden. Alternativ könnte man da mit gpProfile was basteln. Da ist zumindest der Parser dabei - ist ja OpenSource.

gibb 29. Feb 2012 12:09

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
tschuldige, ich bin mit den Namen durcheinander gekommen, das war omata...:roll:

gibb 29. Feb 2012 14:57

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
mhmm, ich habe mir gpProfile etwas angeschaut, zumindest die exe. Und die scheint genau das zu machen was ich eigentlich haben möchte zumindest fast ;)

Entweder such ich mir jetzt den Teil aus dem Code raus der das ganze parst oder aber ich kann direkt die exe so konfigurieren das ich es so verwenden kann...

1. wie passe ich den searchpath an für GP Profile? Wenn ich die .dpr öffne findet er nicht alle files weil nicht alle im searchpath von GPProfile sind.
2. Kann ich dem beibringen auch methoden aufzurufen und units zu includen die in meiner Applikation vorhanden sind? Wenn ja wie? resp. wo.

Also ich möchte sozusagen das RAII patern mit der erweiterung für den Methodenname einbinden und halt meine Log funktion aufrufen und nicht die des GpProfile. Damit könnte ich dann einen Kompletten Callstack aus delphi & Scripting herstellen ebenso Zeitmessungen währen möglich und viele andere lustige sachen :D

gibb 29. Feb 2012 16:09

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Hab auch den Source unterdessen gezogen, habs noch nicht kompiliert gekriegt. Auh habe ich noch nicht die Funktion gefunden die die anderen Registriert... leider dachte ich könnte da ev abschauen 8-) wenn jemand also mehr dazu weiss oder weiss wie ich am besten ein Tool schreibe das mir das oben beschriebene ermöglicht... nur immer her damit.

omata 29. Feb 2012 16:20

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

Zitat von gibb (Beitrag 1153682)
... nur immer her damit.

Ja, schön wäre es. Leider ist es hier nicht mehr erwünscht konkrete Beispiele zu veröffentlichen. Blöde Kommentare und/oder Beispiele in binärer Form oder Code, der so abgewandelt ist, dass er nichts mehr mit der eigentlichen Problemstellung zu tun hat, mehr gibt es hier leider nicht. Naja, mal sehen, ob sich jemand erbarmt. Ich habe da allerdings wenig Hoffnung. Und wenn es doch jemand tut, dann wird er nur blöd zusammen gestaucht.

Wie auch immer, Viel Glück... Das ist wirklich eine sehr interessante Problemstellung. Mir juckt es da ja in den Fingern... Aber veröffentlichen werde ich, wenn ich eine Lösung habe, diese ganz bestimmt nicht nochmal hier. (Vielleicht die EXE, das wäre doch super hilfreich).

schlecki 1. Mär 2012 08:42

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

Zitat von gibb (Beitrag 1153671)
Entweder such ich mir jetzt den Teil aus dem Code raus der das ganze parst oder aber ich kann direkt die exe so konfigurieren das ich es so verwenden kann...

1. wie passe ich den searchpath an für GP Profile? Wenn ich die .dpr öffne findet er nicht alle files weil nicht alle im searchpath von GPProfile sind.
2. Kann ich dem beibringen auch methoden aufzurufen und units zu includen die in meiner Applikation vorhanden sind? Wenn ja wie? resp. wo.

Also wir haben den simplen Weg gewählt, die EXE zu verwenden, wie sie ist und dann aber in unserem Programm nicht die originale gpprofile.pas einzubinden sondern eine von uns erstellt Unit. In der Unit werden nur 2 funktion erwartet:

Delphi-Quellcode:
procedure ProfilerEnterProc(procID: integer);
begin
  // create callstack and write to logfile
end;

procedure ProfilerExitProc(procID: integer);
begin
  // do nothing...
end;
und hier kannst du dann implementieren, was du möchtest :) Einziger wirklicher Nachteil ist, dass man ein Mapping ID => Name braucht. Den Callstack kannst du ja auch hier rausziehen - dann wäre ggf. auch die ID wieder egal ;)

gibb 1. Mär 2012 10:22

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

Zitat von omata (Beitrag 1153686)
Ja, schön wäre es. Leider ist es hier nicht mehr erwünscht konkrete Beispiele zu veröffentlichen. Blöde Kommentare und/oder Beispiele in binärer Form oder Code, der so abgewandelt ist, dass er nichts mehr mit der eigentlichen Problemstellung zu tun hat, mehr gibt es hier leider nicht. Naja, mal sehen, ob sich jemand erbarmt. Ich habe da allerdings wenig Hoffnung. Und wenn es doch jemand tut, dann wird er nur blöd zusammen gestaucht.

Wie auch immer, Viel Glück... Das ist wirklich eine sehr interessante Problemstellung. Mir juckt es da ja in den Fingern... Aber veröffentlichen werde ich, wenn ich eine Lösung habe, diese ganz bestimmt nicht nochmal hier. (Vielleicht die EXE, das wäre doch super hilfreich).

Muss ich das verstehen? Ich habe wohl was verpasst oder ist da was per PM gelaufen :?:

Dann bleibt aber meine frage, wie erweitere ich den Searchpath von GPprofile?

Gruss Gibb

gibb 2. Mär 2012 09:22

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Hallo zusammen,

ich habe 2 Probleme... 1. Ich glaube ich hab noch nicht ganz verstanden wie der GPProfiler verwendet werden soll... die Idee ist das ich die 2 Units meinem Projekt Hinzufüge ist das Korrekt?

2.Wer weiss wo man die Jediklasse findet den methodenname aus dem Callstack ausliest? Problem ist folgendes: Ich find per google nur Starwars jedi ritter ;)

pHL 2. Mär 2012 09:37

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

http://www.delphi-jedi.org/

mfg

Codewalker 2. Mär 2012 09:39

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

Zitat von pHL (Beitrag 1154034)

Das hilft doch auch nicht, wenn man nicht genau weiß wonach man sucht.
Die Unit heißt JclDebug hat hat Methoden wie LineByLevel, ProcByLevel, FileByLevel. In der gleichen Methode ist Level = 0, wenn den direkten Aufrufer haben will 1, usw.

gibb 2. Mär 2012 12:29

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Ich hab mir unterdessen die komplette JCL installiert... wenn ich jedoch die Unit die du mir genannt hast use und die funktion aufrufe kriege ich einen Leerstring zurück... das lässt mich vermuten das ich irgendwas nicht richtig initialisiere... Result ist leer und beinhaltet daher auch keinen . ... was muss ich machen damit das aktiv wird?

himitsu 2. Mär 2012 12:57

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Wenn keine entsprechenden Debuginfos einkompiliert sind, dann kann die Funktion natürlich auch nichts finden.

gibb 2. Mär 2012 13:06

AW: Start und Stop jeder Methode Tracen an nur einer stelle Implementieren
 
Ja das hab ich unterdessen auch gemerkt :roll:

Aber das ganze funktioniert jetzt :thumb:

Was aber einwenig umständlich ist jetzt das zuerst mit GPProfiler die entsprechenden Units eingebunden werden müssen (Was nicht bei allen geht weil der Searchpath nicht alle units beinhaltet. In der IDE haben wir zusätzliche Pfade angegeben. Geht das nicht auch irgendwie beim GPProfiler?)

Dann muss bei der IDE die JCL installiert sein. Nur mit den Units gehts ja nicht ;)

Gruss Sev


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr.
Seite 2 von 2     12   

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