qq_30837765 2023-11-10 11:30 采纳率: 0%
浏览 9

Qt+linux调用数据库查询的时候崩溃

Qt+linux调用数据库查询的时候崩溃
在用Qt4.8.5在嵌入式linux上开发的应用程序,但是在程序老化过程中突然发生了崩溃
通过gdb查看调用堆栈发现在调用QSqlquery.exec的时候崩溃掉了,应用场景是5s调用一次数据库查询;堆栈信息如下

(gdb)
#0  0x7639bc48 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#1  0x76396900 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#2  0x76398324 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#3  0x76399020 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#4  0x76386c60 in QSqlQuery::exec() ()
   from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#5  0x000ea7e4 in SqliteInterface::queryGyPatientData (this=0x221c4e8,
    filter=..., sign=true)
    at ../CelercareV5-dingzhi/DataBase/SqliteInterface.cpp:677
#6  0x00509858 in CLS_MyHttpLib::getReportResultIdList (this=0x20089e8,
    lastDataTime=..., resultIdList=...)
    at ../CelercareV5-dingzhi/cls_myhttplib.cpp:193
#7  0x76d79fa8 in HttpReportTestResult::startReportTestResult() ()
   from /usr/local/freescale/qt4.8.5/lib/libHttpCommonCpp.so
#8  0x76d7a4e8 in reportTestResultThreadRun(void*) ()
   from /usr/local/freescale/qt4.8.5/lib/libHttpCommonCpp.so
#9  0x755f5b10 in start_thread () from /lib/libpthread.so.0
#10 0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) thread apply all bt

Thread 14 (Thread 0x6e7c8460 (LWP 1417)):
#0  0x75406730 in malloc () from /lib/libc.so.6
#1  0x763b4858 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 13 (Thread 0x7536b000 (LWP 1075)):
#0  0x754550ec in select () from /lib/libc.so.6
#1  0x754550e0 in select () from /lib/libc.so.6
#2  0x0003ff36 in ScanEngineCtl::SetScan (
    this=<error reading variable: Cannot access memory at address 0xfffffff0>)
    at ../CelercareV5-dingzhi/CmdComm/ScanEngineCtl.cpp:367
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Thread 12 (Thread 0x70fc8460 (LWP 1408)):
#0  0x754550ec in select () from /lib/libc.so.6
#1  0x754550e0 in select () from /lib/libc.so.6
#2  0x00041b30 in IpLineEdit::setDotLabel (this=0x0)
    at ../CelercareV5-dingzhi/CustomUI/iplineedit.cpp:100
#3  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 11 (Thread 0x707c8460 (LWP 1411)):
---Type <return> to continue, or q <return> to quit---
#0  0x754550ec in select () from /lib/libc.so.6
#1  0x754550e0 in select () from /lib/libc.so.6



#2  0x000cb820 in Ui_Debug::retranslateUi (this=0xae, Debug=0x29e9512)
    at ./ui_debugdialog.h:4205
#3  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 10 (Thread 0x71fc8460 (LWP 1404)):
#0  0x755fa658 in pthread_cond_timedwait@@GLIBC_2.4 ()
   from /lib/libpthread.so.0
#1  0x7567804c in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#2  0x7567869c in QThread::msleep(unsigned long) ()
   from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#3  0x004380fc in QBluetoothThread::run (this=0x23174a0)
    at ../CelercareV5-dingzhi/bluetooth/qbluetooth.cpp:253
#4  0x7567916c in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#5  0x755f5b10 in start_thread () from /lib/libpthread.so.0
#6  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 9 (Thread 0x72fc8460 (LWP 1106)):
#0  0x755fa658 in pthread_cond_timedwait@@GLIBC_2.4 ()
   from /lib/libpthread.so.0
---Type <return> to continue, or q <return> to quit---
#1  0x7567804c in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#2  0x7567869c in QThread::msleep(unsigned long) ()
   from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#3  0x003b6708 in Comdata::run (this=0x1ffa9c0)
    at ../CelercareV5-dingzhi/CmdComm/comdata.cpp:560
#4  0x7567916c in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#5  0x755f5b10 in start_thread () from /lib/libpthread.so.0
#6  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 8 (Thread 0x6efc8460 (LWP 1416)):
#0  0x7542ba00 in nanosleep () from /lib/libc.so.6
#1  0x7542b9f4 in nanosleep () from /lib/libc.so.6
#2  0x75759060 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 7 (Thread 0x74288460 (LWP 1104)):
#0  0x754550ec in select () from /lib/libc.so.6

#1  0x754550e0 in select () from /lib/libc.so.6
#2  0x756cef34 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 6 (Thread 0x6ffc8460 (LWP 1412)):
---Type <return> to continue, or q <return> to quit---
#0  0x754550ec in select () from /lib/libc.so.6
#1  0x754550e0 in select () from /lib/libc.so.6
#2  0x000926fa in Ui_Debug::setupUi (this=0x0, Debug=0x0)
    at ./ui_debugdialog.h:978
#3  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 5 (Thread 0x6d8f4460 (LWP 1456)):
#0  0x7545bf84 in epoll_wait () from /lib/libc.so.6
#1  0x76d51b90 in Epoll::wait(int) ()
   from /usr/local/freescale/qt4.8.5/lib/libHttpCommonCpp.so
#2  0x76d5999c in recvThreadRun(void*) ()
   from /usr/local/freescale/qt4.8.5/lib/libHttpCommonCpp.so
#3  0x755f5b10 in start_thread () from /lib/libpthread.so.0
#4  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 4 (Thread 0x6f7c8460 (LWP 1414)):
#0  0x754550ec in select () from /lib/libc.so.6
#1  0x754550e0 in select () from /lib/libc.so.6
#2  0x756cef34 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

---Type <return> to continue, or q <return> to quit---
Thread 3 (Thread 0x717c8460 (LWP 1407)):
#0  0x755fa658 in pthread_cond_timedwait@@GLIBC_2.4 ()
   from /lib/libpthread.so.0
#1  0x7567804c in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#2  0x7567869c in QThread::msleep(unsigned long) ()
   from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#3  0x00039e68 in MyDelay::mdelay (milsec=2000)
    at ../CelercareV5-dingzhi/CmdComm/MyDelay.h:23




#4  0x0045e728 in BlueTooth::run (this=0x22e6718)
    at ../CelercareV5-dingzhi/CmdComm/BlueTooth.cpp:439
#5  0x7567916c in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtCore.so.4
#6  0x755f5b10 in start_thread () from /lib/libpthread.so.0

#7  0x7545b958 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 2 (Thread 0x74c5e460 (LWP 1080)):
#0  0x754550ec in select () from /lib/libc.so.6
#1  0x754550e0 in select () from /lib/libc.so.6
#2  0x00000100 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 1 (Thread 0x6d0f4460 (LWP 1487)):
#0  0x7639bc48 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
---Type <return> to continue, or q <return> to quit---
#1  0x76396900 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#2  0x76398324 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#3  0x76399020 in ?? () from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#4  0x76386c60 in QSqlQuery::exec() ()
   from /usr/local/freescale/qt4.8.5/lib/libQtSql.so.4
#5  0x000ea7e4 in SqliteInterface::queryGyPatientData (this=0x221c4e8,
    filter=..., sign=true)
    at ../CelercareV5-dingzhi/DataBase/SqliteInterface.cpp:677
#6  0x00509858 in CLS_MyHttpLib::getReportResultIdList (this=0x20089e8,
    lastDataTime=..., resultIdList=...)
    at ../CelercareV5-dingzhi/cls_myhttplib.cpp:193
#7  0x76d79fa8 in HttpReportTestResult::startReportTestResult() ()
   from /usr/local/freescale/qt4.8.5/lib/libHttpCommonCpp.so
#8  0x76d7a4e8 in reportTestResultThreadRun(void*) ()
   from /usr/local/freescale/qt4.8.5/lib/libHttpCommonCpp.so
#9  0x755f5b10 in start_thread () from /lib/libpthread.so.0
#10 0x7545b958 in clone () from /lib/libc.so.6


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-10 14:07
    关注

    【以下回答由 GPT 生成】

    这个问题可能是由于以下原因导致的崩溃:

    1. 内存泄漏:在每次循环中调用数据库查询时没有正确释放内存,导致内存耗尽而崩溃。
    2. 并发访问数据库:在多线程环境下,多个线程同时访问数据库可能会引发竞态条件,导致数据访问冲突而崩溃。
    3. 数据库连接问题:可能存在数据库连接断开或无效的情况,导致每次查询时都无法正常执行而崩溃。

    为了解决这个问题,可以采取以下步骤:

    1. 检查代码中是否存在内存泄漏的情况。可以通过在每次查询结束后手动释放分配的内存,或使用智能指针来管理资源,确保及时回收。
    2. 确保在多线程环境下正确管理数据库连接。可以使用互斥锁来同步多个线程对数据库的访问,或者使用连接池来管理数据库连接,确保并发访问安全。
    3. 检查数据库连接是否正常。可以通过在每次查询前检查连接的有效性,并在连接断开时重新建立连接。

    下面是一个简单的代码示例,演示了如何释放内存、管理数据库连接以及检查连接的有效性:

    #include <QtSql>
    #include <QMutex>
    
    // 定义一个全局互斥锁,用于同步数据库访问
    QMutex mutex;
    
    // 定义数据库连接
    QSqlDatabase db;
    
    // 函数用于查询数据库
    void queryDatabase() {
        // 加锁,保证同一时间只有一个线程访问数据库
        QMutexLocker locker(&mutex);
    
        // 检查数据库连接是否有效
        if (!db.isOpen()) {
            // 如果连接已关闭,重新建立连接
            db = QSqlDatabase::addDatabase("QMYSQL"); // 根据实际情况替换为你使用的数据库类型
            db.setHostName("localhost"); // 替换为实际的数据库主机名
            db.setDatabaseName("mydatabase"); // 替换为你的数据库名称
            db.setUserName("username"); // 替换为你的数据库用户名
            db.setPassword("password"); // 替换为你的数据库密码
            bool ok = db.open();
            if (!ok) {
                qDebug() << "数据库连接失败";
                return;
            }
        }
    
        QSqlQuery query;
        bool ok = query.exec("SELECT * FROM mytable"); // 替换为你的查询语句
        if (ok) {
            while (query.next()) {
                // 处理查询结果
            }
        } else {
            qDebug() << "查询失败";
        }
    }
    
    int main() {
        // 初始化数据库连接
        db = QSqlDatabase::addDatabase("QMYSQL"); // 根据实际情况替换为你使用的数据库类型
        db.setHostName("localhost"); // 替换为实际的数据库主机名
        db.setDatabaseName("mydatabase"); // 替换为你的数据库名称
        db.setUserName("username"); // 替换为你的数据库用户名
        db.setPassword("password"); // 替换为你的数据库密码
    
        // 循环查询数据库
        while (true) {
            queryDatabase();
            sleep(5); // 休眠5秒
        }
    
        return 0;
    }
    

    希望以上解决方案对您有所帮助。如果以上方法不能解决问题,可能需要更深入地调查和分析程序的其他部分。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月10日

悬赏问题

  • ¥15 问题遇到的现象和发生背景 360导航页面千次ip是20元,但是我们是刷量的 超过100ip就不算量了,假量超过100就不算了 这是什么逻辑呢 有没有人能懂的 1000元红包感谢费
  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间
  • ¥15 用C语言判断命题逻辑关系
  • ¥15 原子操作+O3编译,程序挂住
  • ¥15 使用STM32F103C6微控制器设计两个从0到F计数的一位数计数器(数字),同时,有一个控制按钮,可以选择哪个计数器工作:需要两个七段显示器和一个按钮。
  • ¥15 在yolo1到yolo11网络模型中,具体有哪些模型可以用作图像分类?
  • ¥15 AD9910输出波形向上偏移,波谷不为0V
  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘