web-dev-qa-db-ja.com

デッドロック検出のためにLinuxカーネルでlockdep機能を使用する方法

Linuxカーネルドライバーとそれと対話するユーザーアプリがあります。カーネルドライバにはデッドロックがあります。 " lockdep "というLinuxカーネルでこの機能に出くわしました。私はそれを構成してカーネルを再コンパイルすることができました(そして/ procにlockdepフォルダーがあります)。しかし、このツールの出力を推測する方法や、このツールを使用してドライバーをデバッグする方法がわかりません。どんな助けでも大歓迎です。ありがとう!

13
brokenfoot

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

印刷するログには、デッドロックの原因となっている関数/ファイルが含まれます。

それでおしまい!

22
brokenfoot

それほど多くはありません。lockdepコードは、デッドロックの可能性があるロックシーケンスに遭遇したときに、状況の説明とスタックバックトレースをカーネルログに出力するだけです。カーネル出力を監視する必要があります(dmesgまたはシリアルラインまたは使用するものを介して)。

Lockdepコードはロックのみをデバッグし、他の何かから発生するデッドロックについて警告することはできません。

0
Andreas Bombe