QSqlQuery 可以让你的程序崩溃

本文探讨了一款程序在Linux环境下使用SQLite数据库时遇到的多线程崩溃问题。通过GDB调试并修复栈破坏,最终发现QSqlQuery的局部变量声明导致了资源申请错误。将QSqlQuery改为类成员变量后,解决了崩溃问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  linux平台下。

  一个程序总是运行个两三天,或者一两天的时候突然崩溃了,以前发过一个讨论但是也没找到解决办法,使用的数据库是SQLITE

  使用GDB跟踪程序,结果找到了崩溃的地方却显示栈被破坏显示不出调用的具体方法,运行了好几次都是这样。定位到了 __memmove_ssse3在libc里面。

 为了恢复完整的栈信息在国外大牛那里找来两句话

(gdb)set $pc=*(void **)$esp
(gdb)set $esp=$esp+4

执行完就可以查看堆栈了(32位平台)。注意这个不能由core文件进入gdb,必须只能是运行着的程序崩溃被gdb捕捉到才行。

  查看堆栈看到了出错了地点

void xxx::execsql(QString sql)
{
   QMutexLocker locker(&this->readlock);
   QSqlQuery query(this->database);  //运行到这里崩溃了
   if(query.exec(sql)) ...
   ...
}

程序多线程向数据库插入数据,尽管我已经很小心地处理线程了,但是运行到未来某一时刻还是会崩溃。

  直到我又等了两三天测试,测试要看机缘啊,有时候它完全正常工作啊,有时候会崩溃。 结果就是这个方法执行的很频繁,而且同一时刻只有一个线程在访问数据库,但是这句话会崩溃。原因我还没有具体知道,我的推测: 因为在堆栈里面显示QSqlQuery里有数据库资源的申请与释放,在申请资源的时候出错了直接崩溃了。

  然后我就将query提升为类成员,代码变成如下了。


void xxx::execsql(QString sql)
{
   QMutexLocker locker(&this->readlock);
   if(this->query->exec(sql))
   ...
   ...
}
 

  再运行,好了。

  这个问题仅在多线程(即使加了锁)且操作数据库频繁的时候才会出现,其他情况下则运行良好。

转载于:https://my.oschina.net/000quanwei/blog/379776

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值