Skip to content

快捷键插件 XRecord 监视连接卡死,service-manager: dde 单线程 100% CPU #14213

Open

Description

@qw623577789

SUMMARY | 问题概要

deepin-service-group@dde.service(service-manager: dde)登录后常驻约 100% 单核 CPU,
journal 无报错,重启该 user service 可恢复。本次线程 TID 3907 自创建起占用 99.8%;
perf 空转栈为 QSocketNotifier::activated → ModifierKeyMonitor::handleEvents → XRecordProcessReplies → XPending,且 XPending 恒走 dpy->qlen > 0 的提前返回分支。
现场 RECORD data display 连接的接收队列固定 17792 B 不减少,服务端发送队列积压 213504 B。

SOFTWARE/OS VERSIONS | 软件/系统版本信息

Deepin 25 (crimson) / X11 / Xorg 2:21.1.16-1deepin6 / dde-services 1.0.39 / Qt 6.8.0

PRE-REQUIREMENT | 预置条件

在我的电脑上是一进入桌面就会复现

STEPS TO REPRODUCE | 复现步骤

运行附件 xrecord_wedge_repro.c(依赖 xdotool):先向 RECORD data display 的 Xlib 队列
注入一个事件(XPutBackEvent),再按插件现有逻辑调用 XRecordProcessReplies()。

OBSERVED RESULT | 观察到的结果

wedge set: XPending=1 fd_readable=1
old handler: XPending=1 fd_readable=1 server_callbacks=0

fd 永久可读、RECORD 回调不再触发,电平触发的 QSocketNotifier 持续激活 → 100% CPU。
EndOfData 同样读不到,状态停留在 Disabling,BeginCapture/EndCapture 无法恢复。

EXPECTED RESULT | 期望的结果

排空 Xlib 队列后应继续处理 RECORD 数据:

fixed handler: drained=1 fd_readable=0 callbacks=2 events=2

ADDITIONAL INFORMATION | 额外补充

根因与修复

src/plugin-qt/shortcut/src/backend/x11/modifierkeymonitor.cpp 的 handleEvents()
只调用 XRecordProcessReplies()(等价于 XPending()),而 libX11 的 XPending()
在 dpy->qlen > 0 时不读 socket;插件从不调用 XNextEvent,因此任意一个进入内部
事件队列的事件(例如连接完成 XKB 初始化前到达的 MappingNotify)都会导致永久卡死。

附件 dde-services-1.0.39-xrecord-xpending-spin.patch 在 handleEvents() 中增加
while (XPending(dpy) > 0) XNextEvent(...) 排空队列;已用真实 ModifierKeyMonitor
验证 RECORD 正常启动、按键事件正常上报、工作线程 CPU 为 0。

附件

复现程序与补丁
xrecord_wedge_repro.c

dde-services-1.0.39-xrecord-xpending-spin.patch

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions