■6857 / ) |
Re[3]: Control.Invokeが使えない件。 |
□投稿者/ NyaRuRu (15回)-(2007/08/25(Sat) 04:41:56)
|
2007/08/25(Sat) 04:47:26 編集(投稿者)
■No6849 (れい さん) に返信 > 環境とかで問題が発生する確率が大きく変わるので頻度は参考程度ですが、 > http://bbs.wankuma.com/index.cgi?mode=al2&namber=6760 のコードでは > デッドロックが起こりえることは間違いありません。
確かに http://bbs.wankuma.com/index.cgi?mode=al2&namber=6760 のコードでフォーム2を閉じるとハングすることがあるのは再現しました. が,アンマネージデバッグを有効にするで Win32 例外を一通り眺めてみると,ハング時にはファイナライザスレッドから RichEdit に飛んで COM リソースの解放をしているっぽくて,そこでアクセス違反が起きてましたよ. 以下コールスタックです.
riched20.dll!CNotifyMgr::Remove() + 0x5 bytes riched20.dll!CTxtRange::~CTxtRange() + 0x2d bytes riched20.dll!CTxtRange::`scalar deleting destructor'() + 0xd bytes riched20.dll!CTxtRange::Release() + 0x1a bytes mscorwks.dll!ReleaseTransitionHelper() + 0x5f bytes mscorwks.dll!SafeReleaseHelper() + 0x6d bytes mscorwks.dll!SafeRelease() + 0x2f bytes mscorwks.dll!RCW::ReleaseAllInterfaces() + 0x53 bytes mscorwks.dll!RCW::ReleaseAllInterfacesCallBack() + 0x96 bytes mscorwks.dll!RCW::Cleanup() + 0x22 bytes mscorwks.dll!RCWCleanupList::ReleaseRCWListRaw() + 0x14 bytes mscorwks.dll!RCWCleanupList::ReleaseRCWListInCorrectCtx() + 0x4380 bytes mscorwks.dll!RCWCleanupList::CleanupAllWrappers() + 0x10e733 bytes mscorwks.dll!SyncBlockCache::CleanupSyncBlocks() - 0x5653c bytes mscorwks.dll!Thread::DoExtraWorkForFinalizer() + 0xc9d13 bytes mscorwks.dll!WKS::GCHeap::FinalizerThreadWorker() + 0xa8 bytes mscorwks.dll!Thread::UserResumeThread() - 0x204ae2 bytes mscorwks.dll!Thread::DoADCallBack() - 0x203b25 bytes mscorwks.dll!Thread::DoADCallBack() - 0x203c00 bytes mscorwks.dll!ManagedThreadBase_NoADTransition() + 0x32 bytes mscorwks.dll!ManagedThreadBase::FinalizerBase() + 0xb bytes mscorwks.dll!WKS::GCHeap::FinalizerThreadStart() + 0xa9 bytes mscorwks.dll!Thread::intermediateThreadProc() + 0x46 bytes kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes ntdll.dll!__RtlUserThreadStart@8() + 0x27 bytes
ちょっと月末締めの原稿書きが忙しいのでこれ以上調べるつもりはないですが,sos.dll 等を使えばその「デッドロック時」に何が起きているかもうちょっと調べられるはずなので,せめて待機中のハンドルが何であるかとか前後で変な (アンマネージ) 例外が起きていないかとか,調べた方がいいんじゃないですかね?
|
|