web-dev-qa-db-ja.com

Linuxのハングをデバッグする方法は?

カーネルバージョン3.12のビーグルボーンブラックベースのカスタムボードを使用しています。
initスクリプトの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) '問題は発生していません。 :(

唯一の機能は、ウォッチドッグタイマーの期限が切れた後にウォッチドッグが有効になっている場合、システムを再起動してシステムを回復することです。

ただし、問題がどこにあるのかを調べたいと思います。

なにか提案を?

ソフトドッグと修復スクリプトのペアを使用していくつかのメッセージを出力することを考えましたが、外部割り込みの優先度が高く、実行されてそこでハングすると、ソフトドッグタイマーも正しく実行される機会がありませんか?

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

助けていただければ幸いです。

2
ART

コメントで提案されているようにコードを読み取り、システムが無限ループ(irq内)に入る可能性があり、そこから出てこないパッチのセクションを見つけました。

しかし、printkをその中に入れたとき、irq関数の問題は再現されませんでした。 (あなたが知っているタイミングの問題!)

それで、ついに私の同僚はGPIOを切り替える古い学校の方法を試しました、そしてそれは助けになりました。 GPIOトグルの3つ以上のエントリが問題の再現を妨げるため、これも困難でした。

関数内で彼は次のようにGPIOトグルを使用しました。

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

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

@ShankarSM:あなたがこれを読んでいるなら、それを追跡するためにすべてのクレジットがあなたに行きます:-)

0
ART