Hung by a thread
4 months ago
- #deadlock
- #debugging
- #robotics
- 作者的机器人控制循环在客户端连接后16秒总会冻结,尽管没有崩溃或错误发生。
- 调试尝试包括更改线程处理和互斥锁类型,但问题每次都在第1,615次迭代时重现。
- 通过心跳线程发现循环是被阻塞而非运行缓慢或资源不足,表明存在死锁。
- GDB调试工具发现了意料之外的Rayon工作线程,最终追溯到用于遥测的Rerun可视化SDK。
- 死锁原因是作者在持有互斥锁时调用了Rerun的`recorder.log()`方法,这与Rayon的工作窃取线程机制存在已知冲突。
- 解决方案是缩短持有互斥锁的时间,以最小代码改动修复问题。
- 关键经验包括:GDB对死锁诊断的价值、警惕意外线程、理解依赖库的线程模型,以及心跳线程的实用性。
- 作者已向Rerun提交PR记录该问题,希望避免他人重蹈覆辙。