Linux内核追踪[3.14] 用户态死锁检测--UserMode lockdep

    想必大家都用过内核态的lockdep,它有死锁预测的功能。能够在运行态动态地去识别一些潜在的、发生概率较小的(也许一辈子都很难碰到)死锁风险。目前有人把它移植到了用户,并加入到内核主线($root/tools/lib/lockdep)

    笔者这里想讲的是它的“移植”方法非常得巧妙,请看看$root/tools/lib/lockdep/lockdep.c的主体函数:

  1. #include <linux/lockdep.h>
  2. #include "../../../kernel/locking/lockdep.c"
    你没看错,它真的只有2行,从它的路径上看,它是直接借用了内核的lockdep.c。也就是说以后内核的lockdep.c修复了bugfix或实现新的功能,用户态工具也可以直接受益,而几乎不用修改一行代码(下文看到,其实新的桩是需要打的)。
    原来作者的思路不是移植,而是完全借用内核的算法,因为lockdep是相对算法化的。而依赖的内核函数,作者都全部做了一些假的打桩,让lockdep主体功能以为自己是在内核环境运行。虽然文件不少,但是基本上都是通过预编译把它们给去掉。


  1. path: root/tools/lib/lockdep/uinclude/linux
  2. Mode    Name    Size    
  3. -rw-r--r--    bitops.h    19    logstatsplain
  4. -rw-r--r--    compiler.h    146    logstatsplain
  5. -rw-r--r--    debug_locks.h    221    logstatsplain
  6. -rw-r--r--    delay.h    19    logstatsplain
  7. -rw-r--r--    export.h    139    logstatsplain
  8. -rw-r--r--    ftrace.h    19    logstatsplain
  9. -rw-r--r--    gfp.h    19    logstatsplain
  10. -rw-r--r--    hardirq.h    241    logstatsplain
  11. -rw-r--r--    hash.h    41    logstatsplain
  12. -rw-r--r--    interrupt.h    19    logstatsplain
  13. -rw-r--r--    irqflags.h    1347    logstatsplain
  14. -rw-r--r--    kallsyms.h    551    logstatsplain
  15. -rw-r--r--    kern_levels.h    915    logstatsplain
  16. -rw-r--r--    kernel.h    1076    logstatsplain
  17. -rw-r--r--    kmemcheck.h    168    logstatsplain
  18. -rw-r--r--    linkage.h    19    logstatsplain
  19. -rw-r--r--    list.h    41    logstatsplain
  20. -rw-r--r--    lockdep.h    1010    logstatsplain
  21. -rw-r--r--    module.h    120    logstatsplain
  22. -rw-r--r--    mutex.h    19    logstatsplain
  23. -rw-r--r--    poison.h    43    logstatsplain
  24. -rw-r--r--    prefetch.h    149    logstatsplain
  25. -rw-r--r--    proc_fs.h    19    logstatsplain
  26. -rw-r--r--    rbtree.h    43    logstatsplain
  27. -rw-r--r--    rbtree_augmented.h    77    logstatsplain
  28. -rw-r--r--    rcu.h    277    logstatsplain
  29. -rw-r--r--    seq_file.h    19    logstatsplain
  30. -rw-r--r--    spinlock.h    484    logstatsplain
  31. -rw-r--r--    stacktrace.h    639    logstatsplain
  32. -rw-r--r--    stringify.h    161    logstatsplain
  33. -rw-r--r--    types.h    966    logstatsplain

  1. # define trace_hardirq_context(p)    0
  2. # define trace_softirq_context(p)    0
  3. # define trace_hardirqs_enabled(p)    0
  4. # define trace_softirqs_enabled(p)    0
  5. # define trace_hardirq_enter()        do { } while (0)
  6. # define trace_hardirq_exit()        do { } while (0)
  7. # define lockdep_softirq_enter()    do { } while (0)
  8. # define lockdep_softirq_exit()        do { } while (0)
  9. # define INIT_TRACE_IRQFLAGS

  10. # define stop_critical_timings() do { } while (0)
  11. # define start_critical_timings() do { } while (0)

  12. #define raw_local_irq_disable() do { } while (0)
  13. #define raw_local_irq_enable() do { } while (0)
  14. #define raw_local_irq_save(flags) ((flags) = 0)
  15. #define raw_local_irq_restore(flags) do { } while (0)
  16. #define raw_local_save_flags(flags) ((flags) = 0)
  17. #define raw_irqs_disabled_flags(flags) do { } while (0)
  18. #define raw_irqs_disabled() 0
  19. #define raw_safe_halt()
    用户态lockdep是一个lib库,已经可以用来检测用户态的pthread_mutex以及pthread_rwlock 2种锁,是通过LD_PRELOAD的方式来截获glibc的调用。从代码量来看,这个文件其实才是整个lib的主要代码,后续可以通过修改这个文件扩展实现监控其它更多的锁。(参考$root/tools/lib/lockdep/preload.c)。
    除此之外,库还可以脱离内核代码主线进行编译,具体更多信息,请参考http://lwn.net/Articles/536363/。
    你还在犹豫么?赶紧去试试吧。:) 

(备注:文中参考路径root=https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值