sporadische "Access violation"'s
-
Hallo,
ich habe folgendes Problem:
Ich debugge eine Anwendung, welche unter Visual C++ 6.0 erstellt
worden ist. Sie hat einen Extra-Thread, welcher in einer
Endlosschleife der Com-Port abfrägt und bei Empfang von Daten eine
Nachricht verschickt.Auf dem Computer, auf dem das Projekt erstellt worden ist, ist alles
in Ordnung - Das Programm läuft einwandfrei (PIII 900Mhz ca., Win
2000). Geht man jedoch mit einer kompilierten Version (egal ob
"Release" oder "Debug") auf schnellere Rechner (ebenfalls Win 2000),
treten sporadisch "Access Violation"s auf. Das selbe passiert auf
einem alten, langsamen NT4.0 Rechner, auf welchem Visual C++
installiert ist, dort habe ich nun schon einige Debug Versuche
angestellt. Hier ist das ganze sogar so instabil, daß das Programm
direkt nach dem Start abstürzt.Bei einem Absturz springt der Debugger zu ungewöhnlichen Stellen -
etwa in die Datei \MFC\RC\APPCORE.CPP (Funktion AssertValid()),
...\THRDCORE.CPP (Funktion OnIdle()), oder er springt in den
Disassembler bei Adresse 0, d.h. es wird "00000000 ???" angezeigt.
Will sagen: Es ist mir nicht möglich, rauszufinden an welcher Stelle
in dem von mir zu debuggenden Programm der Fehler liegt."Eingelesen" vom Com-Port wird mit:
ReadFile(g_FMM.po_Com->mh_ComPort, lpBuf,iReadAtOnceQuantity, &dwRead,
&osReader)
Das geschieht wie gesagt in einem Thread, d.h. aus einer
Endlosschleife heraus aus welcher auch noch mit PostMessage
Nachrichten verschickt werden, falls neue Daten vorhanden sind.
Hierfür wird Speicher reserviert, und dann an anderer Stelle wieder
freigegeben.Da das ganze wie gesagt Ereignisgesteuert ist und nicht sequentiell
abläuft, kann ich nicht einfach durch den Code steppen und schauen, wo
es auftritt. Im Gegenteil, wenn ich z.B. durch diesen Thread steppe,
tritt der Fehler nicht auf.In der Richtung hab ich noch ein wenig geforscht: Irgendwo in der
Schleife gibt es ein switch, in welchem Thread-spezifische Sachen
bearbeitet werden, z.B. Thread beenden etc.
Der Wert der Variablen, die in diesem switch verarbeitet wird, wird
von WaitForMultipleObjects(...) zugewiesen.
Also:
---
dwRes = WaitForMultipleObjects(...)switch (dwRes) {
case ...:
break;
}
---
=> Wenn ich diesen Aufruf + das Switch auskommentiere, stürzt die
Sache subjektiv seltener ab, zumindest dauert es länger! Ob es nun in der Tat an diesem Aufruf liegt oder an was anderem, weiß ich nicht. (Wie gesagt, abstürzen tut das Programm immer sporadisch an versch. Stellen)
Benutzen kann man das Programm dann natürlich nicht, da ja keine Nachrichtenbehandlung mehr erfolgt...Hier die Variablen die ich an WaitForMultipleObjects übergebe:
ciQuantityOfReceiveEvents (3)
hArray (Eventliste; hat 3 Elemente)
false
ciReadTime (50)---
Falls irgendjemand auch nur den Hauch einer Idee hat, woran es liegen
könnte: Bitte sagt es mir! Mir gehen so langsam die Ideen aus, wo ich
noch suchen könnte, sehr erbaulich ist diese Arbeit auch nicht...Gruß und schonmal Danke,
Christian
-
Eine Anmerkung, wenn ich dieses "WaitForMultipleObjects"-Ding auskommentiere, stürzt die Sache überhaupt nicht mehr ab. Tut mir leid, ich sitz jetzt schon ne Weile dran und bin so langsam mit den Nerven fertig...
Gruß,
Christian