2012-12-26 20 views
9

いくつかの背景: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私の唯一のアプローチのようなプログラムに依存していますか?

+2

あなたのスレッドはブロックされていますか? 'gdb'はユーザー空間でブロックされているかどうかを知ることができます。 'ps axlm'は' WCHAN'フィールドであなたに伝えます。 –

+0

スレッドがデッドロック・ペアであることを正確に言うのは難しいです。 'pthread_cond_wait'には、問題のスレッドとしての私の最高の推測である2つのスレッドがあります。私は間違っているかもしれません。これが、私が全スレッドを打つことを試みている理由です。私は 'ps axlm'を知らなかったので、次回にこのデータを収集するためにこれを使用します。残念なことに、それは非常に分かりにくく、再生ステップはありません。私は私の発見を報告します。 –

+1

スクリプトを使用して、すべてのスレッドのスタックをキャッチすることができます。 'gdb -ex"はページ番号0を設定します-exはスレッドにすべてのbtを適用します--batch -p $(pidof EXECUTABLE_NAME) ' –

答えて

4

あなたが今やっているやり方はおそらく最も正確で簡単です。カーネル内の "特定のプロセスにすべての待機中のfutexを"起きさせることはありません。これは、これをより直接的に達成するために必要なものです。

「デッドロック」が「pthread_cond_wait」であるが、信号がデッドロックから外れて中断した場合、バグはアプリケーションには存在しないことに注意してください。実際にはpthread条件変数を実装する必要があります。 glibcは条件変数の実装に未修正バグを認識しています。 http://sourceware.org/bugzilla/show_bug.cgi?id=13165と関連するバグレポートを参照してください。しかし、既存の既知のものは、信号を使ってfutex待機を中断することによって修正できるとは思わないので、新しいものを見つけたかもしれません。このバグをglibcバグトラッカーに報告することができれば、非常に役に立ちます。

+0

私はこれを探求します。ありがとうございました。 –

+0

私は現在、上記の質問に対するDavidのコメントに基づいて、より多くのデータを収集しています。私はこれが問題をよりよく理解し、glibcのバグが可能かどうかを判断する助けになると信じています。限り、私の質問に行く、私はカップルの誰かが他のアイデアがあるかどうかを確認するためにこの答えを受け入れるのを延期する。シグナリング方法はうまくいくように思えます。ご協力いただきありがとうございます。 –

関連する問題