確認してみましたが、エラー発生時に通っていそうな場所には try/catch が入っていて、
Catchした場合には、トレースファイルに出力するようになっていましたが、
Catchできずに、実行時エラーがでます。
その時のエラー署名は、
EventType:clr20r3
P1:アプリ名
....
P4:mscorlib
P5:2.0.0.0
P6:4333ab80
P7:4055
P8:a3
P9ystem.argumentoutofrange
となっています。
発生場所も不定です。
確認してみましたが、エラー発生時に通っていそうな場所には try/catch が入っていて、
Catchした場合には、トレースファイルに出力するようになっていましたが、
Catchできずに、実行時エラーがでます。
その時のエラー署名は、
EventType:clr20r3
P1:アプリ名
....
P4:mscorlib
P5:2.0.0.0
P6:4333ab80
P7:4055
P8:a3
P9ystem.argumentoutofrange
となっています。
発生場所も不定です。
諸農さん
再現可能な最小限のコードというのが難しいです。
ファイルIOだけの簡単なスレッドをワーカースレッドとして起動する分には、
40スレッド以上、上げても問題ありませんでした。
また、Databaseへ接続する処理を入れてみても同様です。
再現可能なアプリは、10個程の DLL,EXE (の拡張子のモジュール)を利用したアプリになっています。
スレッド数と発生確率としては、
ノートPC 3スレッドで高確率
デスクトップPC 10スレッドで高確率
に発生という印象です。
情報として不正確でしたが、
mscorlib内でのエラーではなく、自作DLL内で例外発生している様子でした。(System.ArgumentOutOfRange)
(MSへ報告する内容の中に、mscorlibモジュールがあっただけのかも知れません・・・)
単にDLL内の例外キャッチが漏れているだけなのかもしれません。
当然、SyncLock/Mutex等の排他制御はしているのですが、この当りをもう少し精査してみます。
しかし BIOSの DualCoreを無効にすると発生しなくなるというのは、ほとんどシングルタスク状態で、
OSが動いているという事なのでしょうか?うーむ。。。
諸農です。
Puzzlerjp さんからの引用 | |
|
興味があるので、申し訳ないのですが再現確認可能な最小限のコードを見せていただけないでしょうか。
HTなCPUを搭載したマシンであまりそのような現象にあったことがないです。最近Core2Duo搭載のノートパソコンを買ったので、そのマシンで追認してみたいと考えています(OSはVistaになりますが)。
|
ちなみに、最大いくつのスレッドを作っているのでしょうか?
Windows XP Pro
.NET Framework 2.0
Visual Studio 2005 SP1適用済 (Visual Basic 2005)
にて作成したマルチスレッドアプリケーションが、
頻繁に、 mscorlib 内で実行時エラーを出します。
(MSに報告するかどうか尋ねられる窓が出ます。一応続行はできます。)
BeginInvoke/EndInvoke + AsyncOperation で作成したBackgroundWorker的クラス
を使用して作成したスレッドの場合も、単に、 Thread.Start としたワーカースレッドの場合でも、
どちらでも発生しています。(恐らく)
PCの BIOS で、Dual Coreを無効にすると、発生しなくなりましたが、単に発生しにくくなっただけのようです。
(BIOSのDualCoreを無効にする事で完全に回避できるのか確証がまだ無い状態)
ノートPC(HP Compaq nx6320)で頻繁に発生していた為、Core2Duoプロセッサが原因かとも考えましたが、
(ノートPC(HP)の方では、 Intel Core2Duo のマイクロコードアップデートで、BIOSのアップデートを勧められています)
デスクトップ(DELL Optiplex 745)の、PentiumD でも発生しました。
また、デスクトップのBIOSで デュアルコアを無効にしても、直後の再起動時に発生しました。
その後は発生しにくくなっているのか、発生を確認できていません。
いずれにせよ、DualCoreを無効にすると、PCの動きが遅くなるので、やはりDualCoreを有効にしたいところです。
スレッドが複数上がった場合に発生確率が高くなる辺りは、 .NET Framework自体にも原因があるのかと思い、
ここにポストします。
書き忘れましたが、
BIOSで DualCoreを有効にしても再現しなくなりました。
NyaRuRuさん
Windbgの情報、ありがとうございます。
Windbg から実行させると、きっちり例外をキャッチできました。
やはり自作DLL内での スレッド セーフ実装が甘かっただけのようです。
特に sos.dllを loadしなくても、単にWindbgから実行するだけで
例外キャッチできました。
Windbgに
Unkown Exception - code e0434f4e (first chance)
CLR Exception - code e0434f4d (first chance)
というような出力もありましたが、アプリを直接起動した時にはエラーはでないので、無視してます。(^^;
sos.dllを loadしてもメッセージは変わりませんでした。
以上、お騒がせしました。。。
P.S.
アプリのTrace出力が Windbgにも表示されているのを見た時はちょっと嬉しかったです。
Puzzlerjp さんからの引用 | |
|
なんとなくの印象ですが,マルチスレッドでかつmscorlibということだと,マネージ例外として発生したときは既にタイミングと重要な情報が失われているような気がします.
マネージドな try/catch は,「何かトラブルが起きた」ということは分かっても,詳細なデバッグ用途の正確さという点では不十分なことがあるので,Visual Studio やwindbg + sos.dll などで「本当に最初の例外が起きた瞬間」を調べるところから始められてみてはいかがでしょうか?
とりあえずデバッグ作業としてはまだスタート地点ぐらいだと思います.
たとえば,ワーカースレッドの中で例外が起きてたりしませんか?
Visual Studio のメニューから「デバッグ」→「例外」を選ぶと,生の例外発生時にブレークするように設定できます.さらに,プロジェクト設定の「デバッグ」→「アンマネージ コード デバッグを有効にする」をチェックしておくと,mscorlib 内で Win32 例外が発生した場合もブレークできるようになります.
MSのKBを検索してみて、
http://support.microsoft.com/kb/326281/ja
を見つけました。
やはり、mscorlib内で、ハンドルされない例外が発生しているという事で間違いないのでしょうか?
DualCoreの場合に、パフォーマンスカウンタ値関係の所でなにかおかしな事になっているのかとも考えられますが・・・
MSさんが、現地に見に来てくれれば再現は簡単にできるんですがね・・・
確認してみましたが、エラー発生時に通っていそうな場所には try/catch が入っていて、
Catchした場合には、トレースファイルに出力するようになっていましたが、
Catchできずに、実行時エラーがでます。
その時のエラー署名は、
EventType:clr20r3
P1:アプリ名
....
P4:mscorlib
P5:2.0.0.0
P6:4333ab80
P7:4055
P8:a3
P9ystem.argumentoutofrange
となっています。
発生場所も不定です。
諸農さん
再現可能な最小限のコードというのが難しいです。
ファイルIOだけの簡単なスレッドをワーカースレッドとして起動する分には、
40スレッド以上、上げても問題ありませんでした。
また、Databaseへ接続する処理を入れてみても同様です。
再現可能なアプリは、10個程の DLL,EXE (の拡張子のモジュール)を利用したアプリになっています。
スレッド数と発生確率としては、
ノートPC 3スレッドで高確率
デスクトップPC 10スレッドで高確率
に発生という印象です。
情報として不正確でしたが、
mscorlib内でのエラーではなく、自作DLL内で例外発生している様子でした。(System.ArgumentOutOfRange)
(MSへ報告する内容の中に、mscorlibモジュールがあっただけのかも知れません・・・)
単にDLL内の例外キャッチが漏れているだけなのかもしれません。
当然、SyncLock/Mutex等の排他制御はしているのですが、この当りをもう少し精査してみます。
しかし BIOSの DualCoreを無効にすると発生しなくなるというのは、ほとんどシングルタスク状態で、
OSが動いているという事なのでしょうか?うーむ。。。
諸農です。
Puzzlerjp さんからの引用 | |
|
興味があるので、申し訳ないのですが再現確認可能な最小限のコードを見せていただけないでしょうか。
HTなCPUを搭載したマシンであまりそのような現象にあったことがないです。最近Core2Duo搭載のノートパソコンを買ったので、そのマシンで追認してみたいと考えています(OSはVistaになりますが)。
|
ちなみに、最大いくつのスレッドを作っているのでしょうか?
Windows XP Pro
.NET Framework 2.0
Visual Studio 2005 SP1適用済 (Visual Basic 2005)
にて作成したマルチスレッドアプリケーションが、
頻繁に、 mscorlib 内で実行時エラーを出します。
(MSに報告するかどうか尋ねられる窓が出ます。一応続行はできます。)
BeginInvoke/EndInvoke + AsyncOperation で作成したBackgroundWorker的クラス
を使用して作成したスレッドの場合も、単に、 Thread.Start としたワーカースレッドの場合でも、
どちらでも発生しています。(恐らく)
PCの BIOS で、Dual Coreを無効にすると、発生しなくなりましたが、単に発生しにくくなっただけのようです。
(BIOSのDualCoreを無効にする事で完全に回避できるのか確証がまだ無い状態)
ノートPC(HP Compaq nx6320)で頻繁に発生していた為、Core2Duoプロセッサが原因かとも考えましたが、
(ノートPC(HP)の方では、 Intel Core2Duo のマイクロコードアップデートで、BIOSのアップデートを勧められています)
デスクトップ(DELL Optiplex 745)の、PentiumD でも発生しました。
また、デスクトップのBIOSで デュアルコアを無効にしても、直後の再起動時に発生しました。
その後は発生しにくくなっているのか、発生を確認できていません。
いずれにせよ、DualCoreを無効にすると、PCの動きが遅くなるので、やはりDualCoreを有効にしたいところです。
スレッドが複数上がった場合に発生確率が高くなる辺りは、 .NET Framework自体にも原因があるのかと思い、
ここにポストします。