我有一个与之交互的Linux内核驱动程序和用户应用程序。该内核驱动程序中存在死锁问题。我在Linux内核中找到了一个名为“lockdep”的特性,并成功进行了配置和重新编译内核(并且我确实在/ proc中看到了lockdep文件夹)。但我不知道如何推断此工具的输出,也不知道如何使用此工具来调试驱动程序。任何帮助将不胜感激。 谢谢!
要启用lockdep功能,请通过menuconfig编辑.config文件:
make menuconfig
并在“Hacking选项”中启用以下内容:
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
它打印的日志将包括导致死锁的函数/文件。
就是这样!
这并不复杂 - 当锁定序列潜在死锁时,lockdep代码将简单地打印情况描述和堆栈回溯到内核日志中。您只需要观察内核输出(通过dmesg
或串行线路或您使用的任何其他方式)。
lockdep代码仅调试锁定,无法警告您由其他原因引起的死锁。
debug_locks
为零。我不知道原因。 - user1651758