pthreads 的 lockdep

sage

Linux 有一个很棒的工具,名为 lockdep,用于识别锁定依赖问题。  不用等到实际发生死锁(这可能非常困难,尤其是在它是一个对时机敏感的事情时),lockdep 会跟踪在获取任何新锁时已经持有的哪些锁,并确保依赖关系图中没有循环。

有一天,我在通过 gdb 反向追踪解码 OSD 守护程序中的死锁错误时,突然想到如果对使用 pthreads 的用户空间应用程序有一个类似的工具会很好。  快速搜索没有找到任何有希望的结果,所以我组装了一个简单的依赖检查器,并将其挂接到 Ceph 现有的 Mutex 和 RWLock 包装器。它实现起来出奇地快,而且有效!  我有点失望只找到了两个真正的依赖错误。  但该项目也促使我禁用了递归锁定(因为我的 lockdep 无法处理它),而这又发现了另外六个懒惰的实例。

我的 lockdep 代码 (C++) 在 这里这里,以及对 mutex 包装器的挂钩。