Autor |
Beitrag |
Stephan.Woebbeking
      
Beiträge: 97
|
Verfasst: Di 10.04.12 16:48
Hallo *,
ich hab da mal wieder ein Problem. Ich habe eine Prozedur deren Code komplett ausgeführt wird. Erst beim Verlassen, d.h. wenn der Debugger schon auf dem schliessenden "end;" steht, bekomme ich eine Fehlermeldung hinsichtlich einer unzulässigen Zeigeroperation (siehe Screenshot).
Jemand eine Idee für mich?
Danke,
Stephan
Einloggen, um Attachments anzusehen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 10.04.12 18:34
Moin!
Klassisch für dieses Symptom: Speicher überschrieben, z.B. eine lokale Variable. RangeChecking aktivieren, nochmal testen. Code durchgehen und sicherstellen, dass keine Bereichsüberschreitungen auftreten können, notfalls Assertions einbauen, die das sicherstellen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 10.04.12 23:24
Das sieht für mich so aus als würdest du Speicher in einem UDP-Event freigeben und danach dann in dem Buttonklick wieder darauf zugreifen. Aber viel mehr kann man von außen ohne ein wenig Code nicht dazu sagen...
Ich kann mich aber auch dunkel daran erinnern, dass jemand Speicherprobleme mit einer TMS-Komponente hatte, ich glaube genau mit dieser Buttonklasse. Ich weiß nicht, ob das hiermit etwas zu tun haben kann, aber du könntest einfach mal einen normalen Button ausprobieren, ob es dann immer noch passiert.
|
|
Stephan.Woebbeking 
      
Beiträge: 97
|
Verfasst: Mi 11.04.12 09:29
Danke für die schnellen Antworten!!!  )
Am Button liegt es nicht, das habe ich nach euren Hinweisen als Erstes überprüft. Die Punkte gehen diesmal also an Narses, es war tatsächlich ein Bereichsüberlauf... Weiß auch nicht, warum das ausgeschaltet war, ich wäre davon ausgegangen, dass solche Fehler automatisch gut erkennbar reported werden?!? Zumal das ein klassischer Fehler ( SetLength( a, High() - Low() ), ohne +1 ) war der schon seit Urzeiten in dem Programm sein muss (auch an mehreren Stellen, hab ich von einem Kollegen geerbt). Warum das erst jetzt oder gerade jetzt zu Problemen geführt hat kann ich mir nicht erklären...
Vielen Dank für die Tips!
Stephan
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.04.12 09:56
Stephan.Woebbeking hat folgendes geschrieben : | Weiß auch nicht, warum das ausgeschaltet war, ich wäre davon ausgegangen, dass solche Fehler automatisch gut erkennbar reported werden?!? |
Nur, wenn es zum Debuggen aktiviert wird. In der Releaseversion sollte das normalerweise deaktiviert sein, da es Geschwindigkeitseinbußen zur Folge haben kann. (Denn es wird ja bei jeder einzelnen Operation Prüfcode eingefügt.)
Dafür gibt es bei aktuellen Delphiversionen getrennte Debug- und Releasekonfigurationen beim Kompilieren.
|
|
Stephan.Woebbeking 
      
Beiträge: 97
|
Verfasst: Do 12.04.12 12:27
Ja, die kenne ich... nachdem ich jetzt die Bereichsüberprüfung aktiviert hab, habe ich ein ganz anderes Problem: Eine Unit die ich verwende - deren Funktionsweise ich auch noch nicht verstanden habe - erzeugt jetzt Bereichsfehler.  Frage 1 für mich wäre: Wenn dort ständig Speicherbereiche überschrieben werden, warum geht das Programm nicht kontinuierlich baden? Da müsste doch alles durcheinander kommen? Und Frage 2, kann man die Bereichsüberprüfung auch für einzelne Dateien / Units abschalten? Die betreffende Unit funktioniert ja grundsätzlich, wenn ich auch nicht verstehe warum...
Stephan
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 12.04.12 12:45
Wenn der Speicherbereich in "unkritischen" Bereichen liegt, z.B. einem String nach Deinem Array, kann es sein daß der Fehler lange nicht auffällt.
Ein solcher Fehler sollte in jedem Fall gefunden und korrigiert werden.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Do 12.04.12 19:05
Stephan.Woebbeking hat folgendes geschrieben : | ... Und Frage 2, kann man die Bereichsüberprüfung auch für einzelne Dateien / Units abschalten? Die betreffende Unit funktioniert ja grundsätzlich, wenn ich auch nicht verstehe warum... |
Ja. Die Bereiche die Du prüfen willst mit
{$RANGECHECKS ON} oder {$RANGECHECKS OFF}einrahmen.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Stephan.Woebbeking 
      
Beiträge: 97
|
Verfasst: Fr 20.04.12 12:08
Danke für alle Tips! Mein Problem ist - mit verbleibenden Quickhacks - erstmal gelöst. Für alle, die's interessiert: Die Bereichsverletzung kommt durch ein Word, welches nach oben hin überläuft. Wenn ich daraus aber einen 32 bit Wert mache, funktioniert die Unit nicht mehr - irgendwo ist er wohl darauf angewiesen, dass der Wert wieder nach unten rollt. Die Logik dahinter hab ich noch nicht verstanden und der Kollege, der dort wohl Teile von entwickelt hat, hat keine Zeit. Also muss ich damit erstmal leben, aber wie gesagt vielen Dank für die Hinweise.
vG, Stephan
|
|
|