富士通

NetCOBOL 技術情報:トラブルシューティング

エラー

Windows x86

NetCOBOL

Q

実行時メッセージ「JMP0015I-U」のシステムからのエラーコードに「0x45A」が通知されます。

A

現象が発生したシステムによって、対処方法が異なります。

現象が発生したシステムが、Windows NT 4.0、Windows 2000の場合

以下の技術情報を参照してください。

現象が発生したシステムが、Windows Server 2003、Windows Vista、Windows Server 2008の場合

上記システムでは、TLS(スレッドローカルストレージ)の代わりにFLS(ファイバー ローカルストレージ)という新たな資源が追加されました。FLSもTLSと同様に1プロセス内 で確保できる最大数にOSの定量制限があります。FLSのエントリーを上限まで使いきると、 さまざまな現象が発生します。
最も多い現象は、DLLがプロセス空間にロードされるタイミングにおいて、DLLの初期化 に失敗してしまうというものです。
これは、プロセス内でFLSエントリーを上限まで使い切っている状態で、さらに、DLLの 初期化処理でFLSエントリーの確保を行おうとして失敗した場合に発生します。 特に1プロセスが多数のDLLで構成されていて、一つのDLLが一つのFLSエントリを消費す る構造になっている場合、DLL数分のFLSエントリーが消費されるため簡単に定量制限を 超えてしまいますので、注意が必要です。

各システムのFLSエントリー数の上限は128です。

詳細はマイクロソフト社から公開されている、以下の情報を参照してください。

【確認方法】
DLLリンク時、Cランタイムライブラリ「LIBCMT.LIB」を指定しているか確認してください。

【対処方法】
「LIBCMT.LIB」を指定している場合は、以下のように対処してください。

  • DLLがCOBOLだけで作成されている場合
    リンク時、「LIBCMT.LIB」の指定をやめ、リンクオプション「/NOENTRY」を指定して、DLLを作成 してください。
  • DLLがCOBOLとCで作成されている場合
    • 同一のDLLにする場合
      リンク時、「LIBCMT.LIB」の指定をやめ、「MSVCRT.LIB」を指定して、DLLを作成してください。 Cプログラムを翻訳オプション「/MT」で翻訳している場合、「/MD」を指定して再翻訳して ください。
    • 別々のDLLにする場合
      COBOLのDLL作成時、「LIBCMT.LIB」を指定せず、リンクオプション「/NOENTRY」を指定して DLLを作成してください。
      CのDLL作成時、翻訳オプション「/MD」を指定して翻訳し、DLLを作成してください。