AGB  ·  Datenschutz  ·  Impressum  







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

Unerklärbare Zugriffsverletzung

Ein Thema von ByTheTime · begonnen am 18. Mär 2014 · letzter Beitrag vom 24. Mär 2014
Antwort Antwort
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#1

AW: Unerklärbare Zugriffsverletzung

  Alt 19. Mär 2014, 16:17
Okay, also das Problem ist ziemlich merkwürdig.

Das ist der Anfang der SendMail-Prozedur:
Delphi-Quellcode:
procedure TMailThread.SendMail(JobID: Integer);
var
  i: Integer;
  MMail: TStringList;
  ID: String;
begin
  MMail := TStringList.Create;

  MMail.Add('Es wurden ' + IntToStr(EventCount) + ' Meldungen für den Auftrag "'
    + Jobs[JobID].Mail + '" gefunden:'); // Hier! 1.
  MMail.Add('');

  MMail.Add('------------------------------------------------------------');
  MMail.Add('Kurs | Zeitraum (Schulstd.) | Art | Tag, Datum | Bemerkung');
  MMail.Add('------------------------------------------------------------');
  MMail.Add('');

  // Log(False, ''); // Test!

  for i := 0 to High(Events) do
    if Events[i].Mail = Jobs[JobID].Mail then
    begin
      MMail.Add('---'); // Hier! 2.
      MMail.Add(Events[i].Course + ' | ' + Events[i].Span + ' | ' +
        Events[i].Status + ' | ' + Events[i].Date + ' | ' + Events[i].Note);
      MMail.Add('---');
      MMail.Add('');
    end;
Ich kann mir nicht erklären warum, allerdings wird beim Aufrufen der makierten Zeilen der Text "zermatscht". Beim Aufruf der ersten markierten Zeile wird im Event-Array der letze/höchste Eintrag, in meinem Fall Events[5], im Elemten "Status" verändert. Dort steht z.B. 'Entfall' *. Nach dem aufrufen der ersten markierten Zeile steht dort soetwas wie '#0#0#0#0#0#0#0#0#0#0#0#3#465###0#0#0#0#0#5###5### #y###9#0#0#' mit ~300+ Zeichen. Beim Aufruf der zweiten markiertn Zeile wird in einem anderen Eintrag (Events[2]) ein Element mit dem Namen "Course" im Wert geändert. Statt 'Sport2' steht dort jetzt '---'. Wo das '---' herkommt ist ja offensichtlich, aber warum verstehe ich nicht... Das ergibt einfach keinen Sinn...

Wenn ich die Log Zeile übrigens einbinde, werden die besagten Einträge (Events[6] + Events[2]) erst geleert, und beim ersten Durchlauf der darauffolgenden Schleife wieder gefüllt, allerdings mit völligem Käse. Statt dem Zeichensalat steht dann dort 'C:\ProgramData\', das ist der Pfad, unter welchem auch das Log gespeichert wird (es folgt noch ein Unterordner). Also irgendetwas wird hier ganz gewaltig durcheinandergeworfen.

Ich habe leider garkeine Vermutung, was das Problem sein könnte

Gruß

*Wie man unschwer erkennen kann, arbeite ich an einem Programm, was den Vertretungsplan unserer Schule herrunterläd und per Mail verschickt. Man kann seine Kurse und seine Mail in eine Liste eintragen, das Programm Filtert dann den Vertretungsplan und schickt einen individuell angepassten Report. Das hat bisher immer Fehlerfrei geklappt. Der Fehler ist mir jetzt erst untergekommen, als ich versucht habe, mehrere Jobs anzulegen (Also für mehrere Schüler; In meinem Fall warne es 2 Jobs/Schüler, da hat es schon gekracht).
Lukas

Geändert von ByTheTime (19. Mär 2014 um 16:36 Uhr)
  Mit Zitat antworten Zitat
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#2

AW: Unerklärbare Zugriffsverletzung

  Alt 19. Mär 2014, 22:40
Okay, ich habe jetzt den ganzen Tag nichts anderes gemacht... Ich habe alles auf den Kopf gestellt, den EventThread rausgenommen und, und, und... Aber ich finde den Fehler nicht!

Ich weiß nur, dass - aus welchen Gründen auch immer - das EventArray urplötzlich verändert wird. Ich habe aus der Anwendung sogar eine Single-Thread Anwendung gemacht und trotzdem tritt dieser komsiche Fehler auf.
Vllt. hat ja jemand einen Geistesblitz, aber im Moment sieht es übel aus :/
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unerklärbare Zugriffsverletzung

  Alt 20. Mär 2014, 00:45
Eine TStringList selber ist eigentlich sehr robust und fehlerunanfällig.

Wenn da was kapput geht, dann liegt das fast immer an jemand Anderem.
- nicht threadsichere Zugriffe (würde ich hier ausschließen, da ja nur in dem einem Thread drauf zugegriffen wird)
- Buffer-Overflows, welche die Daten der Stringliste überschreiben und dabei zerstören


Oder die StringListe ist eigentlich ganz, aber der Debugger zeigt einfach nur Mist an, weil er z.B. diese Klasse/Variablen nicht richtig auflöst.
Aber dieses läßt sich prüfen, indem man den Inhalt der Stringliste z.B. loggt, oder in öfters mal in eine Debug-Datei ausgiebt, welche man sich während der Haltepunkte ansieht, oder mehrere fortlaufende Dateien, wo man sich nachher ansieht, ob und ab wann es kaputt ging.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.989 Beiträge
 
Delphi 12 Athens
 
#4

AW: Unerklärbare Zugriffsverletzung

  Alt 20. Mär 2014, 05:06
Du könntest einmal FastMM einbinden, vielleicht findet das ja etwas, wenn du den FullDebugMode in der mitgelieferten Include-Datei aktivierst.

Wie wäre es denn, wenn du das Programm einfach einmal komplett anhängst, bzw. ein Projekt, das den Teil mit dem Fehler enthält?
Wenn das jemand selbst ausprobieren und debuggen kann, wird der Fehler sicher schnell gefunden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#5

AW: Unerklärbare Zugriffsverletzung

  Alt 20. Mär 2014, 09:42
Jo mache ich heute Abend Ich bin noch etwas am experimentieren und umbasteln.
Habe es ja schonmal erwähnt, das ich ein altes Projekt als Basis genommen habe, das ist natürlich nicht ganz optimal.
Lukas
  Mit Zitat antworten Zitat
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#6

AW: Unerklärbare Zugriffsverletzung

  Alt 20. Mär 2014, 20:53
Okay, ich habe das Problem gelöst ( ), allerdings kann ich die Lösung nur vermuten ( ). Also:

So sahen meine beiden Arrays am Anfang aus:
Delphi-Quellcode:
  TJobData = record
    AMail, AStep, ACourses, ATimes: String;
    ASended, ADecontrol: Boolean;
    ALastTime: TTime;
  end;

  TEventData = record
    AMail, ACourse, ASpan, AStatus, ADate, ANote, AHash: String;
  end;

  TJobArray = array of TJobData;
  TEventArray = array of TEventData;
Nachdem ich den Quellcode durchgepflügt, eine Single-Thread Anwendung aus dem Programm gemacht habe und der Fehler immer noch auftrat, war ich erstmal ein bisschen verzweifelt. Allerdings wollte ich noch eine Kleinigkeit optimieren.

Aus dem oben gezeigtem Teil wurde folgendes:
Delphi-Quellcode:
  TEventData = record
    ACourse, ASpan, AStatus, ADate, ANote, AHash: String;
  end;

  TEventArray = array of TEventData;

  TJobData = record
    AMail, AStep, ACourses, ATimes: String;
    ASended, ADecontrol: Boolean;
    ALastTime: TTime;
    Events: TEventArray;
  end;

  TJobArray = array of TJobData;
Die Events werden jetzt in einem untergeordneten Array von Jobs gespeichert. Eigentlich nur eine kleine Verschachtelung.

Natürlich hatte die IDE nach dieser Änderung erstmal schön zum Rotstift gegriffen und Zeilen wie Events[i].AMail := 'example@gmail.com' markiert. Ist ja logisch, das Objekt war ja so nicht mehr deklariert.

Also habe ich mich durch die Fehlerliste am Rand der IDE geklickt und direkt beim Doppelklick auf den ersten Eintrag hat mich die IDE an folgende Zeile in meinem Code gebracht:

Delphi-Quellcode:
function AppDataPath: string;
const
  SHGFP_TYPE_CURRENT = 0;
var
  path: array [0 .. MaxChar] of char;
begin
  SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, SHGFP_TYPE_CURRENT, @path[0]);
  Result := StrPas(path) + '\VPUpdater\';
end;
Sieht da jemand irgendwo das Objekt/Array "Events"? Also ich auch nicht Aber trotzdem war fast alles rot unterstrichen.
Nach einem Klick auf STRG + D war auf einmal alles wieder okay (obwohl ich davor auch des öfteren mal formatiert habe). Und der Fehler war auf einmal beseitigt Ich würde jetzt einfach mal behaupten, dass ich irgendwann mal die IDE zerschossen habe und der Compiler dann Schrott kompiliert hat. Das würde auch erklären warum in meinem Array auf einmal ein Pfad stand ('C:\Program Files\). Dieser wird nähmlich bei der obenstehenden Funktion ermittelt.

Vllt. hat ja jemand eine bessere Erklärung für dieses Phänomen...

Naja, hauptsache es geht jetzt. Leider war das dann ja ein Quiz ohne Antwort Immerhin hat himitsu einen Fehler in meiner Log-Funktion entdeckt und ihr habt mich unterstützt

Gruß,
Lukas
Lukas

Geändert von ByTheTime (20. Mär 2014 um 20:57 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#7

AW: Unerklärbare Zugriffsverletzung

  Alt 21. Mär 2014, 09:05
Die richtige Konstante ist hier 'Max_Path' und nicht 'MaxChar'.
Der Buffer 'path' wird nicht gelöscht und das Ergebnis von 'SHGetFolderPath' nicht ausgewertet.
In dieser Kombination kann StrPas einen riesigen String voller Speichermüll zurückgeben oder sogar eine Zugriffsverletzung auslösen.
Man könnte das z.B. so lösen:
Delphi-Quellcode:
function AppDataPath: AnsiString;
const
  SHGFP_TYPE_CURRENT = 0;
begin
  SetLength(Result, Max_Path);
  FillChar(Result[1], Max_Path, 0);
  SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, SHGFP_TYPE_CURRENT, PAnsiChar(Result));
  SetLength(Result, StrLen(PAnsiChar(Result)));
  Result := Result + '\VPUpdater\';
end;
  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 07:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz