Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie spühre ich unsichtbare Programmfehler auf? (https://www.delphipraxis.net/139804-wie-spuehre-ich-unsichtbare-programmfehler-auf.html)

daredd 5. Sep 2009 21:26


Wie spühre ich unsichtbare Programmfehler auf?
 
Hallo Freunde,

ich habe ein Programm, das in Delphi geschrieben wurde. Es arbeitet zusammen mit einer Datenbank (GDB auf Firebird Server mit BDE).

Nun ist es so das es nach einer gewissen Zeit einfach nur hängen bleibt, bzw. sehr langsam läuft.
Ich vermute es liegt an der BDE oder an der Datenbank an sich, je mehr Daten in der Datenbank gespeichert sind, desto langsamer wird das Programm mit der Zeit.


Kann mir einer von euch ein tipp geben? Gibt es irgendein Tool womit ich das Programm durchlaufen lassen kann um evtl. Fehlerstellen zu finden?

omata 5. Sep 2009 21:55

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Benutze FastMM, um das Programm auf Speicherlecks zu überprüfen.

daredd 5. Sep 2009 22:22

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Ah, stimmt! Davon habe ich schon mal gehört.

Kannst du mir sagen wo ich es her bekomme? Das muss man doch irgendwie ins Delphi-Projekt mit einbinden oder?

himitsu 5. Sep 2009 23:32

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Welche Delphi-Version hast du denn?

In neueren Delphis ist ja eine nicht ganz atuelle und wohl etwas abgespeckte Version davon enthalten.
(der alte schlechtere Delphi-MemoryManager wurde mal dadurch ersetezt)

ansonsten Bei Google suchenFastMM (man mag's kaum glauben ... gleich ganz oben zu finden :angel: )

Elvis 6. Sep 2009 07:58

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Benenne die DB unbedingt um!
GDB ist eine magische Endung, die seit XP für irgendwelche Sicherungsdienste benutzt wird.
Windows wird dich so schnell ausbremsen, dass es nicht mehr lustig ist.

Ansonsten, falls es das nicht war, gibt es IMO keine richtigen, automatischen Sampling und Profiling tools für Delphi.
AQTime kommt aber nahe ran (ist aber ewig her als ich es das letzte Mal angefasst habe).
Du willst ja genau wissen was langsam wird und dich darauf konzentrieren, anstatt die ganze App zu kaputtoptimieren.

alzaimar 6. Sep 2009 08:21

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Die Aussage 'es wird immer langsamer' ist reichlich unpräzise.
Was wird langsamer? Wo? Welche Aktion ist betroffen?

Präzisiere dein Problem, analyisere es und kreise es ein. Programme sind immer noch deterministisch, sodaß man so eine Performancebremse relativ schnell durch Eingrenzung finden kann.

daredd 6. Sep 2009 18:56

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Gut, danke Leute.
Ich werde das mal ausprobieren.

@ Elvis:

Wie meinst du das mit Datenbank umbennen? Die Endung .gdb kann ich doch nicht einfach so weg nehmen?

Elvis 6. Sep 2009 19:26

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Zitat:

Zitat von daredd
Gut, danke Leute.
Ich werde das mal ausprobieren.
@ Elvis:
Wie meinst du das mit Datenbank umbennen? Die Endung .gdb kann ich doch nicht einfach so weg nehmen?

Warum denn nicht?
Dateiendungen sind doch eigentlich nur nur ein Relikt aus der DOS-Ära und eigentlich relativ belanglos.
Nunja, außer wenn sie .GDB heißt, dann wird Windows nämlich irgendwelchen Käse bei allen Änderungen verzapfen.
Wenn ich mich recht entsinne waren es ständige Shadow copies, weiß es aber nicht genau.
Ist auch nicht wichtig. Ändere sie ASAP zu irgendwas != GDB. Das kann fdb sein, das kann auch .HeinzAugustFerdinandOlafDB sein.
Das ist ein Problem, welches seit 2002 :!: eigentlich immer und überall und in jeder Readme ud FAQ zu finden sein sollte, die auch nur weitläufig etwas mit Interbase oder Firebird zu tun hat, mehrfach und ausführlich beschrieben sein sollte. ;-)

Blup 7. Sep 2009 07:28

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Falls das Programm nach einem Neustart wieder schneller läuft, kommt als Ursache eine Transaktion in Frage, die nicht beendet wird.
Wenn es sich um die Transaktion handelt, in der die Daten eingefügt werden, einfach Commit zwischendurch aufrufen.
Es könnte sich aber um eine andere Transaktion handeln(z.B. für irgendwelche datensensitive Steuerelemente zur Anzeige).
Da sich der Server jeden Zustand der Daten seit dem Start der ältesten Transaktion merken muss, sollten auch solche Transaktionen regelmäßig geschlossen und neu geöffnet werden.

Das Problem mit der GDB-Dateiendung tritt nur beim Öffnen solcher Dateien auf. Windows erstellt dann je nach Konfiguration eine Kopie der Datenbank. Viel gefährlicher ist in diesem Zusammenhang, daß die aktuelle Datenbank z.B. bei einer Systemwiederherstellung automatisch durch eine ältere Version ersetzt werden könnte.

daredd 8. Sep 2009 22:36

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Vielen Dank Blup! Und cooler Nickname :)

daredd 13. Sep 2009 12:58

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Mal ne Frage:

Um mit FastMM zu arbeiten muss ich die Units FastMM und FastMMMessages in den selben Ordener packen wo mein Projekt ist und dann über uses ins Projekt einbinden. Soll das in alle units, meines Delphi-projects, eingebunden werden?
Wozu dient das FastMMMessages und ist es besser eine Translation (german) zu nehmen?

Sorry für die dummen fragen, aber ich möchte nichts falsch machen.

alzaimar 13. Sep 2009 13:00

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Googeln? Wieso googelst Du nicht, schaust in die Beschreibung und versuchst, die Antwort selbst zu finden? In den FastMM-Quellen steht alles drin.

daredd 13. Sep 2009 19:38

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Hi Leutz,

ich habe nun FastMM4 in mein Project mit eingebunden.

Und wo kann ich nun die "Fulldebugmode"- und "Logmemoryleaktofile"-Definitionen einstellen?

jaenicke 13. Sep 2009 19:46

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Es gibt eine Includedatei (FastMM4Config.inc oder so glaube ich :stupid: ), in der das festgelegt werden kann.

Klaus01 13. Sep 2009 19:47

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Guten Abend,

das kannst Du in den "FastMM4Options.inc" machen.

Grüße
Klaus

daredd 15. Sep 2009 18:30

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Also Jungs,

in der FastMM4Options.inc steht nur drin was der FulldebugMode bewirkt und das man eine FastMM_FulldebugMode.dll braucht und dann steht da noch etwas von {.$define FullDebugMode}.

Ich versteh nicht wo ich da was ändern soll/kann?

Vielen Dank!

himitsu 15. Sep 2009 18:58

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
nach mal den Punkt da raus :zwinker: {$

HiWieGehts 15. Sep 2009 20:19

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Bei so exakten Fehlerbeschreibungen wie in diesem Fall - das Programm wird langsamer - ist es nicht leicht zu helfen. ist das programm langsam, wenn viele Datensätze auf einmal eingefügt werden? Ist das Programm bereits beim Start langsam wenn viele Datensätzein der DB sind? Usw.
Ich würde mit den verfügbaren Infos auf einen fehlenden Index tippen.

daredd 15. Sep 2009 21:20

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
@Himitsu:

ich habe den Punkt weggenommen. Nun will ich das Programm ausführen und es bleib nach 1 sek. stehen und zeigt mir das CPU-Fenster in delphi, wenn ich auf weiter ausführen drücke kommt eine Fehlermeldung das mein Programm für Windows nicht mehr funktioniert ...
was kann das sein?

@HiWieGehts:

Das Programm bleibt manchmal hängen, wenn man länger als 2 std. damit arbeitet.
Und je mehr Daten ich in die Datenbank mit der Zeit bekomme, desto schneller führt es zu abstürzen. Das heißt, nach etwas einem Monat (viele Daten) kann das Programm schon nach 45 min. abkratzen. Also je nach dem wie es will, manchmal schneller manchmal später.

p80286 16. Sep 2009 09:37

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Zitat:

Zitat von daredd

Das Programm bleibt manchmal hängen, wenn man länger als 2 std. damit arbeitet.
Und je mehr Daten ich in die Datenbank mit der Zeit bekomme, desto schneller führt es zu abstürzen. Das heißt, nach etwas einem Monat (viele Daten) kann das Programm schon nach 45 min. abkratzen. Also je nach dem wie es will, manchmal schneller manchmal später.

Tut mir leid, das ist nicht sehr aussgekräftig. Was heißt "hängen"? ist das vielleicht eine Endlosschleife? Wie äußert sich der Absturz? Gibt es da eine Fehlermeldung? Gibt es Hinweise im Event-Viewer?

Wie schon in #6 erwähnt führen Programme KEIN Eigenleben oder noch besser:

Programme führen Anweisungen aus, keine Wünsche.

Gruß
K-H

Sir Rufo 16. Sep 2009 09:54

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
"Ein Computer (ein Programm) macht genau das, was ich ihm sage!"
wie im wahren Leben klafft aber teilweise ein große Lücke zwischen dem Gesagten und dem Gewünschten.

Hast Du in deinem Programm eine Log-Funktion?

Nein -> Baue eine ein
Ja -> Erweitere die Log-Ausgaben um weitere relevanten Daten

Relevante Daten:

- In jedem except-Teil den Wert von E.Message in die Log schreiben

- Zähle doch mit wieviele Daten dein Programm bislang verarbeitet hat,
vielleicht landest du immer beim ähnlichen Wert (z.B. nach ca. 2GB Daten Absturz)

Manchmal hilft es auch "jeden Scheiß" in die Log-Datei zu schreiben.
Damit dieses aber auch nur in der "Debug"-Version deines Programms erfolgt,
solltest du diese Zeilen für das Log-Schreiben mit einem Compiler-Schalter kapseln.
Delphi-Quellcode:
{$IFDEF DEBUG} SchreibeLog( 'Hier ist alles toll' ); {$ENDIF}
Auf FastMM, etc. gehe ich nicht weiter ein, darauf wurde hier schon ausführlich hingewiesen.

cu

Oliver

daredd 28. Sep 2009 08:10

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Hallo Freunde,

ich habe nun wie ihr mir zuvor beschrieben habt die Punkte vor FulldebugMode und LogMemoryLeakDetailToFile weggenommen, trozdem kommt nur diese eine Meldung.

---------------------------
MetaBioWave.exe: Speicherleck entdeckt
---------------------------
Diese Anwendung hat Speicher-Lecks. Die kleineren Speicher-Lecks sind (ausschließlich von Zeigern registrierte Lecks):



13 - 20 bytes: TMRotateItem x 1, Unbekannt x 1

21 - 28 bytes: TMRotateList x 1

53 - 60 bytes: TBitmap x 1, AnsiString x 1

109 - 116 bytes: TBitmapImage x 1



Hinweis: Um eine Protokolldatei zu erhalten, die Details über Speicherlecks enthält, aktivieren Sie die "{$ FullDebugMode}" und "{$ LogMemoryLeakDetailToFile}" Definitionen. Um die Speicherleckprüfung zu deaktivieren, deaktivieren sie die "{$ EnableMemoryLeakReporting} -Option".


---------------------------
OK
---------------------------

Warum?
Oder wird das Protokoll in ein Dokument abgepeichert welches ich gerade nicht finden kann?

THX

daredd 28. Sep 2009 10:39

Re: Wie spühre ich unsichtbare Programmfehler auf?
 
Kann mir hier etwa keiner sagen wie ich das FastMM protokoll bekomme????? :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 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