3

Windows 7 でプロセスが不安定にクラッシュしました。例外の分析には!analyze -vコマンドを使用します。WinDbg以下の情報を伝えます。WaitForSingleObject例外は、によって呼び出される関数によって実際にスローされIrsSim!IrsNet_BlockOutputます。INVALID_POINTER_READWinDbg の例外分析では、エラーであることがわかりました。

呼び出しコードの場合、pChannel->hMutexは ではありませんNULL。私はすでにそれをダンプし、その値を確認しました。

IRSNETRET IrsNet_BlockOutput( IRSNET    *pChannel)
{

// Check channel
    IRSNET_CHECK_CHANNEL(pChannel);

// Wait for synchronization mutex
    switch(WaitForSingleObject(pChannel->hMutex, INFINITE))
    {
...
}

<<<<<==========

FAULTING_IP: IrsSim!Channel::SendIrsMessage+285 [s:\som5\ics\scsv\isv\test.u\irssim\irsiftransport.cpp @ 539] 00520ed5 8b06 mov eax,dword ptr [esi]

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 77db4639 (ntdll!RtlDeactivateActivationContextUnsafeFast+0x00000058)
ExceptionCode: c0150010 ExceptionFlags: 00000001 NumberParameters: 3 パラメータ [0]: 00000000 パラメータ [1]: 00007 0007

DEFAULT_BUCKET_ID: INVALID_POINTER_READ

PROCESS_NAME: IrsSim.exe

ERROR_CODE: (NTSTATUS) 0xc0150010 - 非アクティブ化されているアクティブ化コンテキストは、現在の実行スレッドに対してアクティブではありません。

EXCEPTION_CODE: (NTSTATUS) 0xc0150010 - 非アクティブ化されているアクティブ化コンテキストは、現在の実行スレッドに対してアクティブではありません。

EXCEPTION_PARAMETER1: 00000000

EXCEPTION_PARAMETER2: 07befc58

EXCEPTION_PARAMETER3: 00000000

STACK_TEXT: 07d2fce0 00520ed5 irssim!Channel::SendIrsMessage+0x285 07d2fd1c 00521072 irssim!CChannelArray::SendIrsMessage+0x132 07d2fd50 0052208a irssim!CNetLibInterface::SendIrsMessage+0xba 07d2fd78 005c01b6 irssim!CSendActivity::Execute+0x76 07d2fdac 005e0b3f irssim!SimulationThreadState::ExecuteOneActivity +0x11f 07d2fdf8 005cc937 irssim!CSimulationSubThreadState::ExecuteState+0x267 07d2fe8c 005ccf02 irssim!ThreadFctSubSimulation+0xf2 07d2fec4 73b1e3ee mfc90u!_AfxThreadEntry+0xf2 07d2ff4c 739f3433 msvcr90!_endthreadex+0x44 07d2ff84 739f34c7 msvcr90!_endthreadex+0xd8 07d2ff90 767d339a kernel32!BaseThreadInitThunk+0xe 07d2ff9c 77d69ed2 ntdll !__RtlUserThreadStart+0x70 07d2ffdc 77d69ea5 ntdll!_RtlUserThreadStart+0x1b

================================

その後、!teb コマンドを使用して、さらにスタック情報を取得してみます。

0:011> k L=07beec2c 100 ChildEBP RetAddr 07bef54c 76be0bdd ntdll!NtWaitForMultipleObjects+0x15 07bef5e8 767d1a2c KERNELBASE!WaitForMultipleObjectsEx+0x100 07bef630 767d4208 kernel32!WaitForMultipleObjectsExImplementation+0xe0 07bef64c 767f80a4 kernel32!WaitForMultipleObjects+0x18 07bef6b8 767f7f63 kernel32!WerpReportFaultInternal+0x186 07bef6cc 767f7858 kernel32! WerpReportFault+0x70 07bef6dc 767f77d7 kernel32!BasepReportFault+0x20 07bef768 77da21d7 kernel32!UnhandledExceptionFilter+0x1af 07bef770 77da20b4 ntdll!__RtlUserThreadStart+0x62 07bef784 77da1f59 ntdll!_EH4_CallFilterFunc+0x12 07bef7ac 77d76ab9 ntdll!_except_handler4+0x8e 07bef7d0 77d76a8b ntdll!ExecuteHandler2+0x26 07bef7f4 77d76a2d ntdll!ExecuteHandler +0x24 07bef880 77d40143 ntdll!RtlDispatchException+0x127 07bef880 77db4639 ntdll!KiUserExceptionDispatcher+0xf 07befc34 76be0ad7 ntdll!RtlDeactivateActivationContextUnsafeFast+0x58 07befc38 76be0abc KERNELBASE!WaitForSingleObjectEx+0xde 07befc98 767d1194 KERNELBASE!WaitForSingleObjectEx+0xc3 07befcb0 767d1148 kernel32!WaitForSingleObjectExImplementation+0x75

07befcc4 005e3b6e kernel32!WaitForSingleObject+0x12

07befcd4 00520d3b IrsSim!IrsNet_BlockOutput+0x1e

07befd14 00521072 IrsSim!Channel::SendIrsMessage+0xeb 07befd48 0052208a IrsSim!CChannelArray::SendIrsMessage+0x132 07befd70 005c01b6 IrsSim!CNetLibInterface::SendIrsMessage+0xba 07befda4 005e0b3f IrsSim!CSendActivity::Execute+0x76 07befdf0 005cc937 IrsSim!SimulationThreadState::ExecuteOneActivity+0x11f 07befe84 005ccf02 IrsSim!CSimulationSubThreadState::ExecuteState+0x267 07befebc 73b1e3ee IrsSim!ThreadFctSubSimulation+0xf2 07beff44 739f3433 mfc90u!_AfxThreadEntry+0xf2 07beff7c 739f34c7 msvcr90!_endthreadex+0x44 07beff88 767d339a msvcr90!_endthreadex+0xd8 07beff94 77d69ed2 kernel32!BaseThreadInitThunk+0xe 07beffd4 77d69ea5 ntdll!__RtlUserThreadStart +0x70 07beffec 00000000 ntdll!_RtlUserThreadStart+0x1b

====================================>>>>>>

4

4 に答える 4

3

これは、MFC アプリケーションで発生した 0xC015000f 例外によく似ています (「非アクティブ化されているアクティブ化コンテキストは、最近アクティブ化されたものではありません。」)

この例外が発生したすべてのケースで、例外は主要な問題ではありません。これは、以前の例外 (通常はアクセス違反) の副作用であり、スタックが適切に巻き戻されていません。AFX_MANAGE_STATE マクロなどのマクロを使用した呼び出しフレームのどこかが、例外処理で見落とされています。その結果、次にアクティベーション コンテキストが操作されると、たとえば AFX_MAINTAIN_STATE2::~AFX_MAINTAIN_STATE2 のような呼び出しが行われる別のルーチンによって、システムは Cookie の不一致を検出し、例外をスローします。

あなたの場合、コンテキスト例外によって明らかになるコードの一部で例外(おそらくAV)を引き起こしている可能性があります。根本原因をトラップするには、初回例外処理を有効にしてデバッガを実行します。そうすれば、おそらく try/catch(...) を使用している誰かによって呼び出しフレームの他の場所に閉じ込められている AV が公開されます。スレッド化しているように見えるため、メモリ アクセスで競合状態が発生し、プライマリ例外が発生する可能性があります (実際に発生している場合)。

以前の投稿で次のように述べています。

これは MFC のバグではありません。MFC 6 には、Visual Studio 2005 で追加されたアクティベーション コンテキスト切り替えコード (Cookie ベース) が含まれていなかったと思います。したがって、この例外は発生しません。私たちも、新しい MFC には問題があると考えていましたが、遭遇したすべてのケースで、問題の原因は私たちのコードでした。元の問題は、MFC 管理状態マクロの 1 つを使用するコードを最終的に呼び出す try/catch (通常は ...) で始まるコード フローによって隠蔽され、最終的に AV が発生するコードをさらに呼び出します。キャッチがスタックのはるか上にあり、破損によってはすべてのフレームが適切に巻き戻されないため、MFC マクロの裏側が失われます (一部のデストラクタがそのコンテキストをポップできませんでした)。さらに悪いことに(デバッグ用)、最終的なコンテキスト クラッシュは、コードのどこでも発生する可能性があります (CWnd のベース ウィンドウ メッセージ処理ルーティング メソッドで多くの状況が発生しました)。最終的に、ユーザーが実行する別のツールを作成しました。これは、最初のチャンスの例外をトラップする (リリース ターゲット) 実行可能ファイルにデバッガーとしてアタッチし、dmp ファイルを作成して、.問題の元の原因は過去の実行から長い間あったため、コンテキスト例外はほとんど役に立ちませんでした。

于 2012-08-10T13:57:38.927 に答える
2

呼び出しがそのように失敗する唯一の方法は、

pChannel->hMutex

無効です。pChannelそれ自体が無効であるか、またはhMutex. おそらく前者です。

于 2012-05-23T08:57:36.407 に答える
1

コンテキストの非アクティブ化に問題があるようです (windbg ダンプに基づく考え)。http://blogs.msdn.com/b/junfeng/archive/2006/03/19/sxs-activation-context-activate-and-deactivate.aspx記事を参照してください。

于 2012-05-23T13:48:11.540 に答える