AGB  ·  Datenschutz  ·  Impressum  







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

Seltsame string-artefakte...

Ein Thema von DelphiCreak · begonnen am 3. Okt 2012 · letzter Beitrag vom 3. Okt 2012
Antwort Antwort
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#1

Seltsame string-artefakte...

  Alt 3. Okt 2012, 19:44
Nabend DP'ler,

ich bin vorhin auf ein seltsames Problem gestoßen, für dass ich weder eine Erklärung noch im entferntesten einen Lösungsansatz habe.

Kurze Beschreibung:
Ich arbeite an einer Unit, BildDateien nach OpenGL zu laden (ich weiß, gibts schon, benutze aber eine eigene FileSystem-Klasse auf die das ganze aufbaut, ist auch nicht der Punkt.)

Jedes Bild hat nun eine Prozedur Reload, die eben dafür sorgt, dass Bilder sich neu Laden bzw wenn sie durch eine Funktion erzeugt werden, sich neu erzeugen. Nun hab ich da stehen:
Delphi-Quellcode:
  //always regenerate functional images
  if @generatorFunc <> nil then
  begin
    Log.DPrintf('regenerating ' + imgName + '.' + #13#10);
    generatorFunc(self);
    Exit;
  end;
Wobei Log.DPrintf nichts anderes macht, als den gegebenen String in einen Log zu schreiben und auf einer sichtbaren Konsole darzustellen. Soweit so gut.
Doch anstatt dass ich im Log schön die einzelnen generierten Bilder untereinander stehen habe a la:

regenerating _default.
regenerating _white.
regenerating _black.

etc bekomm ich das folgende:


regenerating _default.

rege
rege
rege
regenerating _flat.

rege
rege
rege
rege
rege
rege
rege

Die Strings werden also abgeschnitten. Ich habs mir im Debugger mal angeschaut, da wurde anscheinend irgendwie der Konstante String 'regenerating ' überschrieben durch 'rege'#0#0#0(Unlesbares Zeichen)#0'ing _white'. Und es sind immer diese 5 Chars, die überschrieben werden, genau mit denselben Zeichen.

Nun zur eigentlichen Frage: Wie kann das Sein, wo kann das Herkommen?
Dominik C.
Orientierungslos sieht man mehr vom Leben.

Geändert von DelphiCreak ( 3. Okt 2012 um 19:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 20:14
Spontan würde ich sagen, daß du irgendwo (nicht in dem gezeigten Codestück) einen Buffer-Overrun hast, welcher dir diesen Speicher überschreibt/verschießt.


PS: (hat aber nichts mit deinem Problem zu tun)
Delphi-Quellcode:
  if Assigned(generatorFunc) then
  begin
    Log.DPrintf('regenerating ' + imgName + '.' + sLineBreak);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 3. Okt 2012 um 20:16 Uhr)
  Mit Zitat antworten Zitat
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 20:23
Müsste so ein Fehler nicht bei aktivierter Überlaufs-/Bereichsprüfung auffallen? Oder gibt es generell eine andere Möglichkeit so einen Fehler zu entdecken außer alles durchzugehen? (Die Units die für die Bilder zuständig sind und damit in Frage kommen umfassen mittlerweile ~3000 Zeilen)

Vor allem da der String beim 5-6 mal Loggen wieder intakt ist...bei einem Buffer-Overrun müsste der String dann doch eigentlich dauerhaft zerstört sein oder nicht?
Dominik C.
Orientierungslos sieht man mehr vom Leben.

Geändert von DelphiCreak ( 3. Okt 2012 um 20:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 20:53
Delphi-Quellcode:
if Assigned(generatorFunc) then
begin
  Log.DPrintf('regenerating ' + imgName + '.' + sLineBreak);
  (*
  * auskommentiert um zu testen ob dies die Ursache ist
  generatorFunc(self);
  *)

end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 21:05
Sagen wir es mal so: In einigen Delphis wurde vergessen der Speicher, wo diese Konstanten liegen, schreibgeschützt zu laden.


Es gibt mehrere Tools (teilweise auch FastMM), welche beim Suchen helfen.

Was du aber selber ganz einfach machen kannst.
Delphi-Quellcode:
  if Assigned(generatorFunc) then
  begin
    S := 'regenerating ';
    Log.DPrintf(S + imgName + '.' + sLineBreak);
Erstmal schauen, ob der Fehler nun immernoch dort liegt.
Dann bis zu dem String gehn und Pointer(S) in die überwachten Variablen und dir den Wert kopieren.
Nun string(derWert) in überwachten Variablen.
Jetzt kannst du gemütlich rumdebuggen und schauen wann und wo sich dieser String verändert.

[edit]
Zitat:
auskommentiert um zu testen ob dies die Ursache ist
Theoretisch ja, aber man muß beachten, daß sich dabei Adressen verschieben können, da sich ja der Code verändert hat, womit dann der Fehler einfach nur woanders hingewandert sein kann.
- entweder ist da wirklich der Fehler drin und nun ist er weg
- oder es wird eventuell nur etwas Anderes überschrieben (bzw. es knallt, weil diese neue Stelle nicht überschreibbar ist)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 3. Okt 2012 um 21:13 Uhr)
  Mit Zitat antworten Zitat
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 21:08
@sx2008: habe ich schon gemacht, habe schon fast alles (in diesem Teil des Projekts) auskommentiert, kein Unterschied...Das schwierige ist halt dass das Projekt aus 40+ Units besteht, welche alle im Moment verwendet werden, und es könnte jetzt natürlich sein dass der Fehler schon vorher vorhanden war, nur jetzt diese String-Konstante erst in dem Speicherbereich gelandet ist, der beim Buffer-Overflow korrupiert wird...

Ist da die Bereichs/Überlauf prüfung wirklich komplett sinnlos? Weil ich wirklich keine Ahnung habe wie ich bei dem Umfang des Projekts herausfinden kann, was jetzt eben diese eine Konstante verändert...

@himitsu: Die Idee hatte ich auch gerade, werd ich mich mal dranmachen.

Edit: Interessanterweise scheint das Ganze Computer-Abhängig zu sein...Ich hatte auf meinem Haupt-PC schon alles gemacht, von neu erzeugen, DCU's/.exe löschen, IDE neustarten, kein Unterschied.
Nun einmal auf meinem Laptop kompiliert, der Fehler tritt nicht mehr auf...

Edit2: habs jetzt mal so deklaritert:
Delphi-Quellcode:
var TS: String = 'regenerating ';

procedure noImage.Reload(checkPrecompressed: Boolean; force: Boolean);
var current: TTime;
begin
  //always regenerate functional images
  if Assigned(generatorFunc) then
  begin
    Log.DPrintf(TS + imgName + '.' + sLineBreak);
    generatorFunc(self);
    Exit;
  end;
und anscheinend wird der String beim Übergeben an die Log-prozedur zerschossen, der Inhalt von TS bleibt komplett unverändert...
Dominik C.
Orientierungslos sieht man mehr vom Leben.

Geändert von DelphiCreak ( 3. Okt 2012 um 21:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 21:21
Das ist DAS Problem mit fehlgeleiteten Speicheroperationen ... es kommt drauf an, wo etwas überschrieben wird.
(es gibt Stellen, da fällt es nicht auf, weil dieser Bereich garnicht/selten genutzt wird, bzw. weil es nur reservierter, aber derzeit ungenutzter Speicher ist)

Und natürlich ist es systemabhängig, denn jedes System ist unterschiedlich ... hier der eine Treiber, dort ein Andere,bzw. andere Hardware usw.
Theoretisch sind solche Systeme zwar dynamisch und arbeiten zufällig, aber ein Computer arbeitet ja nicht zufällig, womit sich tweilweise ein "statisches" (reproduzierbares) Verhalten ergibt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 21:28
Ist denn Embaracardo's RAD Studio XE2 auch davon betroffen, dass Konstanten nicht schreibgeschützt sind?

Edit: Rein Logisch müsste jetzt ja die Prozedur _UStrCatN, die in ja in Delphi dafür zuständig ist, dass 2+ Strings miteinander verbunden werden fehlerhaft arbeiten, da die Variable ja sich im Inhalt nicht ändert, und bei der Log-Funktion der Falsche String ankommt...doch wie soll sowas passieren? Kann ja dann eigentlich nur passieren wenn ich irgendwo einen Pointer in den Bereich des RAM's habe, in dem diese Prozedur liegt, und dann irgendwas daran verändere...Bin grad ziemlich ratlos wie man sowas vernünftig debuggen soll...

Edit2: Das Problem liegt definitv dabei, dass ich irgendwie die _UStrCatN verändere...erst wenn diese Prozedur aufgerufen wird, kommen die String-Artefakte...
Dominik C.
Orientierungslos sieht man mehr vom Leben.

Geändert von DelphiCreak ( 3. Okt 2012 um 22:06 Uhr)
  Mit Zitat antworten Zitat
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Seltsame string-artefakte...

  Alt 3. Okt 2012, 22:25
Ich versteh die (Delphi) Welt nicht mehr...ich mein okay, höchstwahrscheinlich irgendwo ein Speicherleck/überlauf...

Habe das ganze jetzt allerdings wie folgt deklariert:

Delphi-Quellcode:
var TS: String = 'regenerating ';

procedure noImage.Reload(checkPrecompressed: Boolean; force: Boolean);
var current: TTime;
begin
  //always regenerate functional images
  if @generatorFunc <> nil then
  begin
    TS := 'regenerating ';
    Log.DPrintf('regenerating ' + imgName + '.' + sLineBreak);
    generatorFunc(self);
    Exit;
  end;
was natürlich unglaublich unschön ist. wollte einfach mal schauen, was mit String-Konstanten die direkt davor deklariert werden passiert...Und jetzt hat TS beim ersten Durchlauf den Korrekten Inhalt, erst wenn er beim Erzeugen der 2. (die Reihenfolge in der die Texturen generiert werden spielt keine Rolle, immer bei der, die als 2. Erzeugt wird) wird TS beim abarbeiten der Zeile


   TS := 'regenerating '; wie oben beschrieben verändert...
Dominik C.
Orientierungslos sieht man mehr vom Leben.

Geändert von DelphiCreak ( 3. Okt 2012 um 22:38 Uhr)
  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 15:30 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