c - 如何使用 linux 内核中的 lockdep 功能进行死锁检测

标签 c linux linux-kernel kernel deadlock

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

最佳答案

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

make menuconfig

并在 Hacking Options 中启用以下功能:

 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(不间断 sleep )状态,请执行以下操作:

dmesg

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

就是这样!

关于c - 如何使用 linux 内核中的 lockdep 功能进行死锁检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20892822/

相关文章:

c - 为什么我不能在我的代码中关闭窗口句柄?

c - 如何从 CSV 文件读入数组?

c - 为什么我的逆波兰表示法输出错误的输出

c - 错误 : fallthrough inside functions

c - 经常使用的结构变量。为什么要保持领先地位?任何性能增益?

android - 如何从/dev/iio :deviceX?中读取LSM330的数据

c - 将内核模块与用户空间程序通信的最佳方式是什么?

python - 如何在 for 循环调用 Shell 脚本中转义 Python 名称错误?

c++ - 为什么在链接时不解析共享库的符号?

c++ - 调度程序是一个单独的进程还是仅在其他进程的上下文中运行