Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Delphi gibt Pointer Error bei Function exit
NewMori - Di 17.01.12 23:35
Titel: Delphi gibt Pointer Error bei Function exit
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.
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 begin AContext.Connection.Socket.InputBuffer.Write(TBytes(Copy(Str,r.Size,Length(Str))));
Result:=R; exit; end;
st:=getTickCount()+Cardinal(timeout); end; end;
r.Free(); end; |
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
jaenicke - 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 - 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
NewMori - 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| AContext.Connection.Socket.InputBuffer.ExtractToBytes(TBytes(Str)); 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!