HarmonyOS鸿蒙Next IDE下运行Qt C++主程序崩溃

HarmonyOS鸿蒙Next IDE下运行Qt C++主程序崩溃

在main函数中在主窗口显示之前,先创建一个Dialog dTmp; dTmp.show(); dtmp.exec(); 然后再dTmp关闭后再调用主窗口QMainWindow的show()方法时程序崩溃。如果没有创建QDialog打开关闭过程,直接窗口主窗口并显示没有任何问题。如果在dtmp.exec();之前先调用主窗口的显示,在关闭弹出后程序也正常。以下是部分错误日志:

Device info:HUAWEI MateBook Pro
Build info:HAD-W24 5.1.0.320(SP10C00E305R10P1log)
Fingerprint:adfa5f8e7b348a3cbba6c9f405ded011acaac39118edc7e19ee9196b1f86da5a
Module name:com.eastmoney.choice
Version:9.2.0.0
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Timestamp:2025-08-02 13:57:38.180
Pid:59287
Uid:20020146
Process name:com.eastmoney.choice
Process life time:18446744073709549584s
Reason:Signal:SIGABRT(SI_TKILL)@0x01317bb20000e797 from:59287:20020146
LastFatalMessage:[(native_node_api.cpp:76)(napi_fatal_error)] FATAL ERROR: Error::New napi_get_last_error_info

Fault thread info:
Tid:59287, Name:astmoney.choice

#00 pc 000000000019f100 /system/lib/ld-musl-aarch64.so.1(raise+228)(0afe599f71bfbe812637821352708631)
#01 pc 000000000014bc9c /system/lib/ld-musl-aarch64.so.1(abort+20)(0afe599f71bfbe812637821352708631)
#02 pc 0000000000070308 /system/lib64/platformsdk/libace_napi.z.so(napi_fatal_error+136)(5e6ea0179e3c03c43a3a763c08368d60)
#03 pc 0000000000092140 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#04 pc 0000000000091f8c /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#05 pc 00000000000e37f4 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#06 pc 00000000000e1210 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#07 pc 00000000000e2e60 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#08 pc 00000000000ec3c8 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#09 pc 000000000051a934 /data/storage/el1/bundle/libs/arm64/libQt5Core.so
#10 pc 000000000007f9cc /system/lib64/platformsdk/libruntime.z.so(30c40cda47f1319ca0f7a79f798fe8b7)
#11 pc 000000000001ddb4 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::EventHandler::DistributeEvent(std::_h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void ()(OHOS::AppExecFwk::InnerEvent)> const&)+1140)(f694376644c063ad9d1c7f69e037817e)
#12 pc 0000000000031530 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::ExecuteEventHandler(std::h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void ()(OHOS::AppExecFwk::InnerEvent)>&)+348)(f694376644c063ad9d1c7f69e037817e)
#13 pc 0000000000030de4 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::Run()+916)(f694376644c063ad9d1c7f69e037817e)
#14 pc 00000000000341a0 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::EventRunner::Run()+528)(f694376644c063ad9d1c7f69e037817e)
#15 pc 00000000000b8800 /system/lib64/platformsdk/libappkit_native.z.so(OHOS::AppExecFwk::MainThread::Start()+504)(1ccc6f8307656d21ab3582da714d92cb)
#16 pc 0000000000004e7c /system/lib64/appspawn/appspawn/libappspawn_ace.z.so(RunChildProcessor(AppSpawnContent*, AppSpawnClient*)+568)(fc81d0afffff7efc1248f59271d12ea9)
#17 pc 000000000000ceac /system/bin/appspawn(AppSpawnChild+496)(687571cad92de48b27b3179433bd9b6b)
#18 pc 0000000000017360 /system/bin/appspawn(ProcessSpawnReqMsg+3408)(687571cad92de48b27b3179433bd9b6b)
#19 pc 0000000000014d60 /system/bin/appspawn(OnReceiveRequest+848)(687571cad92de48b27b3179433bd9b6b)
#20 pc 0000000000016ea4 /system/lib64/chipset-pub-sdk/libbegetutil.z.so(HandleRecvMsg
+344)(4e87c6d8a4a3113a5f10d66421690983)
#21 pc 0000000000016978 /system/lib64/chipset-pub-sdk/libbegetutil.z.so(HandleStreamEvent
+192)(4e87c6d8a4a3113a5f10d66421690983)
#22 pc 000000000001403c /system/lib64/chipset-pub-sdk/libbegetutil.z.so(ProcessEvent+88)(4e87c6d8a4a3113a5f10d66421690983)
#23 pc 0000000000013bf0 /system/lib64/chipset-pub-sdk/libbegetutil.z.so(RunLoop
+364)(4e87c6d8a4a3113a5f10d66421690983)
#24 pc 0000000000012888 /system/bin/appspawn(AppSpawnRun+212)(687571cad92de48b27b3179433bd9b6b)
#25 pc 000000000001016c /system/bin/appspawn(main+728)(687571cad92de48b27b3179433bd9b6b)
#26 pc 00000000000a1060 /system/lib/ld-musl-aarch64.so.1(libc_start_main_stage2+80)(0afe599f71bfbe812637821352708631)

========SubmitterStacktrace========

#00 pc 0000000000012a3c /system/lib64/platformsdk/libuv.so(uv_queue_work+236)(fe1b1b19ebad0e80032ab358dabb50ed)
#01 pc ffffff811b29a370 /system/lib64/platformsdk/libuv.so(fe1b1b19ebad0e80032ab358dabb50ed)
#02 pc 00000000000e2afc /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#03 pc 00000000000ceeb0 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so
#04 pc 00000000004e9c6c /data/storage/el1/bundle/libs/arm64/libQt5Core.so(QObject::event(QEvent*)+696)
#05 pc 000000000017deec /data/storage/el1/bundle/libs/arm64/libQt5Gui.so(QGuiApplication::event(QEvent*)+1212)
#06 pc 0000000000202d04 /data/storage/el1/bundle/libs/arm64/libQt5Widgets.so(QApplication::event(QEvent*)+1636)
#07 pc 0000000000204460 /data/storage/el1/bundle/libs/arm64/libQt5Widgets.so(QApplicationPrivate::notify_helper(QObject*, QEvent*)+296)
#08 pc 00000000002056ec /data/storage/el1/bundle/libs/arm64/libQt5Widgets.so(QApplication::notify(QObject*, QEvent*)+520)
#09 pc 00000000000494d4 /data/storage/el1/bundle/libs/arm64/libswcapp.so(CEMApplication::notify(QObject*, QEvent*)+36)(98249892136ffe2db055f5103348c32d6a8590b8)
#10 pc 00000000004c0364 /data/storage/el1/bundle/libs/arm64/libQt5Core.so(QCoreApplication::notifyInternal2(QObject*, QEvent*)+200)
#11 pc 00000000004c1360 /data/storage/el1/bundle/libs/arm64/libQt5Core.so(QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*)+460)
#12 pc 0000000000511844 /data/storage/el1/bundle/libs/arm64/libQt5Core.so(QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)+64)
#13 pc 00000000000a13d4 /data/storage/el1/bundle/libs/arm64/libplugins_platforms_qopenharmony.so

Registers:
x0:0000000000000000 x1:0000007ecd657790 x2:0000000000000000 x3:0000000000000008
x4:0000016a6dca5388 x5:0000000000000078 x6:0000000000008080 x7:feff686067666d60
x8:0000000000000087 x9:0000005a0ee51840 x10:6b6b000000000000 x11:00000000003bea23
x12:0000000000000000 x13:0000000000000001 x14:0000000000000001 x15:8ef5b35c252085d5
x16:0000005a9b77cc58 x17:0000005a0e6e4c88 x18:0000000000000005 x19:0000000000000000
x20:0000005a0e9a6000 x21:0000000017a06e5e x22:0000000000000002 x23:0000007ecd657963
x24:0000005bb2927000 x25:0000005be86c6600 x26:0000000000000018 x27:0000005671839354
x28:0000005aa70c9308 x29:0000007ecd657810
lr:0000005a0e6e4ca0 sp:0000007ecd657790 pc:0000005a0e738100

Other thread info:
Tid:59382, Name:OS_IPC_0_59382
#00 pc 0000000000178608 /system/lib/ld-musl-aarch64.so.1(ioctl+176)(0afe599f71bfbe812637821352708631)
#01 pc 0000000000007b80 /system/lib64/chipset-pub-sdk/libipc_common.z.so(OHOS::BinderConnector::WriteBinder(unsigned long, void*)+108)(ad34c26775c8d7331f9cad0ba27025ee)
#02 pc 0000000000061d8c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::TransactWithDriver(bool)+300)(fc74492d6a7a618dbbff8b9a5a604372)
#03 pc 000000000006213c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::StartWorkLoop()+76)(fc74492d6a7a618dbbff8b9a5a604372)
#04 pc 00000000000645e0 /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::JoinThread(bool)+84)(fc74492d6a7a618dbbff8b9a5a604372)
#05 pc 000000000005a03c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::IPCWorkThread::ThreadHandler(void*)+908)(fc74492d6a7a618dbbff8b9a5a604372)
#06 pc 00000000001c0540 /system/lib/ld-musl-aarch64.so.1(start+236)(0afe599f71bfbe812637821352708631)

Tid:59383, Name:OS_IPC_1_59383
#00 pc 0000000000178608 /system/lib/ld-musl-aarch64.so.1(ioctl+176)(0afe599f71bfbe812637821352708631)
#01 pc 0000000000007b80 /system/lib64/chipset-pub-sdk/libipc_common.z.so(OHOS::BinderConnector::WriteBinder(unsigned long, void*)+108)(ad34c26775c8d7331f9cad0ba27025ee)
#02 pc 0000000000061d8c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::TransactWithDriver(bool)+300)(fc74492d6a7a618dbbff8b9a5a604372)
#03 pc 000000000006213c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::StartWorkLoop()+76)(fc74492d6a7a618dbbff8b9a5a604372)
#04 pc 00000000000645e0 /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::JoinThread(bool)+84)(fc74492d6a7a618dbbff8b9a5a604372)
#05 pc 000000000005a03c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::IPCWorkThread::ThreadHandler(void*)+908)(fc74492d6a7a618dbbff8b9a5a604372)
#06 pc 00000000001c0540 /system/lib/ld-musl-aarch64.so.1(start+236)(0afe599f71bfbe812637821352708631)

Tid:59384, Name:OS_DfxWatchdog
#00 pc 00000000001bbccc /system/lib/ld-musl-aarch64.so.1(__timedwait_cp+192)(0afe599f71bfbe812637821352708631)
#01 pc 00000000001bde20 /system/lib/ld-musl-aarch64.so.1(__pthread_cond_timedwait+188)(0afe599f71bfbe812637821352708631)
#02 pc 00000000000c11c0 /system/lib64/libc++.so(std::__h::condition_variable::__do_timed_wait(std::__h::unique_lock<std::__h::mutex>&, std::__h::chrono::time_point<std::__h::chrono::system_clock, std::__h::chrono::duration<long long, std::__h::ratio<1l, 1000000000l>>>)+108)(7817a009937816a1f11f1e7673c1e796f9d24b58)
#03 pc 0000000000013598 /system/lib64/chipset-pub-sdk/libhicollie.z.so(OHOS::HiviewDFX::WatchdogInner::Start()+552)(781e0f0442670156c4a4f61ba673274b)
#04 pc 000000000001b8a0 /system/lib64/chipset-pub-sdk/libhicollie.z.so(void* std::__h::__thread_proxy[abi:v15004]<std::__h::tuple<std::__h::unique_ptr<std::__h::__thread_struct, std::__h::default_delete<std::__h::__thread_struct>>, bool (OHOS::HiviewDFX::WatchdogInner::)(), OHOS::HiviewDFX::WatchdogInner>>(void*)+64)(781e0f0442670156c4a4f61ba673274b)
#05 pc 00000000001c0540 /system/lib/ld-musl-aarch64.so.1(start+236)(0afe599f71bfbe812637821352708631)

Tid:59385, Name:OS_IPC_2_59385
#00 pc 0000000000178608 /system/lib/ld-musl-aarch64.so.1(ioctl+176)(0afe599f71bfbe812637821352708631)
#01 pc 0000000000007b80 /system/lib64/chipset-pub-sdk/libipc_common.z.so(OHOS::BinderConnector::WriteBinder(unsigned long, void*)+108)(ad34c26775c8d7331f9cad0ba27025ee)
#02 pc 0000000000061d8c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::TransactWithDriver(bool)+300)(fc74492d6a7a618dbbff8b9a5a604372)
#03 pc 000000000006213c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::StartWorkLoop()+76)(fc74492d6a7a618dbbff8b9a5a604372)
#04 pc 00000000000645e0 /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::JoinThread(bool)+84)(fc74492d6a7a618dbbff8b9a5a604372)
#05 pc 000000000005a03c /system/lib64/chipset-pub-sdk/libipc_single.z.so(OHOS::IPCWorkThread::ThreadHandler(void*)+908)(fc74492d6a7a618dbbff8b9a5a604372)


更多关于HarmonyOS鸿蒙Next IDE下运行Qt C++主程序崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

根据错误日志和现象,程序崩溃发生在鸿蒙IDE下运行Qt C++主程序时,涉及弹窗与主窗口的显示顺序和事件循环冲突。楼主试一下以下办法优化—

避免在弹窗关闭后直接启动主窗口,改为在主窗口的事件循环中触发弹窗,确保主事件循环已初始化,避免资源竞争:

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

    QApplication app(argc, argv);

    QMainWindow mainWindow;

    // 在主窗口构造完成后触发弹窗
    QTimer::singleShot(0, [&]() {
        Dialog dTmp;
        dTmp.show();
        dTmp.exec(); // 弹窗关闭后继续执行主窗口显示
        mainWindow.show();
    });

    return app.exec();
}

将exec()替换为show(),避免阻塞主事件循环:

Dialog *dTmp = new Dialog();
dTmp->setAttribute(Qt::WA_DeleteOnClose); // 确保弹窗关闭时自动析构
dTmp->show();

QObject::connect(dTmp, &Dialog::finished, [&](int result) {
    mainWindow.show();
});

更多关于HarmonyOS鸿蒙Next IDE下运行Qt C++主程序崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主这个崩溃是因为 libplugins_platforms_qopenharmony.so 中 NAPI 状态恢复失败,常 QDialog.exec() 使用顺序不当, QDialog.exec() 在主窗口之前执行, 窗口还没有初始化完成导致的

在HarmonyOS Next IDE中运行Qt C++主程序崩溃可能涉及以下技术原因:

  1. Qt框架与鸿蒙系统的兼容性问题,特别是Qt版本未适配OpenHarmony内核特性

  2. 鸿蒙Next的HAP包格式与Qt应用程序打包规范存在冲突

  3. NDK工具链版本不匹配,导致Qt库与鸿蒙系统ABI不兼容

  4. 鸿蒙特有的安全机制(如权限管理)拦截了Qt应用的系统调用

  5. 图形渲染引擎差异,Qt的渲染管线与鸿蒙的图形子系统存在兼容性问题

需要检查的具体日志包括:

  • 崩溃时的Hiview日志
  • Qt应用输出的OHOS日志
  • 内存映射错误信息

从错误日志来看,这是一个典型的Qt窗口管理问题导致的崩溃。具体分析如下:

  1. 崩溃发生在napi_fatal_error,表明是Native API调用出现了严重错误。

  2. 调用栈显示问题出现在Qt窗口管理流程中,特别是在处理QDialog和QMainWindow的显示顺序时。

  3. 关键错误点:

    • 先创建并显示QDialog(dTmp.show()+dtmp.exec())。
    • 然后关闭QDialog。
    • 再显示QMainWindow时崩溃。

建议检查以下方面:

  1. 确保所有窗口对象都正确创建在堆上(使用new),而不是栈上。
  2. 检查QDialog和QMainWindow的生命周期管理。
  3. 确认在exec()调用后是否正确处理了事件循环。

典型解决方案:

  1. 将QDialog创建改为指针方式:

    QDialog *dTmp = new QDialog;
    dTmp->show();
    dTmp->exec();
    // 主窗口显示
    
  2. 或者调整窗口显示顺序,先创建主窗口再显示对话框。

  3. 检查是否有跨线程UI操作。

这个问题主要是由于Qt窗口生命周期管理和HarmonyOS的Native API交互导致的异常,需要特别注意窗口对象的创建和销毁顺序。

回到顶部