Pivotal Knowledge Base

フォローする

GemFire Native Client アプリケーションが STATUS_IN_PAGE_ERROR でクラッシュ

対象:

  • GemFire Native Client 7.0.1.x から 7.0.2.x
  • Windows オペレーティングシステム

目的:

本文書では、GemFire Native Client アプリケーションにおける、[STATUS_IN_PAGE_ERROR] エラーによるクラッシュを防ぐ手段を提供する。

事象:

ネットワーク共有フォルダーをカレントディレクトリーとして起動した GemFire Native Client アプリケーションが、GemFire クライアントログにに以下の例外を出力しクラッシュすることがある。

[error 2014/10/01 10:35:00.988346 JST ADNF37582J:8080 8224] Debug event STATUS_IN_PAGE_ERROR occurred at 6A02E8D1 in process with pid 8080
[error 2014/10/01 10:35:01.003946 JST ADNF37582J:8080 8224] Generating debug dump in file C:\Program Files\temp\Log\Conn\_Log-1403055301-0.dmp

さらにクラッシュダンプ解析を行うと、ExceptionCode: c0000006 (In-page I/O error) でクラッシュしていることが分かる。

原因:

c0000006 エラーは、ネットワーク、あるいはネットワーク接続に起因するエラーである。とりわけ、c0000006 エラーは、ページ I/O エラーの類である。このエラーは、基本となるネットワーク接続が失われた場合に発生する。

アプリケーションがネットワーク共有フォルダーをカレントディレクトリーとして起動すると、Windows は EXE イメージをリモートフォルダーからロードし実行する。したがって、ネットワーク共有フォルダーにおける(ネットワーク障害のような)任意の接続問題が、仮想マシンメモリマネージャーに対して、スワップファイルのアドレスに対する必要なメモリページを見つけることができない状況を起こし得る。これが、c0000006 例外をスローし、プログラムイメージに対してクラッシュを引き起こすこととなる。

解決策:

本問題を回避するための容易な方法は、リモートフォルダーの代わりに、ローカルフォルダーから当該アプリケーションを起動することである。

しかしながら、もし Native Client アプリケーションをリモートフォルダーから起動する必要がある場合は、本問題の発生を防ぐためのコンパイルオプションにて対処する。

  1. VC++ アプリケーションの場合、リンカーオプションとして /SWAPRUN:NET を適用の上、アプリケーションのコンパイルを行う。これは、オペレーティングシステム対して、最初に、リンカー出力をスワップファイルにコピーしてからそこで実行するよう指示するオプションである(http://msdn.microsoft.com/en-us/library/chzz5ts6.aspx を参照)。
  2. C# アプリケーションの場合、application, you can enable Shadow Copy feature by setting AppDomainSetup.ShadowCopyFiles=true と設定し、シャドーコピー機能を有効化することによって対処する(http://blogs.msdn.com/b/junfeng/archive/2004/02/09/69919.aspx を参照)。

コメント

Powered by Zendesk