【问题标题】:Qt app crash when opening ODBC db打开 ODBC 数据库时 Qt 应用程序崩溃
【发布时间】:2015-05-26 21:45:59
【问题描述】:

我正在开发一个与外部 ODBC 数据库连接的应用程序。 当我在 Qt 上运行它时,一切正常,但是当我尝试独立打开时,它总是在 m_db->open() 上崩溃。

当应用程序通过此错误崩溃时:

Segmentation fault (core dumped)

代码如下:

m_db = new QSqlDatabase(QSqlDatabase::addDatabase("QODBC","edb"));
m_db->setDatabaseName(m_line);
m_db->open(); // <-// app crash here!

地点:

m_line = "Driver=/opt/sqlanywhere12/lib64/libdbodbc12.so;CommLinks=tcpip(Host=ip;port=port);ServerName=db;DatabaseName=db;Uid=uid;Pwd=psswd;"

有人知道吗?

我正在运行 Ubuntu 14.04 64 位。 谢谢,

编辑

好吧,经过更多测试,如果我从 m_line 变量中删除驱动程序配置,它似乎停止崩溃,但显然,它停止工作......

EDIT2

从 Qt 创建者配置自定义运行后,它说断点是反汇编程序上的 0x7ffff6a777b9。什么意思?

【问题讨论】:

  • 既然m_db是一个指针,那么它的值是多少呢?它是否指向一个有效的实例?为什么是指针?为什么不使用对象实例(不是指针)编写一个简单的测试应用程序,以验证该简单应用程序是否有效?
  • 是的,它是一个有效的指针。我添加了一段代码。

标签: c++ sql qt odbc


【解决方案1】:

不是你如何使用QSqlDatabaseQSqlDatabase 实例是可通过连接名称检索的内部连接的句柄,它们不控制连接的生命周期。 所以应该在stack上声明:

m_db = QSqlDatabase::addDatabase("QODBC","edb"));
m_db.setDatabaseName(m_line);     
m_db.open();

【讨论】:

  • 感谢您的评论。不幸的是,在应用您建议的更改后,程序仍然在同一点崩溃。此外,由于内部管理,我需要一个指针。我认为问题应该是当 Qt 运行应用程序时,它添加了一些我没有的配置参数(比如添加一些包含路径)。根据我上次更新的内容,问题是任何库在 Qt 之外启动时会崩溃。
  • @Atron 你的调试器说什么?
  • 其实没什么。程序在 Qt Creator 上启动时工作(即使在发布模式下)。当我尝试在终端上启动它或单击可执行文件时,问题就来了。再次感谢@cmannett85!
  • @Atron “由于内部管理,我需要一个指针”不,你不需要。 m_db 不应该是一个指针,它应该用 QSqlDatabase::addDatabase(..) 初始化并用 `QSqlDatabase::removeDatabase(..) 销毁,两者都使用“edb”作为连接标识符。因此,您真正的问题似乎是 ODBC 驱动程序不在 Qt Creator 之外您的应用程序可以找到它的地方。
  • 如果 odbc db 不可用,gui 会冻结 3-4 秒,因为程序尝试重新连接数据库,为避免这种情况,我将 db 指针发送到另一个线程并尝试打开数据库就可以了。打开 db 时,会向主线程发送一个信号,并关闭额外的线程。我不想提及,为了不让人们感到困惑,因为问题不在于线程,而在于 Qt 外部打开 qsl 驱动程序的方式。现在我只打开创建一个 QSqlDatabase 实例并尝试打开数据库。如果我不使用指针,问题就没有解决。 :(
【解决方案2】:

嗯,有史以来最愚蠢的陷阱... 我忘记在执行时添加 LD_LIBRARY_PATH。

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多