AGB  ·  Datenschutz  ·  Impressum  







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

Schreibschutz für Objekte???

Ein Thema von Leanahtan · begonnen am 1. Feb 2010 · letzter Beitrag vom 1. Feb 2010
Antwort Antwort
Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#1

Schreibschutz für Objekte???

  Alt 1. Feb 2010, 03:38
Ok, das Thema ist vielleicht nicht so ganz aussagekräftig, aber mir ist nichts besseres eingefallen. Also ich habe folgendes Problem. In unserem Projekt benutzen wir eine ISO-Engine (auf Basis von Delphix). Im Laufe der Jahre hatten wir immer mal Fehler, die wir nicht wirklich erklären konnten, und wo wir lediglich vermutet haben, dass eventuell eine der DXDraw-Funktionen Bereiche im Arbeitssspeicher überschreibt. Das Problem trat aber nur sehr selten auf, und konnte nie reproduziert werden. Jetzt hab ich einige Änderungen an der ISO-Engine vorgenommen - während bisher alle Tile-Grafiken in einem einzigen Surface gespeichert wurden, hat jetzt jedes Tile sein eigenes Surface.
Allerdings ist jetzt der Fehler mit dem Überschreiben anderer Bereiche im Arbeitsspeicher nahezu reproduzierbar (man muss nur 1-2 Minuten ausprobieren). Im aktuellen Zustand wird im Laufe der Zeit ein eigentlich unabhängiges Surface (Soldatenportraits) überschrieben, was sich zuerst durch Darstellungsfehler bemerkbar macht, und irgendwann einen Crash verursacht. Leider habe ich keine Ahnung, wie man in so einem Fall die Ursache suchen sollte. Zu Delphix gibt es ja kaum eine ordentliche Doku. Außerdem hat Jim_Raynor vor Jahren eine Menge Änderungen vorgenommen, um z.B. Alphablending zu beschleunigen - ein Update auf die aktuelle Version von (un)Delphix ist also auch nicht möglich. Ich selbst hab eigentlich keine Ahnung von Delphix ^^. Meine einzige Idee war bis jetzt, den Speicherbereich für das Surface der Soldatenportraits irgendwie schreibgeschützt zu machen (und diesen Schreibschutz nur bei Bedarf aufzuheben), um so eine Zugriffsverletzung auszulösen, sobald irgendwo eine Funktion in diesen Speicherbereich schreiben will. Ist sowas irgendwie möglich? Oder habt ihr noch andere Ideen, wie man einem solchen Fehler auf die schliche kommen könnte?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Schreibschutz für Objekte???

  Alt 1. Feb 2010, 05:36
Ich würde eher den Fehler im Programm suchen
Markus Kinzler
  Mit Zitat antworten Zitat
Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Schreibschutz für Objekte???

  Alt 1. Feb 2010, 06:33
Genau deshalb will ich ja den Schreibschutz. Wenn es eine Zugriffsverletzung gibt, hätte ich eine Möglichkeit den Fehler zu debuggen. So habe ich überhaupt keinen Ansatzpunkt für den Fehler. Ich weiß nichteinmal, ob es wirklich mit den Zeichenroutinen zusammenhängt, oder ob an einer ganz anderen Stelle ein fehlerhafter Pointer auf das Surface zeigt.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Schreibschutz für Objekte???

  Alt 1. Feb 2010, 06:46
Zitat von Leanahtan:
Oder habt ihr noch andere Ideen, wie man einem solchen Fehler auf die schliche kommen könnte?
Exotische Fehler (wie zum Beispiel das Überschreiben von Speicher) kann man mit FastMM4 aufspüren, wenn die entsprechenden Features aktiviert sind.

Cheers,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Schreibschutz für Objekte???

  Alt 1. Feb 2010, 06:49
Das wird bei DirectX noch zusätzlich dadurch verkompliziert, dass Texturen in unterschiedlichen "Pools" residieren. Prinzipiell können sie im VRAM, und im Host-RAM liegen, die Art des Pools definiert dann, wie DirectX mit der Textur umgehen soll wenn gerendert und/oder vom Host gelesen und/oder geschrieben wird. Ans VRAM kommst du spätenstens nicht mehr ran.
Es wäre aber auch SEHR ungewöhnlich, wenn DirectX da was verhackstückeln sollte. Sobald also die Daten über die API als Textur/Surface korrekt geladen sind, ist es fast sicher, dass das Problem dahinter sitzt - also entweder in deinem Code, oder in dem von DelphiX. In beiden Fällen jedoch müsste dafür eine Änderung am Surface bewusst vorgenommen werden, so dass DirectX entsprechend neue Daten aus dem Host-RAM in die Textur übernimmt.
DX Ressourcen sind nur änderbar, wenn sie zuvor gelockt wurden. Da wäre dann evtl. dein Ansatzpunkt: Alle Stellen, an denen etwas zwischen einem Lock und Unlock auf ein Surface ausgeführt wird, sind potentielle Kandidaten. Sowohl in deinem Code, als auch im Source von DelphiX. Mit viel Pech hast du es dann sogar mit einem Multi-Threaded Problem zu tun, bei dem ein Thread über seinen "Kompetenzbereich" hinweg kritzelt, während irgendwo anders ein Lock aktiv ist. Das wäre schon ziemlich ekelig . Erste Amtshandlung bei sowas: Bereichsprüfung anschalten, und wenn die wo anschlägt ist man meist fast schon am Ziel.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Schreibschutz für Objekte???

  Alt 1. Feb 2010, 07:14
Danke für die Antworten. Konnte damit den Fehler lokalisieren. Hing mit einer Compilerschalter-abhängigen Fallunterscheidung zusammen, wo ich einen der beiden Fälle noch nicht richtig umgesetzt hatte.

Delphi-Quellcode:
        {$IFDEF NOCLIPPING}
        Figur.Draw(Surface,Mem,XPos,Ypos,X,Y)
        {$ELSE}
        Figur.Draw(Surface,fTempMem,XPos,Ypos,X,Y)
        {$ENDIF}
fTempMem gehört zu einem anderen TDirectDrawSurface - die entsprechende Neuzuweisung für Surface fehlte aber noch.
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:04 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