Entwickler-Ecke
Internet / Netzwerk - Zugriffsverletzung bei TIdContext
tmzll - Mo 13.02.12 14:49
Titel: Zugriffsverletzung bei TIdContext
Hallo Forum!
Ich schreibe zur Zeit eine Client / Server Anwendung mit dem Indy TCP Server, die eigentlich auch ganz gut läuft.
Jetzt habe ich in einer Kombination einen Fehler, den ich mir ehrlich gesagt nicht so ganz erklären kann:
Ich übergebe, je nachdem welche Aktion gewünscht ist, den TIdContext in eine Hilfsobjekt und kommuniziere darin über Textnachrichten mit dem Client. Ich habe keine Ahnung ob das sauber ist (hier vielleicht jemand einen Hinweis oder einen Tipp?), aber immerhin funktionierte es die letzte Zeit.
Wenn ich jetzt eine bestimmt Aktion ausführe (auch nur lesen und schreiben auf der Verbindung), geht die NÄCHSTE Aktion nach dieser schief, ich bekomme eine AccessViolation beim Lesen auf Adresse 0 (!) beim Versuch, auf den TIdContext zuzugreifen. Vorher wurde bei jedem Vorgang die Verbindung ordentlich geöffnet und geschlossen (laut onConnect und onDisconnect Event) und Exceptions gab es bis dahin auch keine. Im Debugger hat TIdContext auf jeden Fall eine Instanz.
Da die ganze Indy Geschichte im Hintergrund sehr komplex wird, und ich eigentlich auch kein Delphi Programmierer bin und demnach zum ersten mal mit Indy arbeite, weiß ich nicht welche Informationen für euch noch hilfreich wären. Ich bin mir im Klaren, dass die Informationen hier sehr allgemein gehalten sind, da der Code aber im Rahmen meiner beruflichen Tätigkeit geschrieben wurde, möchte ich nicht unnötig viel davon hier veröffentlichen, wenn es nicht nötig ist. Wenn irgendetwas fehlt, fragt und ich stelle es online!
Gruß,
Tim
Edit vom Folgetag:
Es handelt sich übrigens um Indy 10.55 mit Delphi 2010.
Ich konnte den Fehler mittlerweile so weit herunterbrechen, dass ich eine Art 'Pseudostacktrace' anbieten kann:
Aufruf: IdWinsock2.select(0, AReadSet, AWriteSet, AExceptSet, LTimePtr);
TIdSocketListWindows#FDSelect : Zeile 1013
TIdSocketListWindows#SelectRead : Zeile 995
TIdSocketHandle#Select : Zeile 535
TIdServerIoHandlerSocket#Init : Zeile 131
TIdListenerThread#Run : Zeile 933
Bis zu diesem Aufruf kann ich herunterbrechen, darunter nicht mehr. AWriteSet und AExceptSet sind hierbei nil;
Weiterer Edit:
Laut Microsoft überprüft die select Version den Socketstatus. Die beiden Pointer, die mit nil übergeben werden sind optional, das ist also alles korrekt. Eventuell ist mein Socket noch offen und belegt? Mit netstat -a sehe ich aber keine Unterschiede zu den anderen Aufrufen
tmzll - Di 14.02.12 15:47
Edit: Hier stand Mist. Habe den Fehler gefunden, hatte natürlich nichts mit Indy zu tun. Schlampiger Umgang mit Objektreferenzen war die Ursache, wehe man lässt gelernte Java Entwickler auf Delphi los....
Das Thema ist also erledigt, schönen Tag noch!
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!