AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Allgemein: Wie findet man einen Fehler?

Ein Thema von nezumi7 · begonnen am 12. Dez 2014 · letzter Beitrag vom 12. Dez 2014
Antwort Antwort
Seite 1 von 2  1 2      
nezumi7

Registriert seit: 11. Apr 2011
71 Beiträge
 
#1

Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 09:01
Liebe Alle,

ich schreibe gerade ein Prog (Delphi 6), das mir beim Gitarre-lernen helfen soll (man gibt Akkorde in ein RichEdit ein und die werden dann aus einer Resource geladen und abgespielt). Funktioniert alles super, wegen der vielen Einstellungsmöglichkeiten (Takt, Auf- / Abschläge, Wiederholungen, Geschwindigkeit etc.) ist das Programm ziemlich umfangreich geworden.

Leider tritt immer wieder ein Fehler auf, allerdings sehr selten und ohne erkennbaren Anlass, so dass es mir kaum möglich ist, den irgendwie zu reproduzieren. Von der Fehlermeldung habe ich den angehängten Screenshot gemacht. Für mich ist das völlig unverständlich.

Kann man da irgendeine Information rausziehen, die einem bei der Fehlersuche helfen könnte oder wie geht man da am besten vor?

(der Quellcode ist ein paar tausend Zeilen lang, so dass ich mal davon absehe, ihn hier zu posten).

Greetings,
Stephan.
Miniaturansicht angehängter Grafiken
fehler.jpg  
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 09:11
Hallo,

installiere MadExcept.


Heiko
Heiko
  Mit Zitat antworten Zitat
nezumi7

Registriert seit: 11. Apr 2011
71 Beiträge
 
#3

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 09:17
irre, was es so alles gibt.

Danke für den Tip, werde ich gleich mal ausprobieren
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:03
Aus der CPU-Ansicht kann man selten die fehlerverursachende Stelle erkennen.
Wichtiger wäre hier ein Blick in den Stacktrace (Ansicht > Debug-Fenser > Aufruf-Stack), denn da sieht man nicht nur die aktuelle Stelle (wo es nach dem Knall hängen blieb), sondern auch wo der Aufruf her kann. (mit etwas Glück auch die Stelle, deines Codes, welche zuletzt ausgeführt wurde)

Wenn es im laufenden Betrieb auftritt, ohne daß man einen Debugger dran hat, dann kann man sich mit dem Debugger auch naträglich verbinden und schauen wo es hängt.
Den Fehlerdialog nicht wegmachen > Delphi staten > Start > Mit Prozess verbinden > uns los geht es.
(bei Erekalog geht das nicht, da dieses Mistding den Fehlerthread weiterlaufen lässt und den Fehlerdialog in einem anderen Thrad anzeigt ... oder irgendwie sowas, aber zum Glück zeigen die einen eigenen Stacktrace an, womit nicht gleich alles verloren ist)

Neben MadExcept gibt es auch noch EurekaLog uvm.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nezumi7

Registriert seit: 11. Apr 2011
71 Beiträge
 
#5

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:12
Danke himitsu,

da ich bei madexcept noch nicht so richtig durchsteige, werde ich auch Deine Tips versuchen.

Letztlich muss ich aber bei allen Varianten warten, bis der Fehler mal wieder auftritt, oder?
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:13
Ich würde deinen Code mit Fail fast - Anweisungen spicken. Die tun nicht weh (im Gegenteil) und machen die Anwendung i.A. auch nicht langsamer.

Fail fast bedeutet: Wenn Du irgend etwas suchst, ermittelst oder berechnest, fragst Du sofort danach ('fast') ab, ob das Ergebnis im Rahmen dessen ist, was Du erwartest. Wenn nicht, sofort mit einer Exception abbrechen ('fail').

Delphi-Quellcode:
myObject := FindMyObject(someSearchCriteria);
if not Assiged(myObject) then raise Exception.Create('myObject is not set');
Deine Methoden prüfen als allererstes, ob die übergebenen Parameter gültig sind.
Delphi-Quellcode:
Procedure TMyClass.SomeObject (someParameter : TParameter);
Begin
  if not Assiged(someParameter ) then raise Exception.Create('someParameter is not set');
  ...
Dafür gibt es zudem die 'Assert' ('Stelle sicher das...') Methode...
Delphi-Quellcode:
myObject := FindMyObject(someSearchCriteria);
Assert (Assiged(myObject),'myObject is not set');
...
Procedure TMyClass.SomeObject (someParameter : TParameter);
Begin
  Assert (Assiged(someParameter), 'someParameter is not set.');
  ...
Dann schalte noch die Bereichsprüfung an (Compiler-Optionen), um sicherzugehen, das Du immer auf gültige Arrayelemente zugreifst.

Und zum Schluss: Beschäftige dich mit Unit-Tests. Klar, für ein Hobbyprojekt ein leichter Overkill, aber wenn man das mal gefressen hat, schreibt man einfach schneller richtig gut funktionierende Programme.
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:20
Hallo Gemeinde,

wo wir schon bei dem Thema sind hätte ich dazu auch noch eine Frage:

Bei mir ranzt mein Programm beim herunterfahren ab(genauen Fehler kann ich gerne bei Bedarf nachliefern). Ich habe Eurekalog laufen und bekomme auch einen wunderbaren callstack, ABER: es schein irgendwas mit irgendeinem Null-Pointer im Destruktor von einem TAdvEdit zu sein....und es tauchen nirgendwo meine Quellen in dem Stack auf...Was nun?
(ich glaube ich hatte sowas ähnliches schon mal war irgendwas mit nem TadvEdit auf nem Gridpanel
(bitte keine Kommentare zur Architektur ) kann mich aber nicht mehr erinnern was das war bzw wie ich das gelöst habe)

Hat irgendwer ne Idee, wie ich dahinterkomme, welches meiner vielen AdvEdits da ein Problem hat?

Danke schon mal im voraus!

Gruß
Dirk
Dirk
  Mit Zitat antworten Zitat
nezumi7

Registriert seit: 11. Apr 2011
71 Beiträge
 
#8

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:39
Danke Dejan Vu,

für einen Sonntag-Nachmittags Programmierer wie mich ist das starker Tobak, ich würde es aber trotzdem gerne mal so versuchen, weiß aber nicht so recht wie.

Ich glaube, dass der Fehler bei meinem Timer liegt und poste mal den extrem gekürzten Code hierzu

Delphi-Quellcode:
procedure TimeCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); pascal;
begin
With Form1 do begin
TimerEvent.Execute;
end;
end;

procedure StartTimer(ms: Integer);
begin
 mmResult := TimeSetEvent(ms, 0, @TimeCallBack, 0, TIME_PERIODIC);
end;

procedure StopTimer;
begin
 TimeKillEvent(mmResult);
end;


procedure TForm1.startplayExecute(Sender: TObject);
begin
StartTimer(intervall);
end;


procedure TForm1.TimerEventExecute(Sender: TObject);
begin
chrd := sl.Strings[z];
If chrd <> 'then PlaySound(PChar(chrd), hInstance, snd_ASync or snd_Resource);
inc(z);
end;
Bitte nicht so kritisch anschauen, ich habs so stark gekürzt, dass es so nicht funktioniert, ich will nur das Prinzip verdeutlichen. Wie müsste ich da jetzt deine fail fast Abfrage einbauen?
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#9

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:48
Hi nezumi,


wie du da sinnvoll die Asserts einbaust weiss ich auch gerade nicht, aber wenn ich mir deinen Code so ansehe

Danke Dejan Vu,
Delphi-Quellcode:
 
procedure TForm1.TimerEventExecute(Sender: TObject);
begin
chrd := sl.Strings[z];
If chrd <> 'then PlaySound(PChar(chrd), hInstance, snd_ASync or snd_Resource);
inc(z);
end;
dann sehe ich da sofort einen Kandidaten, der mir suspekt vorkommt:
sl.Strings[z]; und inc(z);

Wie stellst du denn sicher, dass z nie grösser wird als die Stringlist?

Gruß
Dirk
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#10

AW: Allgemein: Wie findet man einen Fehler?

  Alt 12. Dez 2014, 10:49
Zitat:
Hat irgendwer ne Idee, wie ich dahinterkomme, welches meiner vielen AdvEdits da ein Problem hat?
Hast du mal versucht dein Programm schrittweise zu beenden? (Haltepunkt und dann F7)

Zitat:
Letztlich muss ich aber bei allen Varianten warten, bis der Fehler mal wieder auftritt, oder?
Ja, aber zum Probieren kannst du dir ja erstmal selber irgendwo einen Fehler erzeugen raise Exception.Create('Mein Test-Fehler'); .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
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