[NT]複数クライアントを持つ OLE サーバーで STOP 0xEFFFFFFF 例外

この記事は、以前は次の ID で公開されていました: JP195469
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
複数のクライアント アプリケーションから、COM サーバーへアクセスしているときに、サーバー上のリソースが不足した場合、クライアント呼び出しが失敗することがあります。この失敗により、実行中のクライアント アプリケーションにおいて、アクセス違反などの障害が発生することがあります。

補足

クライアントがその障害の後でも正常に機能し続けるかどうかは、クライアント ソフトウェアがどのように設計されているかに依存します。例外処理を考慮して設計されたクライアント アプリケーションでは、この障害に対しシステムへ悪影響を与えることはなく、エラーをログとして残すだけです。

これに対して、例外処理が考慮されていないクライアント アプリケーションでは、アクセス違反や処理中のデータに対する致命的なエラーが発生する可能性があります。

上記の様に、クライアント アプリケーションによっては、クライアント側とサーバー側のアプリケーションにおいて障害とわかる事象が発生しない場合があるため、クライアント呼び出しの失敗を発見することは困難です。ただし、この障害による影響で、サーバーやクライアントが応答を停止したり (ハングする) STOP エラーが発生することはなく、サーバーからクライアントに例外コードを返すだけです。

この問題が特定の障害の原因であるかどうかを確認するには、サーバー アプリケーションをデバッグする必要があります。ただし、デバッグの方法によっては例外 0xEFFFFFFF が発生することがあるため、デバッグの際には、サーバー アプリケーションに対するブレーク ポイントを設定し、現象発生時のスタックと以下の内容とを比較してください。
  RPCRT4! RpcRaiseException@4 + 49 bytes  OLE32! ThreadInvoke(struct _RPC_MESSAGE *) + 524 bytes  RPCRT4! DispatchToStubInC@12 + 52 bytes  RPCRT4! RPC_INTERFACE::DispatchToStubWorker(struct _RPC_MESSAGE *,               unsigned int,long *) + 292 bytes  RPCRT4! RPC_INTERFACE::DispatchToStub(struct _RPC_MESSAGE *,               unsigned int,long *) + 93 bytes  RPCRT4! RPC_INTERFACE::DispatchToStubWithObject(struct _RPC_MESSAGE *,               class RPC_UUID *,unsigned int,long *) + 176 bytes  RPCRT4! WMSG_SASSOCIATION::DealWithRequestMessage(union _WMSG_MESSAGE *,               union _WMSG_MESSAGE *,struct _RPC_MESSAGE *,               class WMSG_SBINDING * *,unsigned int,int,int,int) + 826               bytes  RPCRT4! WMSG_ADDRESS::HandleRequest(union _WMSG_MESSAGE *,               class WMSG_SASSOCIATION *,struct _RPC_MESSAGE *,               class WMSG_ENDPOINT *,int,int) + 146 bytes  RPCRT4! WMSG_ADDRESS::DealWithWMSGRequest(union _WMSG_MESSAGE *,               class WMSG_ENDPOINT * *,struct HWND__ * *,               class WMSG_ASSOCIATION *,union _WMSG_MESSAGE * *) + 734               bytes  RPCRT4! WMSG_ADDRESS::ReceiveLotsaCalls(void) + 837 bytes  RPCRT4! RecvLotsaCallsWrapper(class WMSG_ADDRESS *) + 9 bytes  RPCRT4! BaseCachedThreadRoutine(class CACHED_THREAD *) + 156 bytes  RPCRT4! ThreadStartRoutine(class THREAD *) + 23 bytes  KERNEL32! 77f04f44()
原因
typelib のマーシャリングを扱っている OLE 関数はマルチスレッドに対して完全に安全というわけではないので、2 つ以上のクライアントがサーバーに対して同時呼び出しを行った場合、この例外がごくまれに起きます。
状況
この問題は Windows NT 4.0 日本語版のサービスパック 5 で修正されております。
なお、サービスパック 5 にて修正された問題の一覧は、以下の関連文書に記載されております。
文書番号 : 413592
タイトル : [NT]Windows NT 4.0 Service Pack 5 修正一覧
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 195469 (最終更新日 1999-05-14) をもとに作成したものです。

4.00 object linking embedding com dcom distributed
プロパティ

文書番号:195469 - 最終更新日: 02/03/2014 02:01:20 - リビジョン: 1.0

  • Microsoft Windows NT Workstation 4.0 Developer Edition
  • Microsoft Windows NT Server 4.0 Standard Edition
  • kbnosurvey kbarchive kbbug kbfix kbbug4.00 kbfix4.00 KB195469
フィードバック