导致程序崩溃删除的地方

1. 注册日志回调函数

qInstallMessageHandler(outputMessage);

解决方法

Android 环境下直接不重定向日志,经过后期调试应该是 dynamic_static 转换失败导致。

#ifndef __ANDROID__
    qInstallMessageHandler(outputMessage);
#endif

2. 单例上锁,新增了 Android 版本直接返回 0

由于 Android 下没有创建文件和写文件的权限,所以导致程序崩溃。

int UpdateManager::getProcDetect()
{
#ifdef __ANDROID__
    // Android 下由于权限问题无法创建文件,会失败(Android 下无需文件锁定)
    return 0;
#endif
    const char* procLock = "proclock_upcnc";
    int fd = -1;
#ifdef WIN32
    fd = 0;
#else
    do
    {
        fd = open(procLock, O_RDWR | O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
        if (fd < 0)
        {
            break;
        }
        struct flock fl;
        fl.l_type = F_WRLCK;
        fl.l_start = 0;
        fl.l_whence = SEEK_SET;
        fl.l_len = 0;

        int ret = fcntl(fd, F_SETLK, &fl);
        if (-1 == ret)
        {
            close(fd);
            fd = -1;
            break;
        }
    } while (false);
#endif // WIN32
    return fd;
}

解决方法

直接判断 Android 环境下返回 0

3. 获取模块指针失败,直接使用裸指针导致程序崩溃

CmdApp::CmdApp(QObject* parent, const QString& path, QQmlApplicationEngine* engine)
    : QObject(parent)
    , m_cfgApp(nullptr)
    , m_irsMgr(nullptr)
    , m_engine(engine)
    , m_rootPath(path)
    , m_translator(nullptr)
    , m_autoCheckUpdate(false)
    , m_exitUpdate(false)
    ,m_remoteUpdate(false)
{
    m_cfgApp = GetPluginInstance(IAppCfg, _MODNAME_APPCFG);
    m_irsMgr = GetPluginInstance(IRSMgr, _MODNAME_RSERVICES);

    QString lan = "中文";
    // 上面获取 m_cfgApp 失败,这里直接使用导致程序崩溃
    m_cfgApp->getCurrentLanguage(lan);
    // 启动默认加载语言
    switchLanguage(lan);

    // ...
}

通过追踪发现是由于下面语句中 dynamic_cast 转换失败导致。

#define GetPluginInstance(x, y) dynamic_cast<x *>(Singleton::GetModuleManager()->GetModule(y))

解决方法

将该问题解决后,执行 qInstallMessageHandler(outputMessage); 也不再崩溃。

  1. dynamic_cast 改为 static_cast后程序不再崩溃。
#define GetPluginInstance(x, y) static_cast<x *>(Singleton::GetModuleManager()->GetModule(y))

  • 36
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALONE_WORK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值