026
29.08.2003, 14:32 Uhr
virtual
Sexiest Bit alive (Operator)
|
Wenn sich Dein Programm mit einem SIGSEGV verabschiedet, kann es sein, daß nicht alle Ausgaben wirklich gemacht werden. Du solltest Dir angewöhnen, solche Debugausgaben nicht nach stdout über printf zu machen, sondern nach stderr über fprintf; noch besser mittels cerr, weil wir und ja in C++ aufhalten. stderr wird nicht gepuffert (stdout schon!) und damit sofort ausgegeben.
Nun hast Du davon losgelöst mehrere Alternativen: 1. Du glaubst Deinem Programm, das sagt ja "error: bind". WEnn Du das bind nicht direkt verwendest, wir es wohl demanch jemand für dich getan haben. Ich kenn mich nicht mit den verwendeten Klassen aus, kann daher nur raten. Aber wenn im Ctor von Form1 das bind zB schief geht, dann wird es höchste Zeit, mal um das "Form1 a" einen try Block zu legen:
C++: |
try { Form1 a; } catch (std::exception& e) { std::cerr<<e.what()<<std::endl; }
|
Sollte Dir einen exception text ausgeben; kann sein daß von dir verwendete Klassenbibliothek schlecht ist, dann sind die Exceptions nicht von std::exception abgeleitet, dann musst Du eben noch in die QT Doku schaun, was da die Basisklasse für exeptions ist. Jedenfalls kriegt man einen SIGSEGV ganz gerne bei nicht gefangenen Exceptions.
2. Du läßt das Programm abstürtzen und schaust dir den core mit einem Debugger deiner Wahl an. Mit dem gdb (von mir bevorzugt) ginge das so:
Code: |
# gdb programm.exe core > bt
|
Und du siehst genau, wo das ding in die Hose ging.
Wie dem auch sei: alles kein ANSI C mehr hier! :-( -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |