下面是AI排查后,生成的bug报告!
控制中心(dde-control-center)无法正常打开。启动后仅生成 1×1 像素的退化窗口,界面无法显示,进程卡死(阻塞在 futex_wait_queue),DBus 服务 org.deepin.dde.ControlCenter1 无法正常注册。
org.deepin.dde.ControlCenter1
systemctl --user start org.deepin.dde.control-center.service
xdotool search --name "控制中心"
控制中心启动时反复报以下 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:
src/dde-control-center/dccpluginloader.cpp
DccPluginLoader::updateType() 对 V1.1 版本插件(目录存在 qmldir 即判定为 V1.1)无条件同时设置 T_HasModule | T_HasMain:
DccPluginLoader::updateType()
qmldir
T_HasModule | T_HasMain
case T_V1_1: { if (QFile::exists(m_path + "/qmldir")) { m_type |= T_HasModule | T_HasMain; // 同时要求 和 Main ... } }
随后:
loadModule()
loadMain()
Main
CommonInfoMain.qml
CommonInfo.qml
CommonInfo
System.qml
SystemMain.qml
SystemMain
Device.qml
DeviceMain.qml
DeviceMain
其中 system/device 是纯 QML 插件(无 C++ 源码,dcc_install_plugin(NAME xxx) 无 TARGET),qmldir 中只声明 类型,未提供 Main。
dcc_install_plugin(NAME xxx)
DccPluginLoader::updateType() 对纯 QML 插件(只有根 .qml DccObject,无 Main.qml)错误地同时设置了 T_HasModule | T_HasMain,导致:
.qml
Main.qml
由于这些核心模块加载失败,控制中心主界面无法构建,最终退化为 1×1 窗口并卡死。
T_HasMain
addMainObject()
m_mainObj = m_soObj
DccPluginLoader
src/plugin-system/qml/System.qml
src/plugin-device/qml/Device.qml
src/plugin-commoninfo/qml/CommonInfoMain.qml
No replies yet
Featured Collection
Popular Events
下面是AI排查后,生成的bug报告!
DDE 控制中心无法打开 Bug 报告
基本信息
问题描述
控制中心(dde-control-center)无法正常打开。启动后仅生成 1×1 像素的退化窗口,界面无法显示,进程卡死(阻塞在 futex_wait_queue),DBus 服务
org.deepin.dde.ControlCenter1无法正常注册。复现步骤
systemctl --user start org.deepin.dde.control-center.servicexdotool search --name "控制中心"检查窗口错误日志
控制中心启动时反复报以下 QML 类型加载错误:
根本原因分析
通过对比官方源码(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:随后:
loadModule()加载类型(首字母大写)loadMain()加载Main类型(首字母大写)2. 三个插件定义不匹配
CommonInfoMain.qml(无CommonInfo.qml)CommonInfo(loadModule 需要)❌System.qml(无SystemMain.qml)SystemMain(loadMain 需要)❌Device.qml(无DeviceMain.qml)DeviceMain(loadMain 需要)❌其中 system/device 是纯 QML 插件(无 C++ 源码,
dcc_install_plugin(NAME xxx)无 TARGET),qmldir 中只声明类型,未提供Main。3. 结论
DccPluginLoader::updateType()对纯 QML 插件(只有根.qmlDccObject,无Main.qml)错误地同时设置了T_HasModule | T_HasMain,导致:loadModule()失败(缺CommonInfo)loadMain()失败(缺SystemMain/DeviceMain)由于这些核心模块加载失败,控制中心主界面无法构建,最终退化为 1×1 窗口并卡死。
受影响范围
建议修复方向
.qml(根 DccObject)而没有Main.qml时,不应设置T_HasMain,应走根模块加载路径。Main.qml(在源码 qml 目录中添加SystemMain.qml、DeviceMain.qml),为 commonInfo 补充CommonInfo.qml。loadMain()失败时优雅回退到根 DccObject(addMainObject()已有m_mainObj = m_soObjfallback,但纯 QML 插件无 .so,需要补充基于 module 的 fallback)。附:验证信息
DccPluginLoader源码:src/dde-control-center/dccpluginloader.cppsrc/plugin-system/qml/System.qml(仅根 DccObject)src/plugin-device/qml/Device.qml(仅根 DccObject)src/plugin-commoninfo/qml/CommonInfoMain.qml(仅 Main 页面)