2012-05-01 26 views
7

ロック、センパホール、マルチスレッドアプリケーションの障壁などの同期操作を記録して、デバッグの目的で後で記録されたアプリケーションを再生できるようにします。マルチスレッドアプリケーションを再生するにはどうすればよいですか?

自分のロック、セマフォ、条件変数などを提供することです。ロギングも行う機能ですが、下にあるいくつかの共通の同期操作を使用している必要があるため、残念です。

私の質問は、私のプログラムに最低限の変更を加えるようにログを記録すべき同期操作です。言い換えれば、これらすべての同期操作が構築されるglibcとシステムコールの関数またはマクロはどれですか?私はロギングと再生のためにそれらを変更するだけです。

+0

どのようにすべての同期操作を記録すると、「記録されたアプリケーションを再生する」ことができますか?プログラムには、同期操作の順序よりもはるかに多くのことがあります。特に、同期が欠落して競合状態が発生した場合(これは、デバッグのヘルプが必要な問題の1つです) –

+0

今のところ、競争条件を忘れてしまいます。彼らも重要だと分かっています。 – pythonic

+0

['strace(1)'](http://linux.die.net/man/1/strace)は役に立つかもしれませんが、カーネルに移行することなくユーザ空間で完全に発生する同期操作を捕まえません。競合のないミューテックスロックとして扱います。 –

答えて

1

私は「レコード」モードではgdbでデバッグしていると考えることができる最高:このページによると

GDB Process Recordをサポートは進行中であるスレッドが、それは完全ではないかもしれませんまだ。


あまり厳密にあなたの質問に答える、私は他のプラットフォームで

を提案することができる、いくつかの他のスレッドチェッカーが存在するが、私はあまり持っていません彼らとの経験。

1

あなたのケースでは、Linux上でシステムコールをログに記録する効果的な方法は、LD_PRELOADのトリックを使用して、実際のシステムコールを呼び出しのログを記録する独自のバージョンで上書きすることです実際のシステムコールに転送します。

より広範な例がhere in Linux Journalに与えられています。

「トリック」の基本的な要点は、pthreadなどの他のシステムライブラリの前に独自のダイナミックライブラリをロードして呼び出しをマスクできることですそれらの関数の独自のバージョンをprecendentとして配置することによって、それらのライブラリ関数に追加することができます。オーバーライド機能の中で、元の関数の使用をログに記録するだけでなく、ログに記録しようとしている実際の呼び出しの引数を渡すこともできます。

このメソッドの素晴らしい点は、カーネル呼び出しを行う関数だけでなく、ユーザーランドに完全に残る関数の両方を呼び出すことができることです。

関連する問題