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です。
詳細はマイクロソフト社から公開されている、以下の情報を参照してください。
-
Visual C++ .NET 2003、Visual C++ 2005、または Visual C++ 2008でビルド
されたアプリケーションに128個程度以上のDLLが含まれる場合、Windows Server
2003 以降のオペレーティングシステムでのロードに失敗することがある
(マイクロソフト社のページへリンク)
【確認方法】
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を作成してください。
- 同一のDLLにする場合
