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


Anmelden zum Antworten