いくつかの背景:Linuxアプリケーション内で偽起動を起動するにはどうすればよいですか?
私はサードパーティ製のハードウェアとクローズドソースのドライバに依存しているアプリケーションがあります。現在、ドライバにはバグがあり、ランダムな時間が経過するとデバイスが応答を停止します。これは、ドライバ内で明らかなデッドロックが原因で発生し、アプリケーションが正しく機能するのを妨げています。これは常時接続の24時間365日の非常に目に見える環境です。
私が発見したのは、GDBをプロセスに接続し、プロセスからGDBをすぐに切り離すと、デバイスが機能を再開するということです。これは、ドライバ自体にスレッドロックの問題があったという私の最初の兆候でした。デッドロックにつながる何らかの競合状態があります。 GDBをアタッチすると、明らかにスレッドの再編成が発生し、待機状態から外して状態を再評価し、デッドロックを解除する可能性がありました。
質問:
私の質問は、単にこれです:彼らの待機状態を中断するプログラム内のすべてのスレッドをトリガするアプリケーションのためのクリーンな待ち時間はありますか?確かに(少なくとも私の実装に)働くことの一つは、他のプロセスからSIGCONTによりSIGSTOPは直後に送信することである(つまり、bashのから):これは、プロセスとすべてのものの中スプリアスウェイクアップをトリガ
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
人生に戻ってくる。
私のプロセス内のすべてのスレッドの偽の起床を引き起こすインテリジェントな方法があることを期待しています。 pthread_cond_broadcast(...)
と考えてください。ただし、実際の条件変数にアクセスすることはできません。
これは可能か、kill
私の唯一のアプローチのようなプログラムに依存していますか?
あなたのスレッドはブロックされていますか? 'gdb'はユーザー空間でブロックされているかどうかを知ることができます。 'ps axlm'は' WCHAN'フィールドであなたに伝えます。 –
スレッドがデッドロック・ペアであることを正確に言うのは難しいです。 'pthread_cond_wait'には、問題のスレッドとしての私の最高の推測である2つのスレッドがあります。私は間違っているかもしれません。これが、私が全スレッドを打つことを試みている理由です。私は 'ps axlm'を知らなかったので、次回にこのデータを収集するためにこれを使用します。残念なことに、それは非常に分かりにくく、再生ステップはありません。私は私の発見を報告します。 –
スクリプトを使用して、すべてのスレッドのスタックをキャッチすることができます。 'gdb -ex"はページ番号0を設定します-exはスレッドにすべてのbtを適用します--batch -p $(pidof EXECUTABLE_NAME) ' –