Abstürze mit C++, Qt, IBPP und Exception Handling

Forum für Fragen rund um Firebird-Software von Drittanbietern.

Moderator: martin.koeditz

Antworten
Benutzeravatar
martin.koeditz
Beiträge: 58
Registriert: Sa 31. Mär 2018, 14:35

Mi 16. Jan 2019, 10:42

Hallo zusammen,

vielleicht kann mir jemand eine Hilfestellung geben.
Ich habe IBPP unter mingw mit 64 Bit kompiliert und als Bibliothek gelinkt. Soweit funktioniert das auch. IBPP nutzt an diversen Stellen Exception-Handling für die Weitergabe von DB-Meldungen. Sobald ich jedoch eine Exception auslöse, stürzt mein Programm ab.

Umgebung:
Windows Server 2016 64 Bit
Qt Creator 4.8.0
mingw 7.3.0 64 Bit
IBPP 2.5.3.1

Hier mal ein Auszug des entsprechenden Codes:

Code: Alles auswählen

[...]
const std::string UserName = "SYSDBA";
const std::string Password = "masterkey";
const std::string Database = "/srv/firebird/db.fdb";
const std::string Host = "10.1.1.100";

IBPP::Database db;
    try
    {
        db = IBPP::DatabaseFactory(Host, Database, UserName, Password, "", "", "");
        db->Connect();

        qDebug() << "Nicht verbunden";
        if(db->Connected()) {
            qDebug() << db->DatabaseName();
        }
        else {
            qDebug() << "Nicht verbunden";
        }

        db->Disconnect();

    }
    catch (IBPP::Exception& e)
    {
        qDebug() << "Feher";
    }
[...]
Sofern die DB-Parameter stimmen, funktioniert alles. Ändere ich z.B. den Benutzername, müsste eigentlich eine Exception geworfen werden, tut sie aber nicht.

In der .pro-Datei habe ich den Parameter

Code: Alles auswählen

CONFIG += exceptions
hinzugefügt. Damit sieht meine Compileranweisung z.B. so aus:

Code: Alles auswählen

[...]
g++ -c -fno-keep-inline-dllexport -DIBPP_WINDOWS -O2 -std=gnu++11 -fexceptions -mthreads -Wall -W -Wextra -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DIBPP_GCC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\..\FBGUI -I. -I..\..\SynToolkit -I..\..\SynDB -I..\..\ibpp\core -IC:\Qt\5.12.0\mingw73_64\include -IC:\Qt\5.12.0\mingw73_64\include\QtWidgets -IC:\Qt\5.12.0\mingw73_64\include\QtGui -IC:\Qt\5.12.0\mingw73_64\include\QtANGLE -IC:\Qt\5.12.0\mingw73_64\include\QtCore -Irelease -I. -I\include -IC:\Qt\5.12.0\mingw73_64\mkspecs\win32-g++  -o release\main.o ..\..\FBGUI\main.cpp
[...]
Vielleicht ist ja ein C++-Spezi hier im Forum unterwegs, der mir einen Hinweis geben kann.

Dank und Gruß
Martin
Martin Köditz
it & synergy GmbH
Benutzeravatar
martin.koeditz
Beiträge: 58
Registriert: Sa 31. Mär 2018, 14:35

Mi 16. Jan 2019, 12:17

OK, habe die Lösung nun nach Stunden der Suche selbst gefunden.

In den Quellen der IBPP-Bibliothek war eine ibase.h mit 2.0er API-Version. Ich habe nun die aktuelle 3.0er eingebunden und die DLL damit neu erstellt. Und siehe da, es läuft. Hatte also nichts mit der Fehlerbehandlung zu tun. Es ist einfach ein nicht abgefangener Fehler im db->Connect() aufgetreten, der mit der aktuellen ibase.h behoben ist.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Antworten