Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hilfe beim Beheben einer Access Violation (https://www.delphipraxis.net/126626-hilfe-beim-beheben-einer-access-violation.html)

Romi 29. Dez 2008 20:27


Hilfe beim Beheben einer Access Violation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

in diesem Thread habe ich ein Programm namens JewelCrack vorgestellt, das noch einen Fehler enthält: Es treten scheinbar zufällig Access Violations auf.

Ich habe diese schon mehrfach im Debugger abgefangen. Sie treten auf, wenn ich auf einen Stein zugreife.

Zum Aufbau des Programms (Sourcecode hängt auch unten an):
Ich habe einen Array[1..400] of tStein. Dieser wird am Anfang mit Steinen bis an den Rand gefüllt und dann werden Einzelne dieser Steine immer wieder zerstört. Ich gehe sehr oft diesen Array durch und greife dabei dann auf bestimmte Steine zu (natürlich nachdem ich geprüft habe, dass diese nicht nil sind und dass diese nicht "deaded" sind (das ist die Andorra2D-Methode (der Grafikengine, die ich benutzte), Sprites zu töten). Und genau bei diesen Zugriffen passiert es. Das komische ist, dass es nicht immer passiert. Man kann gerne mal fünf Spiele spielen, ohne das etwas passiert, und bei sechsten schmeisst er dann mit Fehlern um sich.

Noch ein Kommentar zum Sourcecode:
Er ist technisch gesehen sicherlich nicht sonderlich schön. Aber ich habe ihn ein wenig Kommentiert und strukturiert ist er auch, er sollte eigentlich relativ leicht zu lesen sein. Verbesserungsvorschläge und Unschönheiten in meiner Arbeit nehme ich allerdings gerne entgegen, man will ja dazulernen ;)
Erstellt wurde er mit Delphi 7, später zu Delphi 2009 konvertiert. Die Projektdatei ist also für D2009.

Es ist mir eigentlich relativ egal, was ihr mit dem Sourcecode macht. Nur wenn ihr ihn modifizieren wollt, dann lasst doch bitte meinen Namen dabei stehen.

Danke schonmal,
Roman

EDIT: Hier bekommt ihr Andorra2D her: http://downloads.sourceforge.net/and...se_mirror=osdn

hoika 29. Dez 2008 20:46

Re: Hilfe beim Beheben einer Access Violation
 
Hallo,

AdDraws not found.

Ist wohl diese Andorra ?

Warum hängt das nicht mit dan ?
*faul*
Ausserdem gibt es je verschieden Versions-Stände.



Heiko

Romi 29. Dez 2008 20:47

Re: Hilfe beim Beheben einer Access Violation
 
Zitat:

Zitat von hoika
Hallo,

AdDraws not found.

Ist wohl diese Andorra ?

Warum hängt das nicht mit dan ?
*faul*
Ausserdem gibt es je verschieden Versions-Stände.



Heiko

Achso, natürlich. Andorra2D gibts hier: http://downloads.sourceforge.net/and...se_mirror=osdn

hoika 29. Dez 2008 20:56

Re: Hilfe beim Beheben einer Access Violation
 
Hallo,

nunja ;(
klappt ja erst ab D7 (habe hier D6).

Aber

Das hier so komisch aus.
Delphi-Quellcode:
  for i := 1 to 400 do
    if (Steine[i] <> nil) AND not (Steine[i].Deaded) then Steine[i].dead;

  XXX

      Steine[arr] := tStein.Create(AdSpriteEngine);
      Steine[arr].einrichten(offsetX, offsetY, random(5));
Bist dui dir sicher, dass die Stein auch wirklich als Klasse (Objekt) gelöscht werden.
Scheibe mal einen destructor für TStein und setze mal nen BreakPoint.

Der Destructor muss ja bei .dead aufgerufen werden.

Ausserdem würde ich mal mit memcheck oder FastMM4 prüfen, ob irgendwelche Speicherlecks drin sind.


Heiko

Romi 29. Dez 2008 21:10

Re: Hilfe beim Beheben einer Access Violation
 
Danke für deine Antwort.

Zitat:

Zitat von hoika
Bist dui dir sicher, dass die Stein auch wirklich als Klasse (Objekt) gelöscht werden.
Scheibe mal einen destructor für TStein und setze mal nen BreakPoint.

Die Klasse tStein erbt ja von TImageSpriteEx. Diese erbt wiederrum von ein paar anderen Klassen, aber ganz unten haben diese auch einen Destructor, der aufgerufen wird, sobald das Sprite "dead" ist.

Zitat:

Zitat von hoika
Ausserdem würde ich mal mit memcheck oder FastMM4 prüfen, ob irgendwelche Speicherlecks drin sind.

Mh, hab ich keine Ahnung von. Aber das werde ich mir mal angucken.

hoika 29. Dez 2008 21:19

Re: Hilfe beim Beheben einer Access Violation
 
Hallo,

memcheck finde ich einfacher


in der dpr als erste unit mit

uses
MemCheck,

Memcheck einbinden
(http://v.mahon.free.fr/pro/freeware/memcheck/)

und als 1. Befehl nach dem Begin

begin
MemChk;

Damit wird NACH dem Programm laufen (also nach dem Beenden) Speicherlecks angezeigt.


Heiko

Romi 29. Dez 2008 21:28

Re: Hilfe beim Beheben einer Access Violation
 
Also, mit memcheck crasht das Ding sofort am Start. Warscheinlich inkompatibel zu D2009?

lbccaleb 29. Dez 2008 21:40

Re: Hilfe beim Beheben einer Access Violation
 
Hey,
probiers mal mit FastMM!

hoika 29. Dez 2008 22:59

Re: Hilfe beim Beheben einer Access Violation
 
Hallo,

< Also, mit memcheck crasht das Ding sofort am Start. Warscheinlich inkompatibel zu D2009? >
hm ?

Mal nen breakpoint in die dpr gesetet ?


Heiko

rollstuhlfahrer 30. Dez 2008 00:04

Re: Hilfe beim Beheben einer Access Violation
 
HI,

keine Ahnung, ob das weiterhilft, aber nutze mal zum Zerstören FreeAndNil. So hast du auf jeden Fall ein NULL-Objekt. Und auch bei Exceptions beim Free - mal den Wert mit nil überschreiben (auch wenn dann ein Speicherleck entsteht). Ansonsten, wie gesagt: Schnelle boolische Auswertung mit {$B+} anschalten.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
Seite 1 von 3  1 23      

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