我在看内核锁调试的信息时,看到了一些内核编译参数相关的设置,开启这些信息可以帮助我们在测试环境中调试锁的竞争情况,可以详细的打印出来一些线程持有锁,一些线程争抢锁的信息。
以下是我的配置:【部分配置】
CONFIG_LOCK_DEBUGGING_SUPPORT=y
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
# CONFIG_DEBUG_RWSEMS is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
bash
CONFIG_LOCK_DEBUGGING_SUPPORT=y
CONFIG_PROVE_LOCKING
、CONFIG_LOCK_STAT
)才能发挥实际作用。bash
# CONFIG_PROVE_LOCKING is not set
bash
# CONFIG_LOCK_STAT is not set
/proc/lock_stat
可查看。bash
# CONFIG_DEBUG_RT_MUTEXES is not set # 实时互斥锁(RT Mutex)调试
# CONFIG_DEBUG_SPINLOCK is not set # 自旋锁调试
# CONFIG_DEBUG_MUTEXES is not set # 互斥锁调试
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set # 等待-死亡互斥锁调试
# CONFIG_DEBUG_RWSEMS is not set # 读写信号量调试
bash
# CONFIG_DEBUG_LOCK_ALLOC is not set
CONFIG_LOCK_STAT
未启用,无法通过/proc/lock_stat
获取锁的竞争统计信息,难以定位高竞争锁。
CONFIG_PROVE_LOCKING
未启用,内核无法主动检测锁顺序错误,可能遗留潜在的死锁隐患。
CONFIG_DEBUG_SPINLOCK
)未启用,无法捕获锁的非法操作(如错误释放)。
bash
CONFIG_PROVE_LOCKING=y # 启用锁依赖验证
CONFIG_LOCK_STAT=y # 启用锁竞争统计
CONFIG_DEBUG_LOCK_ALLOC=y # 启用锁分配追踪
make menuconfig
→ Kernel Hacking → Lock Debugging 启用。bash
CONFIG_DEBUG_SPINLOCK=y # 调试自旋锁(常见于多核竞争场景)
CONFIG_DEBUG_MUTEXES=y # 调试互斥锁(常见于睡眠锁问题)
启用上述选项后,结合工具进一步分析:
/proc/lock_stat
查看竞争热点。CONFIG_PROVE_LOCKING
会主动报告锁顺序问题。CONFIG_LOCK_STAT
,但精度较低)。CONFIG_PROVE_LOCKING
和CONFIG_LOCK_STAT
会引入性能损耗(尤其是高锁竞争场景),建议仅在测试环境启用。
CONFIG_LOCK_STAT
,但需评估对系统吞吐量的影响。