【问题标题】:How to use lockdep feature in linux kernel for deadlock detection如何在 linux 内核中使用 lockdep 功能进行死锁检测
【发布时间】:2016-07-19 12:31:49
【问题描述】:

我有一个 linux 内核驱动程序和一个与之交互的用户应用程序。内核驱动程序中有一个死锁。我在 linux 内核中遇到了这个名为“lockdep”的功能。我能够配置它并重新编译我的内核(我确实在 /proc 中看到了 lockdep 文件夹)。但我不知道如何推断该工具的输出,或者如何使用该工具调试驱动程序。任何帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: c linux linux-kernel kernel deadlock


    【解决方案1】:

    要启用 lockdep 功能,请通过 menuconfig 编辑 .config 文件:

    make menuconfig
    

    并在黑客选项中启用以下功能:

     1. [*] Detect Hard and Soft Lockups
     2. [*] Detect Hung Tasks
     3. [*] RT Mutex debugging, deadlock detection
     4. -*- Spinlock and rw-lock debugging: basic checks
     5. -*- Mutex debugging: basic checks
     6. -*- Lock debugging: detect incorrect freeing of live locks
     7. [*] Lock debugging: prove locking correctness
     8. [*] Lock usage statistics
    

    重新编译内核:

    make ARCH=i386 -j4 //whatever your arch is
    

    现在,启动新的内核映像,在 /proc 下您应该会看到以下新文件夹:

    /proc/lockdep
    /proc/lockdep_chains
    /proc/lockdep_stat
    /proc/locks
    /proc/lock_stats
    

    现在,插入您认为导致错误的模块,并使用您的用户应用程序(或您用来运行驱动程序模块的任何方式)访问它。如果应用程序死锁(挂起),请执行以下操作:

    ps -aux | grep <app_name>
    

    您应该会看到您的应用处于 +D(不间断睡眠)状态,请执行以下操作:

    dmesg
    

    它打印的日志将包含导致死锁的函数/文件。

    就是这样!

    【讨论】:

    • 我已启用这些选项。但是dmesg没有报告死锁,我发现debug_locks在文件/proc/lockdep_stats中为零。我不知道原因。
    【解决方案2】:

    这没什么——lockdep 代码会在遇到可能死锁的锁定序列时简单地打印情况描述和内核日志的堆栈回溯。你只需要观察你的内核输出(通过dmesg 或串行线或任何你使用的东西)。

    lockdep 代码只调试锁,它不能警告你由其他原因引起的死锁。

    【讨论】:

    • 如果我在 dmesg 中没有看到任何死锁(由锁引起)相关消息,我可以断定我的代码中没有死锁吗? lockdep 是否检测到每个死锁?
    • @brokenfoot 不,不是。您必须练习导致锁定/解锁/睡眠/任何操作的所有代码路径。 lockdep 所做的是记录诸如“在锁 B 之前获取锁 A”之类的信息,如果遇到两种情况以相反的顺序获取两个锁,它就会抱怨。 (这里的“锁”指的是“锁类”,所以一个结构内的锁即使对于两个不同的对象也算作一个锁。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2011-10-18
    • 2013-12-19
    相关资源
    最近更新 更多