Invalid Memory Access - Network

Fragen und Bugreports zur PureBasic 4.0-Beta.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Invalid Memory Access - Network

Beitrag von Toshy »

Hallo.

Manchmal taucht bei mir im Dubuggerfenster die Meldung
"Invalid Memory Access" auf und zwar in der Zeile

Code: Alles auswählen

NetworkServerEvent.b = NetworkServerEvent() 
Die Zeile läuft in einem Thread, aber das Projekt wird "Threadsafe" kompeliert. Ich konnte es bisher noch nicht nachvollziehbar machen und es tritt bei mir auch nur relativ selten auf.
Kann mir mal jemand einen Tipp geben woran es liegen könnte bzw. wie ich dem Fehler auf die Spur komme?
Das normale "Ausschlußverfahren" bei FEhlern geht nicht, da der Fehler halt nur hin und wieder auftritt, manchmal nen ganzen Tag nicht.

Freue mich über jeden Hinweis der mich weiter bringt.

[edit]
Es liegt nicht daran, das ich als Ergebnis ein Byte erwarte. Mit einer Longvariablen passiert es auch.

[edit2]
Nachvollziehbaren Code den ich euch hier posten kann, habe ich noch nicht. Meinen kompletten Code will ich natürlich nicht posten. Jetzt tritt der fehler aber jedesmal auf. Im Hauptcode/-thread bei ich eine Connection auf und im zweiten Thread wo ich die Serverevents auslese kommt beim zweiten Aufruf der Fehler (erste Verbindung wurde vorher geschlossen).
Sind die Netzwerkfunktionen noch nicht richtig Threadsicher?

Danke Toshy
Hinweis:
Fehler tritt mit der Beta8 auf und unter Windows98
Zuletzt geändert von Toshy am 05.04.2006 09:04, insgesamt 1-mal geändert.
1. Win10
PB6.1
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Es kann hilfreich sein zu Testzwecken deinen Thread direkt ins Programm einzubinden.
Sieht dann vermutlich völlig daneben aus, aber der Debugger kommt dann i.d.R. mit vernünftigen Fehlermeldungen daher.

Ansonsten is es halt wirklich schwierig so ganz ohne Beispiel.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Das ist leider nicht möglich. Der Fehler tritt bisher nur auf wenn mein Programm läuft, gekürzt tritt er nicht auf. Und da die Threads standig daten austauschen laufen sie nur weiter, wenn bestimmte Bedingungen des anderen Threads erfüllt sind. ein Zusammenfügen ist somit leider nicht möglich.
Ich bin aber schon dabei zu versuchen es nachvollziehbar zu machen in einer Art um es zu posten.

Die grundlegende Frage die ich habe ist natürlich, wie überhaupt "NetworkServerEvent" einen Fehler auslösen kann. Es ist für mich nicht sichtbar, das hier sowas passieren dürfte.

Ich bin mir zwar recht sicher, daß es an einem Fehler in meinem Code liegt und kein "richtiger" Bug in PB ist, aber das an dieser Stelle ein Fehler auftritt mit dieser Meldung ist halt schwer nachzuvollziehn.
Ich teste seit einiger Zeit aus, was welche Netzwerkfunktion nun genau macht usw, das es da dann zu fehlern kommen kann ist klar, aber halt an bestimmten Stellen nur schwer zu verstehn.
1. Win10
PB6.1
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Das ist ja das was ich sagen wollte:
NetworkServerEvent() löst den Fehler nicht aus, es ist nur die Stelle, an der der Debugger zum stehen kommt.
Das ist halt das Problem, wenn man Fehler in Threads hat.

Arbeitest du mit mehreren Servern ?
Weil der einzige mir bis jetzt aufgestossene Fehler ist, dass EventServer() falsch bestückt wird.
Den hab ich aber bereits gemeldet.

Ausserdem solltest du die letzte Beta (also 9 i.m.) benutzen, sonst hängst du vielleicht an Dingen, die bereits längst gefixt sind.

...bei was passierts überhaupt ?
Senden, Empfangen, Connecten, Disconnecten, IMMER ?
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Ich würde eine Variable nie wie eine Prozedur nennen... Aber das nur mal nebenbei.

Es gibt meiner Wissens nur zwei Möglichkeiten, wie man diesen Fehler verursachen kann:
1. die Variable NetworkServerEvent(.b) kann nicht beschrieben werden und
2. die Prozedur NetworkServerEvent() liest aus einem Speicherbereicht, aus dem sie nicht lesen darf/kann.

Wie hast Du Deine Variable in der Threadprozedur deklariert?

Gruß
René
Purzel
Beiträge: 2
Registriert: 06.04.2006 12:25

Beitrag von Purzel »

Also entweder habe ich nicht aufmerksam genug gelesen, oder du hast noch nicht erwähnt, mit welchem Protokoll du überhaupt arbeitest (TCP/UDP)?
Ich hab da ein Problem mit ReceiveNetworkData (bei UDP) in der Beta 8 entdeckt, gemeldet und Fred hast in Beta 9 gefixt :allright: (siehe:http://www.purebasic.fr/english/viewtopic.php?t=20921).
Leider kam dann in Beta 9 ein neues Prob mit UDP, auf das bisher keiner reagiert hat :( (siehe:http://www.purebasic.fr/english/viewtopic.php?t=20949).
Ich weiss das dir das nicht bei der Lösung hilft, aber es zeigt vielleicht, das es zur Zeit keine Lösung gibt!?
Purzel
Beiträge: 2
Registriert: 06.04.2006 12:25

Beitrag von Purzel »

Kaum posted man, dass sich noch nix getan hat kommt ein Link von Fred ins Forum, unter dem man eine neue Network Lib runterladen kann!
Guckst du hier: http://www.purebasic.com/beta/Network
Einfach runterladen und in das Verzeichnis PureLibraries kopieren.
Der Browser hängt da gerne mal ne endung (.txt) ran.. das darf nicht, das Ding muss einfach "nackt" :oops: ohne Dateiendung in das Verzeichnis. Mein Prob scheint das zu lösen, habs kurz getestet.
Viel Erfolg.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hallo Leute,
ist schon einige Tage her seit ich mich gemeldet habe, aber bei uns sind Osterferien und meine Kids waren bei mir. Habe mir für meine Jungs natürlich Zeit genommen.

@HeX0R
Ja ich arbeite mit mehreren Servern. Aber der Fehler tritt auch bei einem Server auf. Die 9er-Beta gab es bei meinen Tests noch nicht.

@real
Welche Variable sollte ich wozu declarieren? Grundlegend gesagt declariere ich natürlich schon alle Variablen, lokal oder global (Threadsicher).

@Purzel
Momentan noch mit TCP

@Purzel
Danke

@ALL
Also den Fehler habe ich wohl gefunden und zwar schließe (closenetworkconnection()) auch Verbindungen dann, wenn der Client sie schon geschlossen hat. Ich dachte dies muß man trotzdem machen. Erstens weil man am Clienten dies auch machen muß wenn der Server die Verbindung geschlossen hat und zweitens weil ich dachte das dies aus Gründen der Threadsicherheit so sein muß bzw. der der pb-eigenen ClientID. Denn es wirft probleme auf wenn das nicht so ist. Besonders wenn man mit Threads arbeitet, aber natürlich auch ohne kann es sonst passieren, das man am Server eine Verbindung beendet, die schon vom Clienten kurz zuvor geschlossen wurde (Millisekunden oder so davor). Da man das schließen vom Clienten vielleicht nicht gleich mitbekommt, es muß ja die Eventliste abgearbeitet werden, ist es nur eine Frage der Zeit, wann es zu einem Fehler kommt. Es sei denn, der Socket wird erst geschlossen, wenn man das Event abgefragt hat.

Weiß jemand ob dem so ist? Wenn ja, dann kann man aber wiederrum mit ConnectionID() nicht mehr die zugehörige SocketID in erfahrung bringen. Das würde auch wieder fehler im Programm zur folge haben.

Ich versuche mich seit Wochen langsam reinzufragen in die Hintergrundabläufe in PB, damit alles auch sicher lauft.

Was mich wunderte ist, das der Fehler halt nicht bei closenetworkconnection() auftrat. Nun habe ich vor Minuten erstmal die Beta10 genutzt und dort wird nun wirklich / endlich an der vermutlich korrekten Stelle gemeckert (closenetworkconnection()).

Toshy
1. Win10
PB6.1
Gesperrt