• 16774阅读
  • 25回复

困惑一周的问题,设计的程序运行一段时间就异常退出,源代码已附上 [复制链接]

上一主题 下一主题
离线pbcljf
 
只看楼主 正序阅读 楼主  发表于: 2009-12-06
使用了QHttp,QJson,系统是windows xp sp2,设计了一个农场外挂,不定期去服务器获取信息,程序运行几十分钟到一两个小时不等,就弹出程序异常错误,被系统终止了,eclipse 控制台报告:
QWaitCondition: Destroyed while threads are still waiting
QObject::killTimers: timers cannot be stopped from another thread
ASSERT failure in QMutex::lock: "Internal error, infinite wait has timed out.", file thread\qmutex.cpp, line 169
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

能想到的地方都修改测试了,debug和release现象一样,问题依然,崩溃中!现在怀疑是QHttp的bug,只要把http请求关闭,程序运行多长时间也不退出。
Qt4.5,现在换成Qt4.6了现象依旧。
程序正常运行中所有功能都正常,就是运行一段时间就弹出程序异常错误,系统提示向微软发,送错误报告。困惑死了,实在没着了,难道是QHttp的bug?我看Qt4.6.0的文档,QHttp已经被建议抛弃了,在线等待高手指点迷津,这是我使用Qt设计的处女作啊,有点怀疑Qt的稳定性了。

建立了一个简单的测试工程:http://www.qtcn.org/bbs/job.php?action=download&pid=64902&tid=24253&aid=3174
[ 此帖被pbcljf在2009-12-08 08:43重新编辑 ]
离线stdjgwyc
只看该作者 25楼 发表于: 2009-12-11
引用第22楼xtfllbl于2009-12-09 17:15发表的  :
忘记说了,那位开发和工程环境挂的那位,电脑里带qq的全删掉,只留下代Q的


就是我啦。。。
我的程序挂的时候,部分现象与楼主的相似~  

特点是
1\时而出问题,时而不出问题~~  
2\工程环境处问题,开发环境从未出问题  --  对这点我一直都比较迷惑,而且我也在开发环境,以容易引起程序挂的操作做了很多的测试,仍未使程序挂掉过~
3、调试会出问题~

经过两周痛苦的代码检查、尝试、试验,初步认定是由一个隐秘很深的越界造成的。
将相关经验和你们分享。

主程序调用了 a.dll, b.dll, c.dll, d.dll ,
CB b;
CC c;
CD d;
int main()
{
      CA a;      //1
      a.func();//2
      printf("end of main");
}
程序是在析构的时候出了问题, b.dll, c.dll, d.dll 是经过长时间运行考验过的, a.dll是与主程序相关,我自己维护的。
由于调试的时候总是导致VS挂掉, 为了检查是哪个模块析构的时候出了问题,便在1、2句 加了大括号,如下:
int main()
{
    {
      CA a;      //1
      a.func();//2
   }
      printf("end of main");
}
程序运行,每次都能打印"end of main", 这说明模块a正常析构了~  便把问题定位到全局变量~
后来通过在析构函数加打印语句的方法,找出模块c析构出问题~! 但是c出问题的地方在一个map::clear()的时候,而且,事实上程序已经将有关对c模块调用的部分注释了~~
仔细检查了c的代码,没发现有什么问题~
这个时候就非常痛苦了~~~  通过调试找不到准确的位置
接下来,只有通过大量随机的操作来重现问题,总结最简的操作~~  找出最有可能出错的地方~
后来发现,虽然每次都是c析构的时候出问题,但是真正的问题却发生在模块a里!  这也是最初根据析构出了问题,加大括号定位的时候给忽略了~
实际上,a模块里隐藏了一个越界的问题,但是a析构的时候没报错~~ a的越界导致非法修改了c的数据,导致c析构的时候出问题~!
这真是次极其艰苦的查找过程~
[ 此帖被stdjgwyc在2009-12-11 10:48重新编辑 ]
QT交流群群号:2906359,(200人大群,持续升级)
离线stdjgwyc
只看该作者 24楼 发表于: 2009-12-11
引用第23楼pbcljf于2009-12-10 20:18发表的  :
如果真是他作怪,这种方式也太变态了吧。我拥有的两台计算机,把QQ医生卸载后,问题都消失了。可以确认是QQ医生导致的了。


这个解释是合理的~
至少从推理上可以这么认为,因为QQ有QQ农场,与开心网相似~  那么它把防外挂做在安全检查软件QQ医生里,是很正常的现象~ QQ医生应该有常驻进程检测
QT交流群群号:2906359,(200人大群,持续升级)
离线pbcljf
只看该作者 23楼 发表于: 2009-12-10
如果真是他作怪,这种方式也太变态了吧。我拥有的两台计算机,把QQ医生卸载后,问题都消失了。可以确认是QQ医生导致的了。
离线xtfllbl

只看该作者 22楼 发表于: 2009-12-09
忘记说了,那位开发和工程环境挂的那位,电脑里带qq的全删掉,只留下代Q的
上海欢迎您
离线xtfllbl

只看该作者 21楼 发表于: 2009-12-09
帖子一路看到最后原来是马华疼在作怪,作孽阿
上海欢迎您
离线pbcljf
只看该作者 20楼 发表于: 2009-12-09
我的问题基本解决了,从昨天卸载了QQ医生,到现在程序运行良好,在查找bug的过程中,曾经怀疑过QQ医生在捣乱,采取过退出QQ医生,test工程修改为下载sohu网站的图片等措施,都没见任何成效,随排除对QQ医生的怀疑。
昨天,把所有怀疑点都排除,yb828帮我在他机器测试test工程没问题后,又把怀疑对象转移到QQ医生,彻底把QQ医生卸载后,程序到现在运行正常,估计问题解决了,但是对QQ医生为什么用这种方式捣乱,很不理解,是故意的还是兼容性引起的需要进一步落实。
离线stdjgwyc
只看该作者 19楼 发表于: 2009-12-08
楼主!我有与你类似的问题。。。。也缠绕我两周多了未解决~~

首先介绍我的问题:
QT4.5,现象为:
1、在开发和工程环境变现不一致,开发环境一次也没挂,工程环境能够重现问题(但是试验出来让程序挂的操作,并不是每次都能使程序挂);开发环境与工程环境都是XP~  安装的软件不一致
2、程序挂的时候,在工程环境调试,每次挂的地方不一致~ 且挂在全局变量中~ 而全局对象是同事写的,经历了很长时间的考验。不排除全局对象的问题,但是QT程序的问题也有很大嫌疑
3、挂的时候,有部分时候现象与你所描述一致。我主要怀疑我程序中所用的QTimer 和QProcess
不知道你的问题有没解决~~
我也正在努力查找问题ing~

查到问题了再共享。。
QT交流群群号:2906359,(200人大群,持续升级)
离线pbcljf
只看该作者 18楼 发表于: 2009-12-08
无论什么原因造成的,程序异常崩溃,而且还是不定期发作,而别的应用程序运行都很正常,太不可思议了。
离线pbcljf
只看该作者 17楼 发表于: 2009-12-08
这是学习QT4以来第一个程序,没有成功的程序做比照,因此一直怀疑哪里用法不合法,能调整的都调整了,最后留下一个功能,就是现在的test工程,仅仅实现下载图片,和显示图片的功能,如果这个现象在你们机器上不出现,可以断定是我系统环境和软件环境与Qt4程序有冲突。下一步就是初步卸载软件试试了。
   另外请有使用QNetworkAccessManager经验的朋友,帮我分析一下代码,看看我的用法有没有问题,是否存在资源未释放或者重复释放资源的问题。我的代码都是通过看qt的帮助文档一句句写出来的,没有例子做参照,Qt4的example中也没有QNetworkAccessManager的例子,只有一个QHttp的简单示例。
离线yb824
只看该作者 16楼 发表于: 2009-12-08
16位色32位色切换, 还是没问题啊
离线pbcljf
只看该作者 15楼 发表于: 2009-12-08
点击pushButton按钮,能看到QQ农场的登陆验证码图片吧
离线pbcljf
只看该作者 14楼 发表于: 2009-12-08
拜托了,我被这个问题困惑死了
离线pbcljf
只看该作者 13楼 发表于: 2009-12-08
难道真是我的xp系统环境的问题?和某些软件不兼容?请你多点击一下,切换一下分辨率试试
离线yb824
只看该作者 12楼 发表于: 2009-12-08
点了很多下,没出现问题呢
离线pbcljf
只看该作者 11楼 发表于: 2009-12-08
全部工程打包见附件,请大家帮我查找一下bug,或许你们哪儿编译就没这个问题了,那说明是我的系统环境的问题,我一共两台机器,都是windows xp2,集成开发环境是eclipse+cdt+MinGW
附件: Test.rar (897 K) 下载次数:129
离线pbcljf
只看该作者 10楼 发表于: 2009-12-08
test.cpp

#include "test.h"

Test::Test(QWidget *parent) :
    QWidget(parent) {
    ui.setupUi(this);
    http = new QNetworkAccessManager(this);
    http->setCookieJar(new QNetworkCookieJar(this));
    connect(http, SIGNAL(finished(QNetworkReply*)), this,
            SLOT(httpFinished(QNetworkReply*)));
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(buttonClicked()));
}
Test::~Test() {

}
void Test::buttonClicked() {
    QUrl url("http://ptlogin2.qq.com/getimage?aid=15000101&0.8065840525554738");
    http->get(QNetworkRequest(url));
}
void Test::httpFinished(QNetworkReply * reply) {
//    qDebug() << "httpFinished" << reply->bytesAvailable() << reply->header(
//                QNetworkRequest::ContentTypeHeader) << reply->url();

    QByteArray replyData = reply->readAll();
    if (reply->header(QNetworkRequest::ContentTypeHeader).toString()
            == "image/jpeg") {
        QPixmap p;
        p.loadFromData(replyData);
        ui.label->setPixmap(p);
    }
    //qDebug() << ((QTextCodec *) (QTextCodec::codecForName("utf8")))->toUnicode(
    //        replyData);
    reply->deleteLater();
}
离线pbcljf
只看该作者 9楼 发表于: 2009-12-08
test.h

#ifndef TEST_H
#define TEST_H

#include <QtGui/QWidget>
#include "ui_test.h"
#include <QtNetwork>
class Test: public QWidget {
Q_OBJECT

public:
    Test(QWidget *parent = 0);
    ~Test();
private slots:
    void httpFinished(QNetworkReply * reply);
    void buttonClicked();
private:
    Ui::TestClass ui;
private:
    QNetworkAccessManager * http;
};

#endif // TEST_H
离线pbcljf
只看该作者 8楼 发表于: 2009-12-08
main.cpp

#include "test.h"

#include <QtGui>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Test w;
    w.show();
    return a.exec();
}
离线pbcljf
只看该作者 7楼 发表于: 2009-12-08
昨晚换成QNetworkAccessManager,发现问题更加严重,有点收获是点击下载验证码图片几十次,然后点击桌面属性,设置颜色质量,由16位到32位切换,程序必死,为调试bug节省了时间。
我做了一个简单的测试程序,代码附后:
离线pbcljf
只看该作者 6楼 发表于: 2009-12-07
QHttp 的替代是QNetworkAccessManager
我已经在全部使用 QNetworkAccessManager,好像还是存在这个问题,正在继续找bug中ing
离线zzh

只看该作者 5楼 发表于: 2009-12-07
厉害,处女作就这么厉害,等熟女作的时候,岂不是能和比尔盖茨相抗衡?
离线hover_sky

只看该作者 4楼 发表于: 2009-12-07
不知道取代QHttp的是?
离线yj_yulin

只看该作者 3楼 发表于: 2009-12-07
既然QHttp已经被建议抛弃,何不试试新的方法呢
离线pbcljf
只看该作者 2楼 发表于: 2009-12-06
在main函数中使用try catch也捕获不到任何异常
离线pbcljf
只看该作者 1楼 发表于: 2009-12-06
我的main.cpp代码:

#include "qqfarm.h"

#include <QtGui>
#include <QApplication>
#include <QtDebug>
#include "login.h"
int main(int argc, char *argv[]) {

    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));

    Login login;

    login.downloadFile();//下载验证码图片文件
    if (login.exec() == QDialog::Accepted) {

        QQFarm farm;
        farm.initQzone();
        farm.show();
        return a.exec();
    }

}
快速回复
限100 字节
 
上一个 下一个