现象
个别机器上,程序一切正常、不崩溃、日志也无异常,但 EventBus 的 subscribers_ 里键会无端变少(连启动期注册的 ONLINE 都没了)。后果是某个事件悄悄不响应了。
怀疑是堆覆盖 ------ 方向是对的。
排查
先 grep 修改点:EventBus::Unsubscribe 全工程没有调用点,subscribers_ 只会在 Subscribe() 里增加。所以不是"被删了",而是内存被写坏。
再做二分注释:把 GetCard(0, m_cardInfo); 注释掉,正常打开后 subscribers_ 依然无端变少,说明两者并无直接关系。
根因
应用和库之间的 ABI 不一致。
- 两个 cpp 引用了不同目录下的同名头文件;
- 两个头文件里的结构体类型不一致;
GetCard在拷贝时多拷贝了数据。
由此产生的连锁反应:
越界 16 字节 → 写坏相邻 chunk 的 size 记账
→ 之后某次 malloc 按错误 size 切分
→ 那块内存被随手写,map 节点烂掉
→ find() 找不到键 = "订阅变少"