Autor |
Beitrag |
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 26.12.07 11:11
Ich stehe vor dem Problem, dass ein Programm von mir auf einem Rechner nicht starten will. Es bricht während des Startvorgangs mit einer AV ab. Auf den Rechner habe ich keinen Zugriff, und Delphi gibts da auch nicht. Da der Startvorgang recht umfangreich ist, möchte ich eine Version des Programms schreiben, die sämtliche Aktionen in ein Logfile schreibt. Nach dem letzten Eintrag muss dann ja irgendwo der Haken sein.
Die Frage ist, wie mach ich das prinzipiell am besten? Am sinnvollsten erscheint mir, das über einen Compilerschalter zu machen, damit der Code in der richtigen Version des Programmes gar nicht drin ist. Oder ist eine Steuerung über einen Startparameter sinnvoller? Da würden mich nur erstmal die ständigen Abfragen stören, die dann ja immer durchgeführt werden, auch wenn das Programm stabil läuft.
Der Nachteil einer gesonderten Version wäre doppeltes Compilieren und verteilen der Datei, d.h. man kann dem Nutzer nicht sagen "Führ mal diese bat-Datei aus", sondern muss ihm ein neues Programm schicken...
Was meint ihr?
_________________ We are, we were and will not be.
|
|
Regan
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Mi 26.12.07 11:18
Ich hatte auch mal das Problem. Allerdings bei einer dll. Ich habe mir dann einfach eine procedure AddLog(const S:String); geschrieben, mit der ich den Log fülle. Dazu hab ich einfach eine neue dll mit dem alten quellcode erstellt. Dann habe ich mir im Hauptprogramm ein Admin-Panel gemacht (ist bei mir in allen Programmen drin, man muss nur den ini-Schalter kennen  ), auf das ich Buttons mit verschiedenen Funktionen gelegt habe. Ich weiß nicht, ob es da andere Möglichkeiten gibt, aber ich würde diese Methode wieder verwenden, da man alles ganz genau protokollieren kann.
Edit: Rechtschreibung...
|
|
Gausi 
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 26.12.07 11:37
Mir geht es halt einfach darum, wie man diese Log-Funktion generell in den Code einbaut, und dabei den "Normalbetrieb" des Programms nicht oder so gut wie nicht stört. Ich hab sowas noch nicht wirklich gemacht, erst recht nicht bei größeren Programmen, die schon im Umlauf sind und damit (zumindest teilweise) nachträglich ausgestattet werden sollen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| for i := 0 to Ganzviel do begin {$IFDEF Use_Log}Log('machwas');{$ENDIF} machwas; {$IFDEF Use_Log}Log('machnochwas');{$ENDIF} machnochwas; end;
for i := 0 to Ganzviel do begin if Use_Log then Log('machwas'); machwas; if Use_Log Log('machnochwas'); machnochwas; end;
|
Problem bei mir ist auch, dass der Fehler sehr früh auftritt, noch vor oder zumindest während MainForm.Create.
_________________ We are, we were and will not be.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 26.12.07 13:03
Wir haben das so gelöst:
Wir haben Debugausgaben in der SW (ach was). Diese werden über eine einzige Routine gebündelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Procedure AddLog (Const aModule, aProcedure, aMessage : String); Begin If not InDebugMode Then Exit; .... End;
Initialization InDebugMode := FileExists (ExtractFilePath(ParamStr(0))+'Debug.TXT'); End. |
Der Trick ist nun der, das wir über die Existenz der Datei 'Debug.TXT' steuern, ob Debugausgaben erfolgen sollen, oder nicht. Wenn der Anwender nach einem Jahr auf ein reproduzierbares Problem stößt, weisen wir ihn an, diese Datei zu erstellen und das Programm neu zu starten.
Die Steuerdatei könnte auch in jedem anderen Ordner stehen, oder es kann sich um einen Registryeintrag handeln o.ä. Wir haben nur versucht, es dem DAO so einfach wie möglich zu machen.
Klar blähen die Debugausgaben die Anwendung auf, aber lieber so, als dem Kunden eine neue EXE zu schicken.
Nebenbei: Fujitsu-Siemens-PC aus den Jahren 2004-2007 haben eine Macke in der Grafikkarte, die dazu führt, das einige Delphi-Anwendungen beim Start abkacken. Es gibt so ein DirectX-Testtool von Windows, Man erkennt diese Idioten-PC, das die Buttons eingegraut sind.
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 26.12.07 13:14
Wenn Du weißt, dass eine Exception-Adresse innerhalb deines Programmes geliefert wird, dann könnte auch OmMAP hilfreich sein. Der Kunde bekommt dann ganz normal die Version ohne Debug-Infos, Du behälst aber eine Kopie der MAP-File der herausgegebenen Version. Im Fehlerfalle kannst Du dann mit OmMAP und der Exception-Adresse die Fehlerstelle etwas eingrenzen.
Wenn ferner der Fehlerberichterstattungsdienst von XP läuft, lass Dir die vollen Details von dort geben. Aus dem dort enthaltenen Stack Dump lässt sich ein Teil des Callstacks rekonstruieren.
Es hat bereits Moderatoren gegeben, die damit Fehler gefunden haben, die RICHTIG selten nur auftraten. 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Mi 26.12.07 13:41
BenBE hat folgendes geschrieben: | Es hat bereits Moderatoren gegeben, die damit Fehler gefunden haben, die RICHTIG selten nur auftraten.  |
Ist das etwas besonderes das es Moderatoren waren? 
_________________ Ein Nutzer der Ecke
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 26.12.07 15:16
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|