Autor Beitrag
NewMori
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Di 17.01.12 23:35 
Hallo,
ich bastle immer noch an meinem WebSocket-Server. Ich habe das ganze jetzt auf Indy 10 umgestellt und es funktioniert jetzt wieder soweit, dass der Handshake gesendet werden kann. Wenn ich allerdings vom Client (Web-Browser) eine Nachricht an meinen Server schicke. Stürzt gibt mein Server mit einer Access Violation ab. Das komische daran ist allerdings, das er erst nach dem eigentlichen Ausführen der Parse-Funktion einen Fehler ausgibt. Der Fehler tritt in SysFreeMem mit "read from 0x000..." auf nachdem die Funktion verlassen wurde.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
function TWebSockServer.waitForFrame(AContext: TIdContext; timeout: Integer): TWebSockFrame;
var
  st:Cardinal;
  Str:AnsiString;
  R:TWebSockFrame;
begin
  st:=getTickCount()+Cardinal(timeout);
  Str:='';

  r:=TWebSockFrame.Create();
  Result:=nil;

  while (st>getTickCount()) do
    begin
      if (not AContext.Connection.Socket.InputBufferIsEmpty) then
        begin
          AContext.Connection.Socket.InputBuffer.ExtractToBytes(TBytes(Str));

          if DecodeRec(Str,r) then //Decodes Frame, returns false on error
            begin
              //write back unused memory
              AContext.Connection.Socket.InputBuffer.Write(TBytes(Copy(Str,r.Size,Length(Str))));

              Result:=R;
              exit;
            end;

          st:=getTickCount()+Cardinal(timeout); //increase timeout to wait for next data
        end;
    end;

  r.Free();
end;//<--hier gibt es den Fehler


Ich kann mir leider nicht vorstellen warum es diesen Fehler gibt, da ich nicht am Stack bzw. von Delphi "verwalteten" Speicherbereichen arbeite. Ich wäre dankbar wenn ihr eine Idee hättet woran es liegen könnte oder warum dieser Fehler kommt.

Mfg
NewMori

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 18.01.12 00:48 
Du könntest versuchen mit FastMM4 genauere Informationen zu bekommen. Zum Beispiel ob irgendwie Objekte mehrfach freigegeben werden oder anderswo schon Speicherprobleme vorlagen.
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.01.12 15:39 
Ich habe FastMM jetzt eingebunden, leider sagt er mir beim Fehler auch nicht mehr als der normale Debugger. Wenn ich das Programm ohne Daten zu Empfangen schließe (also nur Handshake+Close) zeigt er mir keine Memoryleaks. Wenn das Programm abstürzt, werden mir einige Unicode Strings und Variablen angezeigt. Ich nehme an, dass diese durch die Access Violation nicht freigegeben werden. In der Log Datei steht mehrmals "... The block header has been corrupted.". Auch hier denke ich liegt es an der Access Violation. Leider kann ich mit der FastMem Ausgabe nichts anfangen. Ich weis nicht was ich tun müsste um den Fehler zu finden, bzw. herauszufinden warum dieser Speicherbereich freigegeben werden soll/nicht gelesen werden kann.

Mfg
NewMori

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Do 19.01.12 19:46 
Ich habe die Lösung gefunden :) . Der Fehler war, das er den AnsiString anscheinend nicht richtig zu TBytes konvertiert hat, dadurch sollte dieser evtl. doppelt Freigeben werden etc. Für alle die das gleiche Problem haben sollten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
AContext.Connection.Socket.InputBuffer.ExtractToBytes(TBytes(Str));//<--Fehler

//durch folgendes ersetzen (B:TBytes)
AContext.Connection.Socket.InputBuffer.ExtractToBytes(B, -1, False, -1);
SetLength(Str, Length(B));
Move(B[0], Str[1], Length(B));

Ich finde es trotzdem komisch, das man nicht einfach einen Pointer auf einen Speicherbereich übergeben kann. Jedenfalls ist das Problem somit behoben.

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.