Autor Beitrag
Masterrandy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 11:30 
Hoffe mal ich bin hier richtig :)

In meinem Programm habe ich eine Funktion. Diese Gibt den Wert einer Integer-Variablen mit Result zurück.
Einige male wird diese Funktion normal durchlaufen.
Irgendwann wird aber in der Prozedur _LStrClr der Unit System eine Exception ausgelöst und gesagt, das Programm verursache eine Zugriffsverletzung bei einer Adresse.

Ich weiß nicht woran das liegen kann. Wenn meine zu Ladenden Daten klein sind scheint der Fehler nicht aufzutreten, aber wenn ich mal Daten von ca. 20 kb aufwärts aus meiner Datei lade...naja
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 11.04.03 12:10 
Das Problem liegt in Zeile 125. Kommentier die mal aus und ändere in Zeile 127 mal Inc(iCount) in Dec(iCount).
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 12:34 
Titel: Hmmmm
Also entweder du hast dich hier in meinen Topic verirrt oder du willst mir damit sagen das ich weiter detailierte Infos geben soll.

Leider ist es etwas schwer das alles detailierter zu beschreiben. Ich kann dir gerne den gesamten Quelltest geben. Der Fehler tritt nur sporadisch auf.

Ich habe mal Min Stack Size und Max Stack Size verändert. Dann trat der Fehler auch bei einer kleinen Datei auf wo es vorher ging. Hab die Werte wie folgt verändert:

    Min: $00004000 --> $00014000
    Max: $00100000 --> $01000000


Hab Delphi 7.
Genau in Zeile 11664 der Unit System springt er.
Dort steht: MOV ECX,[EDX-skew].StrRec.refCnt {fetch refCnt}

Bin für jedenTip dankbar.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 11.04.03 12:40 
Titel: Re: Hmmmm
Masterrandy hat folgendes geschrieben:
Also entweder du hast dich hier in meinen Topic verirrt

Nein.
Zitat:

oder du willst mir damit sagen das ich weiter detailierte Infos geben soll.

Zitat:

Leider ist es etwas schwer das alles detailierter zu beschreiben. Ich kann dir gerne den gesamten Quelltest geben. Der Fehler tritt nur sporadisch auf.

Du hast doch gesagt in welcher Funktion der Fehler auftriitt. Die reicht vollkommen.
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 12:51 
Titel: Da ist sie, die böse Funktion
Wüsste allerdings nicht was an der nicht stimmen sollte.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function TFDoku.LoadAttributdaten(Stream: TStream; intI: Integer): Integer;
var      intAnzahl: Integer;
         intGroesse: Integer;
         strText: String;
         chrText: Char;
begin
  //Liest die Daten derAttribute    
  Stream.ReadBuffer(intGroesse, SizeOf(intGroesse));
  SetLength(strText, intGroesse);
  Stream.ReadBuffer(Pointer(strText)^, intGroesse);
  Attribute[intI].Name := strText;

  Stream.ReadBuffer(intGroesse, SizeOf(intGroesse));
  chrText := ' ';
  Stream.ReadBuffer(chrText, intGroesse);
  Attribute[intI].Typ := chrText;

  Attribute[intI].Laenge := Length(Attribute[intI].Name);
  Stream.ReadBuffer(intGroesse, SizeOf(intGroesse));

  Stream.ReadBuffer(intAnzahl, intGroesse);     //Anzahl der Vorkommen
  Result := intAnzahl; //Hier springt der Debugger in die Unit System
end;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 11.04.03 12:55 
Jetzt hast du mich erwischt, mit Streams kenne ich mich nicht so aus.
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 13:04 
Titel: Das Problem liegt auch nicht bei den Streams denke ich
Ein Kollege hat mal einen Blick in die System-Unit gewofen und gemeint, dass anscheinend der Puffer zu klein ist. Deshalb hab ich auch mal bisschen was bei den Projekteinstellungen verändert.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 11.04.03 14:32 
Masterrandy, warum machst du es dir denn so schwer??? Nimm meine Routinen, die ich bereits im anderen Thread gepostet habe, und dann musst du dich nicht mit String-Problemen herumschlagen.

Cu,
Udontknow
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 15:00 
Wie kommst du darauf, dass ich noch Probleme mit Strings habe? Ich habe momentan ein Problem mit der Rückgabe einer Funktion. Dort bekomme ich, nicht immer, eine Exception wegen Speicherverletzung.

Leider it mir da nicht klar, warum ich die bekomme?

Gibt es da vllt Speicherprobleme? Kann ich den Speicher vergrößern?

Was ich gerade auch noch rausgefunden habe: Die Procedure, LStrClr in der Unit System, ist dafür da den Speicher eines Strings wieder frei zu geben.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 11.04.03 15:13 
War eigentlich nur ein Schuss ins Blaue... Na schauen wir mal.

Das sieht sehr verdächtig aus:

ausblenden Quelltext
1:
2:
3:
4:
Stream.ReadBuffer(intGroesse, SizeOf(intGroesse)); 
  chrText := ' '; 
  Stream.ReadBuffer(chrText, intGroesse); 
  Attribute[intI].Typ := chrText;


Hier packst du in eine Char-Variable (Grösse : 1 Byte) mehrere Bytes (abhängig von intGroesse), überschreibst also den Speicher hinter dem Chr. Was wolltest du ursprünglich damit bezwecken?

Da soll doch nur EIN Buchstabe eingelesen werden, wieso liest du dann intgroesse vorher ein? Es muss immer lauten
ausblenden Quelltext
1:
Stream.ReadBuffer(ChrText, SizeOf(ChrText));					

da die Grösse (im Gegensatz zu einem String) immer die gleiche ist!

Das gleiche gilt auch für den Integerwert intAnzahl. Das sind immer 4 Byte, immer SizeOf(intAnzahl). Wieso Intgroesse einlesen?

Cu,
Udontknow