Linuxの中断をデバッグする方法は?

Linuxの中断をデバッグする方法は?

私たちはカーネルバージョン3.12のBeagle Bone Blackベースのカスタムボードを使用しています。
初期化スクリプトの1つ(スクリプトがWiFiを起動したとき)にシステムがハングしました。
この中断は、任意の回数だけ電源を入れ直した後に発生しました。

Nothing works during this hang, it looks like system is frozen, It doesn't even respond to sysrq keys

私はこれがうまくいかないので、ISRコードにあると思います。

残念ながら、DETECT_HUNG_TASK「保留中のジョブ検出()」を有効にしても問題は表示されません。 :(

動作する唯一の方法は、ウォッチドッグタイマーが期限切れになった後にウォッチドッグを有効にすると、システムが再起動され、システムが復元されることです。

しかし、私たちは問題が何であるかを知りたいです。

どんな提案がありますか?

いくつかのメッセージを印刷するためにソフトドッグと修正スクリプトのペアを使用しようとしましたが、外部割り込みの優先順位が高くなり、それが実行されてそこで停止している間にソフトドッグタイマーも実行する機会がないと思いました。そうですか?

バグのランダム性により、デバッグがより困難になります。 :(

助けてくれてありがとう。

答え1

まあ、私たちはコメントに示されているようにコードを読み、システムが無限ループ(irqで)に入り、終了できないパッチの部分を見つけました。

しかし、printkをirq関数に入れても問題は再び発生しませんでした。 (時間問題であることをご存知ですか?)

最後に、私の同僚はGPIOを切り替える時代遅れの方法を試してみました。 2つ以上のGPIOトグルエントリを使用すると問題が再現されないため、これも困難です。

関数の内部では、以下のようにGPIOスイッチングを使用します。

func()
{  
   //set gpio high
     some doubtfull code..
     ....
   //set gpio low
}  

これは彼が問題のあるコードを追跡した方法であり、解決策はlinux-4.1で提供されており、それを修正してテストしています。

@ShankarSM:この記事を読んでいる場合は、この記事を追跡するためのすべての功績があなたにあります:-)

関連情報