Qt debug版本运行正常release版本运行崩溃问题记录

 

问题由来

某一项目debug版本运行正常,进入发布阶段,结果release后的版本出现了崩溃问题,因为是release版本,不能debug运行,只能通过printf debug,虽然问题原因很简单,但是耗费了大量时间,故做此记录,以供后续参考。

问题环境

开发环境:Qt 5.6.1

编译器:gcc version 4.9.2 (i686-posix-dwarf-rev1, Built by MinGW-W64 project)

问题原因

问题代码示例:

示例代码内容较少,很容易发现代码有问题,即getSize()没有return返回值。

int getSize(const QStringList &list)
{
    list.size();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStringList header;
    header<<"1111"<<"2222"<<"3333"<<"4444";

    qInfo()<<"getSize return value:"<

上述代码编译能正常通过,运行输出结果如下:

debug版本的输出:
getSize return value: 4

release版本的输出:
getSize return value: 0

可见gcc编译器在debug和release版本下函数默认返回值不一样,release 版本默认返回了0,这就是release版本崩溃的原因。不得不说,gcc编译的debug和release版本行为不一致,是个很大坑。

问题处理

找到原因,相应的处理措施就有了,即函数中添加return返回相应的值。

但是有没有更好的办法,在编译阶段就避免这样的问题呢?

方法1:

因为是编译器问题,如果有条件可以更换编译器,我试了下MSVC2015_32bit的编译器。在debug下编译不通过:

e:\test\tableview\main.cpp(8) : error C4716: “getSize”: 必须返回一个值

不得不说MSVC的做法更合理。

方法2:

提升gcc的告警等级,加入-Werror 编译参数,将所有的告警当做错误处理,但是这个可能不是我们想要的,我们想要的是将某一类告警(return-type)当做错误处理,小伙伴们有知道方法的,可以留言,多谢了~

你可能感兴趣的:(C++,Qt)