Skip to content

[Bug] backend 无法就绪:broker 恒定占满一核约60秒、自身日志0字节、client 持续 broker unavailable (-2) #140

Description

@maitaihai

[Bug] backend 始终无法就绪:broker 恒定占用CPU约60秒、自身日志0字节、客户端持续 broker unavailable (-2)

环境

项目
WeChatDataAnalysis v2.3.0(v2.2.1 / v2.1.5 表现完全一致)
native core buildId wcdb-prod-20260829-weixin-actions-1,有效期至 2026-10-13(未过期)
微信客户端 Weixin 4.1.12.55(单实例,已登录并正常运行)
操作系统 Windows 10 Pro 22H2 (10.0.19045),系统代码页 936
CPU / 内存 Intel i7-7500U(2核4线程 2.7GHz) / 16GB
TPM TPM 2.0 存在,状态 OK

现象

启动失败:Backend process exited before becoming ready: http://127.0.0.1:10392/api/health

backend-stdio.log

NativeCoreUnavailableError: wechatdb native get status failed: broker unavailable (-2)
NativeCoreUnavailableError: wechatdb native broker did not become ready in time.
  Broker log: ...\logs\native-core-broker.log
  The current broker run wrote no diagnostic output.

logs\native-core-broker.log 始终 0 字节

broker 进程实测行为(多次重复,结果高度一致)

app 实际启动 broker 的命令行(进程监控捕获):

wechatdb_broker.exe --endpoint \\.\pipe\LifeArchiveProject.WeChatDB.Native.<pid>.<hex>
                    --parent-pid <pid>
                    --device-key-name LifeArchiveProject.WeChatDB.Native.Device.v1
                    --disable-database
观测项 结果
命名管道 启动后 1 秒内创建成功
CPU 恒定约 87% 单核,线性累积,无收敛迹象
文件 I/O ReadTransferCount 全程 0.0 MB
网络 全程 0 条对外TCP连接、0 条新DNS查询
工作集 恒定 约 23MB
已加载模块 在 CPU=2.5s / 16s / 48s 三个时间点完全相同(含 bcrypt/ncrypt/crypt32/cryptnet/wintrust/ntasn1/dpapi/tbs.dll/PCPKsp.dll
句柄数 / 线程数 恒定 277~279 / 9(末期降至6)
自身日志 0 字节,从未写入
存活时长 每次约 60~62 秒,与完成的工作量无关
客户端侧 全程 get_status 返回 broker unavailable (-2)

关键观察:将 broker 进程优先级提升到 High 后,相同时间内多完成约 15% 的 CPU 工作量,但仍在完全相同的墙钟时间(~62秒)结束。加上模块/句柄/线程数在整个过程中毫无变化,这更像固定超时下的空转循环,而非"工作量太大没算完"。

另:单独手工启动 broker(相同参数、--parent-pid 指向自建进程)并等待 10 分钟——进程 CPU 全程 0%、不退出、日志仍为 0 字节。说明 CPU 消耗发生在有客户端接入之后。

已实测排除的可能

假设 验证方式 结论
程序版本 v2.3.0 / v2.2.1 / v2.1.5 全部实测 表现完全一致
管理员权限 提权启动 完全一致
杀毒软件(火绒) 加信任区 + 完全关闭防护,两种状态 CPU曲线与默认状态几乎重合
非ASCII路径(#117 安装/数据/output/微信数据目录、用户名 全部纯ASCII
代码签名 用随附 windows-private-pki.ps1 -Action Verify 验证 通过(signer/root SHA256 与 build.json 一致;0x800B0109 为设计预期)
TPM 缺失或过慢 TPM 2.0 存在;Platform Crypto Provider 建 RSA-2048 持久化密钥仅 0.54s 健康
设备密钥损坏 LifeArchiveProject.WeChatDB.Native.Device.v1 已存在于 TPM;打开 0.39s,ECDSA 签名 0.13~0.65s,验签通过,公钥可导出 健康
联网授权 / CRL 吊销检查 全程零TCP连接、零DNS;二进制内除微软PKI时间戳外无外部域名 无网络行为
磁盘扫描 / 数据量 I/O 计数全程 0(数据目录约 10GB / 12万文件) 无关
CPU 性能不足 提升优先级后多干 15% 活,仍同一时刻结束 非算力问题
端口冲突 日志 port 10392 remains available 无冲突

问题

  1. broker unavailable (-2) 的确切含义是什么?是握手鉴权失败、能力协商失败,还是 broker 侧主动拒绝?
  2. broker 在什么情况下会完全不写自己的日志(连启动行都没有)?能否提供强制开启 broker 侧日志的环境变量或命令行开关? 这是目前最需要的东西——只要日志能出来,问题基本可以立刻定位。
  3. 实际启动命令中不含 --trust-key,而 broker 的 usage 将其列为必填。这在 --disable-database 模式下是预期行为吗?还是说客户端本应先生成 trust key、而该步骤在本机静默失败了?(数据目录中未发现任何 trust key 文件)
  4. 客户端 native_core_broker.py::_wait_until_ready 的超时是否可配置?
  5. broker 在拿到客户端连接后、持续占满一个CPU核心约60秒的这段处理,具体是在做什么?是否有已知的会导致该循环无法收敛的环境条件?

如需更多数据(完整日志、进程/模块/句柄快照、ETW采样等)我可以随时提供。

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