Anzeige:
Ergebnis 1 bis 13 von 13

Thema: C++ Exception

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128

    C++ Exception

    Hi,

    eigentlich sollte ja wenn die aufrufende Funktion kein catch Block besitzt die Excpetion weiterwerfen bis es zur main / os ankommt.

    Jetzt hab ich in der main Funktion ein try catch block der alles umschliesst aber ich fange nur die Funktionen auf die eine Ebene tiefer sind.
    Und Exceptions die noch tiefer im Program sind kommen nicht an es wird automatisch ein Backtrace von glibc ausgerichtet?!?!?
    Code:
    *** glibc detected *** ./prog: free(): invalid pointer: 0x08165c14 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb73878bd]
    /lib/tls/i686/cmov/libc.so.6(__libc_free+0x84)[0xb7387a44]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7537fc1]
    /usr/lib/libQtGui.so.4(_ZN11QLayoutItemD0Ev+0x28)[0xb77ba9f8]
    /usr/lib/libQtGui.so.4(_ZN10QBoxLayoutD2Ev+0x89)[0xb779c8f9]
    /usr/lib/libQtGui.so.4(_ZN11QVBoxLayoutD1Ev+0x31)[0xb779c9d1]
    usw....
    b7eff000-b7f00000 rw-p b7eff000 00:00 0 
    b7f00000-b7f19000 r-xp 00000000 08:11 8433873    /lib/ld-2.4.so
    b7f19000-b7f1b000 rw-p 00018000 08:11 8433873    /lib/ld-2.4.so
    bf95f000-bf975000 rw-p bf95f000 00:00 0          [stack]
    ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]
    Aborted (core dumped)
    Als Toolkit benutze ich Qt4 liegt es daran? ich meine wer fängt meine Exception ab? Nirgendswo anders habe ich ein try catch block ausser in der main funktion.

    Gruss,
    xmarvel

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Die Exceptions die von der glibc geworfen werden haben nichts mit den C++-Exceptions zu tun. Auch wenn es theoretisch Möglichkeiten gibt das Signal abzufangen, ist die richtige Lösung den dahinterliegenden Programmfehler zu beseitigen. Ähnlich wie bei einem Segmentation Fault ist das Programm dann ohnehin in keinem Zustand in dem man noch etwas sinnvolles machen kann.

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    also die Exception löse ich ja zu testzwecken gewollt aus.
    Mir ist aufgefallen das ein Backtrace nur im Konstruktor erstellt wird (hab nicht dran gedacht das man dort keine Exception auslösen soll) aber wenn es eine normale Methode ist dann kommt nun folgendes:
    Code:
    terminate called after throwing an instance of 'AccessFailureException'
    Aborted (core dumped)
    *** Exited with status: 134 ***
    Also das wird auch nicht aufgefangen.

    /Edit
    ich glaub ich hab mein Problem gefunden siehe hier anscheinend funkt Qt tatsächlich dazwischen.

    Gruss,
    xmarvel
    Geändert von xmarvel (23-02-2007 um 13:11 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Jetzt hab ich in der main Funktion ein try catch block der alles umschliesst aber ich fange nur die Funktionen auf die eine Ebene tiefer sind.
    Und Exceptions die noch tiefer im Program sind kommen nicht an es wird automatisch ein Backtrace von glibc ausgerichtet?!?!?
    Dein Code, oder der einer von dir verwendeten Bibliothek hat möglicherweise irgendwo einen Fehler. Löst du in einem Qt Eventhandler oder Slot die Exception aus? Das wird von Qt nämlich nicht ohne weiteres unterstützt.

    Ein Tipp: Versuch doch mal mit Gdb (oder einem anderen Debugger) dein Programm anzuhalten wenn eine Aushnahme gefangen wird. Dann kannst du sehen, ob es irgendwo einen Catch-Block gibt, der die Weiterleitung verhindert.

    Mir ist aufgefallen das ein Backtrace nur im Konstruktor erstellt wird (hab nicht dran gedacht das man dort keine Exception auslösen soll) [...]
    Konstruktoren sind ein Beispiel für Stellen an denen man Exceptions werfen sollte. Das was du meinst, sind Destruktoren, oder?

  5. #5
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    Zitat Zitat von locus vivendi Beitrag anzeigen
    Dein Code, oder der einer von dir verwendeten Bibliothek hat möglicherweise irgendwo einen Fehler. Löst du in einem Qt Eventhandler oder Slot die Exception aus? Das wird von Qt nämlich nicht ohne weiteres unterstützt.
    ja daran liegt es jetzt definitiv siehe den Link vom editierten Beitrag.
    Jetzt bin ich auf der suche wo das erklärt wird auf der Qt Seite. Hat dazu jemand ein Link hab bis jetzt noch nichts gefunden auf trolltech.

    Zitat Zitat von locus vivendi Beitrag anzeigen
    Ein Tipp: Versuch doch mal mit Gdb (oder einem anderen Debugger) dein Programm anzuhalten wenn eine Aushnahme gefangen wird. Dann kannst du sehen, ob es irgendwo einen Catch-Block gibt, der die Weiterleitung verhindert.
    Das hab ich schon gemacht da wird allerdings wenn ich step by step gehe nur der Konstruktor von der Exception Klasse aufgerufen und anschließend wird das Programm terminiert.

    Zitat Zitat von locus vivendi Beitrag anzeigen
    Konstruktoren sind ein Beispiel für Stellen an denen man Exceptions werfen sollte. Das was du meinst, sind Destruktoren, oder?
    stimmt da hast du recht.

    Gruss,
    xmarvel

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Qt wird oft ohne Execption Support gebaut, weil es Qt selbst nicht benutzt und daher auch keine Aussage über das Verhalten der Software gemacht werden kann, wenn eine Exception Qt internen Code durchläuft (zB eine Signal/Slot Aktivierung)

    Hast du die Qt Lib selbst gebaut (mit Execptionsupport) oder eine vorbereitet benutzt?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •