Entwickler-Ecke

Sonstiges (Delphi) - Hilfe! Programm friert willkürlich ein


freedy - Do 29.01.09 12:29
Titel: Hilfe! Programm friert willkürlich ein


Narses - Do 29.01.09 14:06
Titel: Re: Hilfe! Programm friert willkürlich ein
Moin!

Hm, Code-Woodoo... :? :lol:

user profile iconfreedy hat folgendes geschrieben Zum zitierten Posting springen:

Quelltext
1:
2:
3:
disassembling:
00479318      public Classes.TThreadList.LockList:  ; function entry point
00479328      > call    -$705ad ($408d80)      ; Windows.EnterCriticalSection


Könnt ihr mal schauen, was euch auffällt. Vom Disassembling verstehe ich leider nichts,
Ich habe auch keinen blassen Schimmer von dem Stück Assembler, aber die Kommentare sind interessant: wenn du mit einer CritialSection zwei Threads in einen Deadlock bringst, dann bleibt dir die Anwendung jedenfalls hängen. :idea:

user profile iconfreedy hat folgendes geschrieben Zum zitierten Posting springen:
Sobald ich Code-Teile herausnehme, läuft die Software wieder. Dazu noch ein Beispiel:

Auf einem PC friert das Programm ein, wenn ich einen Button drücke. Es wird probiert, ein Handle zu holen. Füge ich in einer total fremden Funktion drei Zeilen ein, die damit überhaupt nichts zu tun haben, geht es.
Das wiederum ist ein klassischer Hinweis auf "wir-schreiben-in-Speicher-der-uns-nicht-gehört"... ;) Besonders interessante Effekte ergeben sich bei lokalen Variablen und dynamischen Arrays. :idea: Mach mal die Bereichsprüfung an. ;)

cu
Narses


matze - Fr 30.01.09 09:53

Evntuell wäre es sogar gar nicht verkehrt, wenn du deinen Code einfach mal herzeigst... :roll:


freedy - Mo 02.02.09 10:26
Titel: Re: Hilfe! Programm friert willkürlich ein
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe auch keinen blassen Schimmer von dem Stück Assembler, aber die Kommentare sind interessant: wenn du mit einer CritialSection zwei Threads in einen Deadlock bringst, dann bleibt dir die Anwendung jedenfalls hängen. :idea:


Der klassische Deadlock ist mir klar. Spricht ja auch für die Reproduzierbarkeit und die Kommentare in dem Bugreport. Da der Deadlock aber sehr weit unten auftritt, weiß ich noch nicht, wie ich ihn beheben kann / soll.
Dagegen spricht - das sage ich jetzt mal so intuitiv - dass sich das Programm auf anderen Rechner komplett anders verhält.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Das wiederum ist ein klassischer Hinweis auf "wir-schreiben-in-Speicher-der-uns-nicht-gehört"... ;) Besonders interessante Effekte ergeben sich bei lokalen Variablen und dynamischen Arrays. :idea: Mach mal die Bereichsprüfung an. ;)


Die Bereichsüberprüfung ist bei mir generell eingeschaltet. An Speicher-Fehler habe ich auch schon gedacht. Weiß aber nicht, wie das ausgetestet werden kann.

user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
Evntuell wäre es sogar gar nicht verkehrt, wenn du deinen Code einfach mal herzeigst... :roll:


Die Veröffentlichung des Source-Codes gestaltet sich etwas schwierig. Zum einen tritt der Fehler nur auf, wenn ich ihn komplett kompiliere (ohne auskommentierende Kompilerschalter). Zum anderen umfasst er inzwischen mehr als 8 MB in ca. 100 Dateien. Ich halte diese Lösung daher für wenig sinnvoll.


Kennt ihr ein Tutorial oder eine andere gute Debug-Software für Delphi, mit der die Fehler besser ausgetestet werden können?

Grüße
Micha


GTA-Place - Mo 02.02.09 12:26

Würd mich auch interessieren, obs da ein geschicktes Debug-Tool gibt. Mein Programm verwendet von den Jedis TJvAVICapture und beim Wechseln zwischen den Registerkarten vom TPageControl hängt sich das Programm meistens auf. Da wollte ich auch mal ein wenig "rumdebugen".


delfiphan - Mo 02.02.09 13:08

user profile iconfreedy hat folgendes geschrieben Zum zitierten Posting springen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
00492773 +03b SysCon.exe Graphics                2446   +4 TCanvas.Draw
00bbb99b +22b SysCon.exe AdvProgressBar          1101  +59 TAdvProgressBar.Paint
00bbbbd2 +04a SysCon.exe AdvProgressBar          1202   +5 TAdvProgressBar.SetPosition
00c0f1b8 +620 SysCon.exe Form_Main               7724 +167 TfrmSysConMain.UpdateToolBars
00c04ebf +027 SysCon.exe Form_Main               3516   +4 TfrmSysConMain.ControllerStatusChange
006a141e +0e2 SysCon.exe Object_SysCon            898  +11 TEventHandler.StatusChanged
00698dba +16a SysCon.exe Object_Controller       1221  +38 TController.SetStatus
00699e14 +258 SysCon.exe Object_Controller       1614  +43 TController.ReceiveBuffer
006956bb +0b7 SysCon.exe Object_Communication     750   +7 TTCPConnection.Receive
00595b58 +254 SysCon.exe Object_ProtocolAdapter   351  +83 TParseThread.ParseQueue
005958ce +016 SysCon.exe Object_ProtocolAdapter   240   +5 TParseThread.Execute

Du manipulierst in TParseThread Controls auf TfrmSysConMain. Das geht schon mal nicht.

-> Updates mit TThread.Synchronize durchführen (oder asynchron mit TThread.Queue/PostMessage - in diesem Fall am besten eine eigene Klasse fürs Messaging schreiben).


freedy - Mo 02.02.09 16:05

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:

-> Updates mit TThread.Synchronize durchführen (oder asynchron mit TThread.Queue/PostMessage - in diesem Fall am besten eine eigene Klasse fürs Messaging schreiben).



Danke! Das war die Lösung. Ich wundere mich nur, warum das Ganze fast 3 Jahre OHNE diesen Fehler funktionierte.

Grüße
Micha