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

3 篇文章 0 订阅

 

问题由来

某一项目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:"<<getSize(header);

    return a.exec();
}

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

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)当做错误处理,小伙伴们有知道方法的,可以留言,多谢了~

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
出现这种情况通常是由于在Release模式下缺少依赖项或者编译参数设置不正确导致的。 首先,需要确保在编译Release版本之前,已经正确地配置了构建选项。在Qt Creator中,可使用"Build"菜单下的"Build Configuration"来选择"Release"模式,并确保项目配置文件(.pro文件)中有指定只支持Debug模式。 其次,如果在Release模式下出现缺少依赖项的错误,需要仔细检查是否在Release模式下正确设置了相关的编译参数,例如正确添加了链接库路径、添加了需要链接的库文件等。还需要检查编译选项是否正确设置,例如启用了所需的优化选项或禁用了调试相关选项。 此外,有时候在使用第三方库时,可能会遇到库文件仅针对Debug模式编译的情况。在这种情况下,需要找到相应的Release版本的库文件,并进行相关的配置,确保编译器能够正确链接到该库。 最后,如果上述方法仍然无法解决问题,可能需要深入调试代码来找出具体原因。可以使用Qt Creator提供的调试工具,例如断点、日志输出等,来逐步追踪代码执行过程,查找可能存在的问题。同时,也可以尝试在代码中添加一些调试信息,以便更好地理解代码运行时的状态和流程。 总之,解决Qt Release模式下无法运行问题通常需要仔细检查配置、编译参数和依赖项等方面的设置,并进行逐个排查可能存在的问题,以找到具体的解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值