[Feedback on issues] 控制中心(dde-control-center)间歇无法正常打开,期待修复!
Tofloor
poster avatar
181******81
deepin
4 hours ago
Author

下面是AI排查后,生成的bug报告!

DDE 控制中心无法打开 Bug 报告

基本信息

项目
系统 Deepin 25
架构 x86_64
软件包 dde-control-center 6.1.101
Qt 版本 Qt6 (libqt6qml6 6.8.0+dfsg-0deepin13)
DTK 版本 libdtk6widget 6.7.47
报告日期 2026-08-27

问题描述

控制中心(dde-control-center)无法正常打开。启动后仅生成 1×1 像素的退化窗口,界面无法显示,进程卡死(阻塞在 futex_wait_queue),DBus 服务 org.deepin.dde.ControlCenter1 无法正常注册。

复现步骤

  1. 启动控制中心:systemctl --user start org.deepin.dde.control-center.service
  2. 观察日志或通过 xdotool search --name "控制中心" 检查窗口
  3. 窗口为 1×1,界面无法显示

错误日志

控制中心启动时反复报以下 QML 类型加载错误:

"commonInfo" : Module "commonInfo" contains no type named "CommonInfo"
"system"     : Module "system" contains no type named "SystemMain"
"device"     : Module "device" contains no type named "DeviceMain"
"The plugin isn't main DccObject"

根本原因分析

通过对比官方源码(https://github.com/linuxdeepin/dde-control-center)与安装包内容,确认是 DccPluginLoader 插件加载逻辑与纯 QML 插件定义不匹配 的 Bug:

1. 插件加载逻辑(src/dde-control-center/dccpluginloader.cpp

DccPluginLoader::updateType() 对 V1.1 版本插件(目录存在 qmldir 即判定为 V1.1)无条件同时设置 T_HasModule | T_HasMain

case T_V1_1: {
    if (QFile::exists(m_path + "/qmldir")) {
        m_type |= T_HasModule | T_HasMain;  // 同时要求  和 Main
        ...
    }
}

随后:

  • loadModule() 加载 类型(首字母大写)
  • loadMain() 加载 Main 类型(首字母大写)

2. 三个插件定义不匹配

插件 源码 qml 目录内容 主程序需要的类型
commonInfo CommonInfoMain.qml(无 CommonInfo.qml CommonInfo(loadModule 需要)❌
system System.qml(无 SystemMain.qml SystemMain(loadMain 需要)❌
device Device.qml(无 DeviceMain.qml DeviceMain(loadMain 需要)❌

其中 system/device 是纯 QML 插件(无 C++ 源码,dcc_install_plugin(NAME xxx) 无 TARGET),qmldir 中只声明 类型,未提供 Main

3. 结论

DccPluginLoader::updateType() 对纯 QML 插件(只有根 .qml DccObject,无 Main.qml)错误地同时设置了 T_HasModule | T_HasMain,导致:

  • commonInfo 的 loadModule() 失败(缺 CommonInfo
  • system/device 的 loadMain() 失败(缺 SystemMain/DeviceMain

由于这些核心模块加载失败,控制中心主界面无法构建,最终退化为 1×1 窗口并卡死。

受影响范围

  • 控制中心(个性化、网络、系统设置等)完全无法使用
  • 壁纸设置、显示设置等功能无法通过 GUI 访问

建议修复方向

  1. DccPluginLoader 应正确识别纯 QML 插件:当插件 qmldir 中只有 .qml(根 DccObject)而没有 Main.qml 时,不应设置 T_HasMain,应走根模块加载路径。
  2. 为 system/device 插件补充 Main.qml(在源码 qml 目录中添加 SystemMain.qmlDeviceMain.qml),为 commonInfo 补充 CommonInfo.qml
  3. loadMain() 失败时优雅回退到根 DccObject(addMainObject() 已有 m_mainObj = m_soObj fallback,但纯 QML 插件无 .so,需要补充基于 module 的 fallback)。

附:验证信息

  • 官方源码:https://github.com/linuxdeepin/dde-control-center
  • DccPluginLoader 源码:src/dde-control-center/dccpluginloader.cpp
  • 相关插件源码:
    • src/plugin-system/qml/System.qml(仅根 DccObject)
    • src/plugin-device/qml/Device.qml(仅根 DccObject)
    • src/plugin-commoninfo/qml/CommonInfoMain.qml(仅 Main 页面)
Reply Favorite View the author
All Replies

No replies yet