• 8530阅读
  • 7回复

[提问]重新说明一下那个让我凌乱很多天的问题(SIGSEGV),这次不用图片了 [复制链接]

上一主题 下一主题
离线83888788
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-14
这是出错的源代码
  1. void PieceThread::slotReadReady()
  2. {
  3.         while(reply!=NULL&&!pauseFlag&&!reply->atEnd())
  4.         {
  5.             QMutexLocker locker(&mutex);
  6.             file->seek(workingPos);
  7.             workingPos+=file->write(reply->read(4096));//这个就是出错的行,从堆栈调用来看,错在这个read
  8.             emit this->signalProgressIncrease(workingPos-oldWorkingPos);
  9.             oldWorkingPos=workingPos;
  10.         }
  11. }



小弟在局部变量中查看了,可以向大家保证的是 file和reply都是合法的指针。
程序是在运行一段时间出错,或者不出错。

这里是错误堆栈:


0    QList<QNetworkReplyImplPrivate::InternalNotifications>::contains    qlist.h    864    0x680cd407    
1    QNetworkReplyImplPrivate::backendNotify    qnetworkreplyimpl.cpp    365    0x68048179    
2    QNetworkReplyImpl::readData    qnetworkreplyimpl.cpp    873    0x6804a2f8    
3    QIODevice::read    qiodevice.cpp    829    0x6a1ab817    
4    QIODevice::read    qiodevice.cpp    964    0x6a1abd3b                    //这里应该是那个read(4096)了吧
5    PieceThread::slotReadReady    piecethread.cpp    48    0x4048e3    
6    PieceThread::qt_metacall    moc_piecethread.cpp    84    0x408a73    
7    QMetaObject::metacall    qmetaobject.cpp    237    0x6a2060b0    
8    QMetaCallEvent::placeMetaCall    qobject.cpp    535    0x6a210d55    
9    QObject::event    qobject.cpp    1217    0x6a212c60    
10    QApplicationPrivate::notify_helper    qapplication.cpp    4462    0x7ebde0    
11    QApplication::notify    qapplication.cpp    3862    0x7e9732    
12    QCoreApplication::notifyInternal    qcoreapplication.cpp    731    0x6a2015f8    
13    QCoreApplication::sendEvent    qcoreapplication.h    215    0x6a268308    
14    QCoreApplicationPrivate::sendPostedEvents    qcoreapplication.cpp    1372    0x6a2026a3    
15    qt_internal_proc    qeventdispatcher_win.cpp    497    0x6a22499f    
16    USER32!GetDC    C:\WINDOWS\system32\user32.dll    0    0x77d18734    
17    ??        0    0x3301a4    
18    ??        0    0x401    
19    ??        0        
                



第0行的那个堆栈调用函数在下面,是在qlist.h中定义的

  1. Q_OUTOFLINE_TEMPLATE QBool QList<T>::contains(const T &t) const
  2. {
  3.     Node *b = reinterpret_cast<Node *>(p.begin());
  4.     Node *i = reinterpret_cast<Node *>(p.end());
  5.     while (i-- != b)
  6.         if (i->t() == t)                                               //这就是出错位置吧
  7.             return QBool(true);
  8.     return QBool(false);
  9. }



这个问题困扰我真的很久了,谢谢大家帮忙啊!




[ 此帖被83888788在2011-03-15 20:28重新编辑 ]
离线jdwx

只看该作者 1楼 发表于: 2011-03-14
workingPos+=file->write(reply->read(4096));//这个就是出错的行,从堆栈调用来看,错在这个read
增加几个变量,把这行拆成几行,加断点调试。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线83888788
只看该作者 2楼 发表于: 2011-03-14
现在的问题就是知道了错误在read那里不知道怎么改。。。
离线83888788
只看该作者 3楼 发表于: 2011-03-15
求大侠们解决!
离线jdwx

只看该作者 4楼 发表于: 2011-03-16
引用第1楼jdwx于2011-03-14 16:42发表的  :
workingPos+=file->write(reply->read(4096));//这个就是出错的行,从堆栈调用来看,错在这个read
增加几个变量,把这行拆成几行,加断点调试。

没啥好办法,就是尽量简化代码,每行尽量简单,只完成一个功能,因为是按行调试
你这段代码太复杂不便于调试,workingPos+=file->write(reply->read(4096));
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线83888788
只看该作者 5楼 发表于: 2011-03-16
引用第2楼83888788于2011-03-14 19:49发表的  :
现在的问题就是知道了错误在read那里不知道怎么改。。。




谢谢你的建议,但是我现在知道了错误在read那里,就是不知道后面的那个堆栈调用哪里错了啊。
离线83888788
只看该作者 6楼 发表于: 2011-03-16
回 4楼(jdwx) 的帖子
谢谢你的建议,但是我现在知道了错误在read那里,就是不知道后面的那个堆栈调用哪里错了啊。
离线jdwx

只看该作者 7楼 发表于: 2011-03-16
知道是read那里有问题,怎么办?看看read出什么数据了不就有办法了。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个