Linuxカーネルドライバーとそれと対話するユーザーアプリがあります。カーネルドライバにはデッドロックがあります。 " lockdep "というLinuxカーネルでこの機能に出くわしました。私はそれを構成してカーネルを再コンパイルすることができました(そして/ procにlockdepフォルダーがあります)。しかし、このツールの出力を推測する方法や、このツールを使用してドライバーをデバッグする方法がわかりません。どんな助けでも大歓迎です。ありがとう!
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
印刷するログには、デッドロックの原因となっている関数/ファイルが含まれます。
それでおしまい!
それほど多くはありません。lockdepコードは、デッドロックの可能性があるロックシーケンスに遭遇したときに、状況の説明とスタックバックトレースをカーネルログに出力するだけです。カーネル出力を監視する必要があります(dmesg
またはシリアルラインまたは使用するものを介して)。
Lockdepコードはロックのみをデバッグし、他の何かから発生するデッドロックについて警告することはできません。