000
26.07.2002, 23:32 Uhr
Cer
|
Guten Tag.
Ich kämpfe seit ca. einer Woche mit einem sehr seltsamen "Bug".
Ich benutze den Borland C++ Builder 5.5 Compiler 5.5.1 unter Windows (freecommandlinetools.exe). Das ist die kostenlose Kommandozeilen-Version des Compilers. Zum Debuggen benutze ich den ebenfalls kostenlos erhältlichen Turbo Debugger (td32.exe). Quelle: Borland Homepage
Vorneweg: ich kann leider keinerlei Quellcode des Programms bereitstellen, da der Fehler nur bei vollständig vorhandenem Code auftritt, der allerdings viel zu groß ist, als dass ich ihn hier abdrucken könnte. Ich habe versucht, den Code auf das Wesentliche (Fehlerverursachende) zu verkürzen, aber - wie gesagt - dann tritt der Fehler nicht mehr auf.
Ich habe eine Klasse bot und eine Klasse netsock. Beide in separaten Modulen. Aus dem Hauptmodul (main.cpp mit main()) rufe ich die Memberfunktion login von bot auf. Die wiederum erstellt ein Objekt der Klasse netsock, deren Konstruktor die private Memberfunktion resolve aufruft.
resolve wirft eine Exception vom Typ netsock_err. Der Stack sollte bis catch (netsock_err err) in login zurückgespult werden, was seinerseits eine Exception vom Typ bot_err wirft.
Das Problem: bevor diese Exception mit catch (bot_err err) in main() gefangen wird, meldet mir Windows zwei Fehler durch eine Ungültige Seite in MAIN.EXE und einen dritten durch eine Schutzverletzung in KERNEL32.DLL.
Das alles wäre ja noch ganz spaßig, wenn ich mir nicht absolut sicher wäre, dass es nicht meine Schuld ist. Es sieht nach einem verrückten gewordenen Pointer aus, der ins Codesegment oder zumindest in nicht zum Programm gehörende Datensegmente schreibt; nur benutze ich bis dahin keinen einzigen Pointer.
Wenn ich mit dem -v Switch kompiliere ("Source level debugging" - ermöglicht es, auf Quellcode-Ebene zu debuggen) und das Programm dann laufen lasse (im Debugger sowie auf der Kommandozeile) läuft es fehlerfrei. Ohne -v spuckt der Debugger natürlich wenig Sinnvolles (Assembler-Source und ein paar tausend Register) aus, meldet aber irgendwann eine Access Violation.
Hm. Tja. Nachdem ich wirklich alles analysierte und probierte kam ich zu dem Schluss, dass es für dieses Verhalten nur zwei Gründe geben kann: entweder ist die Standardbibliothek fehlerhaft (ich benutze string, cout und Konsorten und ein paar C-STL Funktionen) oder ich habe das Thema Exceptions noch nicht ganz kapiert.
Edit: mit diesem Fehler könnte ich leben, wenn das Programm vorher bereits 12.000 Zeilen Code hinter sich hätte. Hier werden allerdings nur diese paar Funktionen aufgerufen und ein paar strings initialisiert/bearbeitet; keine weiteren Funktionsaufrufe irgendeiner exotischen API oder so. Es ist praktisch ein allgemeines Rahmenprogramm.
Danke für's Lesen.
P. S.: Warum tut [code] eigentlich dasselbe wie [cpp] und nicht das, was in der Hilfe/FAQ steht? -- -C Dieser Post wurde am 27.07.2002 um 00:01 Uhr von Cer editiert. |