COBOL/エンタープライズ製品 技術情報(FAQ)


Windows 環境でのランタイムエラー 114 発生時の調査方法


ランタイムエラー 114 の発生原因

COBOL アプリケーションプロセスで OS のメモリアクセス違反が発生すると、以下のようなランタイムエラーメッセージが表示されます。メッセージ末尾の (シグナル nn) はメモリアクセス違反の発生時に OS から受信したシグナルで、この例での (シグナル 11) はセグメンテーションフォールト(SIGSEGV)を意味します。

実行 エラー: ファイル 'SUB2'
エラーコード: 114, pc=0, call=1, seg=0
114  メモリ領域外の項目にアクセスしようとしている (シグナル 11) 

このエラーが発生する原因は非常に多岐に及びますが、一般には以下のような原因が考えられます。ユーザーデバッグを行い、発生箇所を特定し、問題を解決する必要があります。

・アプリケーションの非COBOL部分のエラー
・CALL文内のパラメータの不整合
・スタックオーバーフロー
・不正な部分参照
・無効なポインタ値
・有効範囲外の添字
・不正なリンクオプションやプロシージャ

以下で案内する方法は、すべてネイティブCOBOL用の調査方法です。


mfdebug.log を使用したデバッグ方法

mfdebug.log を使用したデバッグ方法を紹介します。以下は Windows 上で mfdebug.log を使用する例です。

  1. 114 エラーが発生するサンプルプログラムを準備します。ここでは SUB2.cbl の linkage section のデータ項目のサイズに誤りがあるために 114 エラーが発生するサンプルプログラムを使用します。
    >type MAIN.cbl
           working-storage section.
           01 wk-test01 pic x(3).
           procedure division.
               call 'SUB1' using wk-test01.
               call 'SUB2' using wk-test01.
               call 'SUB3' using wk-test01.
               stop run.
     
    >type SUB1.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(5).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
     
    >type SUB2.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(10000).
           procedure division using lk-test01.
               move spaces to lk-test01.
               goback.
     
    >type SUB3.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(3).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
    
  2. サンプルプログラムを製品のコマンドプロンプトからコンパイルします。以下は、Visual COBOL コマンドプロンプト(32-Bit)の場合です。
    >cbllink MAIN.cbl
    >cbllink -d SUB1.cbl
    >cbllink -d SUB2.cbl
    >cbllink -d SUB3.cbl
    
  3. サンプルプログラムを実行し、114 エラーが発生することを確認します。 Just-In-Timeデバッガーのポップアップが表示されます。
    >MAIN
    実行 エラー: ファイル 'MAIN'
    エラーコード: 114, pc=0, call=1, seg=0
    114  メモリ領域外の項目にアクセスしようとしている (シグナル 11)
    >
    
  4. エラーが発生すると mfdebug.log が作成されます。
    >dir mfdebug.log
     ドライブ C のボリューム ラベルがありません。
     ボリューム シリアル番号は B6EA-00B2 です
    
     C:\work\TEST\PRG のディレクトリ
    
    2019/07/16  14:24             1,326 mfdebug.log
                   1 個のファイル               1,326 バイト
                   0 個のディレクトリ  40,178,098,176 バイトの空き領域
    >
    
  5. mfdebug.log の[Error occurred in] の項から、SUB2.dll 内で発生したことがわかります。
    >type mfdebug.log
    
    Visual COBOL Exception Handler - 2019/07/16  14:24:10
    C:\work\TEST\PRG\MAIN.exe caused an exception at address : 0x000000006203116A
    Exception type - EXCEPTION_ACCESS_VIOLATION on Write. Address 0x00007FF738487000
    
    Registers:
    
            RAX 2020202020202020    RBX 0000022DF2B72320
            RCX 00007FF738486220    RDX 00000000FFFFFFFF
            ESI 00000000620331A0    EDI 0000000062033000
            R8  00000054CF0FFAD8    R9  00007FF738488920
            R10 0000000000000080    R11 00007FF738487000
            R12 00000000620321D0    R13 0000000000000000
            R14 0000000000000000    R15 0000000000000000
            RIP 000000006203116A    RSP 00000054CF0FF7F0
            RBP 00000054CF0FFA88    Flags 00010283
    
    Error occurred in : C:\work\TEST\PRG\SUB2.dll, loaded at 0x0000000062030000
    
    Command Line :
    
    COBOL call stack:
    
            MAIN    (obj program)
    
    Run-time : C:\Program Files (x86)\Micro Focus\Visual COBOL\bin64\cblrtsm.dll, loaded at 0x0000000180000000
    
            CompanyName Micro Focus
            FileDescription Micro Focus Run Time System Core Support
            FileVersion VisualCOBOL-R14/081
            LegalCopyright Copyright (C) Micro Focus 1984-2018. All rights reserved.
            OriginalFileName cblrtsm.dll
            ProductName Micro Focus COBOL 2017
            ProductVersion 4.0.00243
    
    OS Information:
    
    Windows NT 10.0 (Build 17134: )
    CPU: X64(AMD or Intel) Pentium Model 79 step 1, 1 processors
    Available memory - 4193844 KB
    
    > 
    

Visual COBOL for Eclipse とコアダンプを使用したデバッグ方法

Visual COBOL for Eclipse でのコアダンプのデバッグ方法を紹介します。Visual COBOL for Eclipse にはコアダンプを使用するデバッグ機能があります。デバッグを行うためには、プロジェクト内にデバッグ用にコンパイルした実行モジュール、ソースファイル、idy ファイルが保存されている必要があります。

  1. 114 エラーが発生するサンプルプログラムを準備します。ここでは SUB2.cbl の linkage section のデータ項目のサイズに誤りがあるために 114 エラーが発生するサンプルプログラムを使用します。
    >type MAIN.cbl
           working-storage section.
           01 wk-test01 pic x(3).
           procedure division.
               call 'SUB1' using wk-test01.
               call 'SUB2' using wk-test01.
               call 'SUB3' using wk-test01.
               stop run.
     
    >type SUB1.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(5).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
     
    >type SUB2.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(10000).
           procedure division using lk-test01.
               move spaces to lk-test01.
               goback.
     
    >type SUB3.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(3).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
    
  2. 作業用のワークスペースに、各プログラムのプロジェクトを作成し、サンプルプログラムをコンパイルします。
  3. サンプルプログラムを実行し、114 エラーが発生することを確認します。
    >MAIN.exe
    実行 エラー: ファイル 'SUB2'
    エラーコード: 114, pc=0, call=1, seg=0
    114  メモリ領域外の項目にアクセスしようとしている (シグナル 11)
    >
    
  4. ランタイム構成ファイルを準備します。実行時チューナー:core_on_error と core_filename を使用し、コアダンプを出力する設定にしています。
    >type myconfig.cfg
    set core_on_error=3
    set core_filename="core.%p@%t_%d"
    >
    
  5. 環境変数:COBCONFIG_ にランタイム構成ファイルを設定します。
    >set COBCONFIG_=C:\work\TEST\PRG\myconfig.cfg
    
  6. サンプルプログラムを実行します。 コアダンプが出力される旨のポップアップが開きます。
  7. コアダンプが生成されていることを確認します。
    >dir core*
     ドライブ C のボリューム ラベルがありません。
     ボリューム シリアル番号は CCF6-DD0E です
    
     C:\work\TEST\PRG のディレクトリ
    
    2019/07/17  09:31        48,411,635 core.5892@093115_20190717
                   1 個のファイル          48,411,635 バイト
                   0 個のディレクトリ  25,570,308,096 バイトの空き領域 
    >
    
  8. Eclipse IDE を使用し、デバッグを行います。エラー発生したプログラムを作成したワークスペースを開きます。
  9. デバッグパースペクティブを開きます。メニューから [実行] > [デバッグ構成] を選択するとデバッグ構成ダイアログが開きます。 左ペインから「COBOL コアダンプ」をダブルクリックします。
  10. 作成されたコアダンプを指定して、[デバッグ]ボタンをクリックするとデバッガ実行時エラーのポップアップが表示されますので[OK]ボタンをクリックします。
  11. プログラムソースが表示され SUB2 の move spaces to lk-test01. で 114 エラーが発生していることがわかります。

Visual COBOL for Visual Studio とコアダンプを使用したデバッグ方法

Visual COBOL for Visual Studio でのコアダンプのデバッグ方法を紹介します。Visual COBOL for Visual Studio にはデバッグ機能があります。デバッグを行うためには、プロジェクト内にデバッグ用にコンパイルした実行モジュール、ソースファイル、idy ファイルが保存されている必要があります。

  1. 114 エラーが発生するサンプルプログラムを準備します。ここでは SUB2.cbl の linkage section のデータ項目のサイズに誤りがあるために 114 エラーが発生するサンプルプログラムを使用します。
    >type MAIN.cbl
           working-storage section.
           01 wk-test01 pic x(3).
           procedure division.
               call 'SUB1' using wk-test01.
               call 'SUB2' using wk-test01.
               call 'SUB3' using wk-test01.
               stop run.
     
    >type SUB1.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(5).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
     
    >type SUB2.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(10000).
           procedure division using lk-test01.
               move spaces to lk-test01.
               goback.
     
    >type SUB3.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(3).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
    
  2. 作業用のソリューションに、各プログラムのプロジェクトを作成し、サンプルプログラムをコンパイルします。
  3. サンプルプログラムを実行し、114 エラーが発生することを確認します。
    >MAIN.exe
    実行 エラー: ファイル 'SUB2'
    エラーコード: 114, pc=0, call=1, seg=0
    114  メモリ領域外の項目にアクセスしようとしている (シグナル 11)
    >
    
  4. ランタイム構成ファイルを準備します。実行時チューナー:core_on_error と core_filename を使用し、コアダンプを出力する設定にしています。
    >type myconfig.cfg
    set core_on_error=3
    set core_filename="core.%p@%t_%d"
    >
    
  5. 環境変数:COBCONFIG_ にランタイム構成ファイルを設定します。
    >set COBCONFIG_=C:\work\TEST\PRG\myconfig.cfg
    
  6. サンプルプログラムを実行します。コアダンプが出力される旨のポップアップが開きます。
  7. コアダンプが生成されていることを確認します。
    >dir core.*
     ドライブ C のボリューム ラベルがありません。
     ボリューム シリアル番号は B6EA-00B2 です
    
     C:\work\TEST\PRG のディレクトリ
    
    2019/07/17  14:38        54,131,714 core.1804@143824_20190717
                   1 個のファイル          54,131,714 バイト
                   0 個のディレクトリ  39,964,110,848 バイトの空き領域
    
  8. Visual Studio IDE を使用し、デバッグを行います。エラー発生したプログラムを作成したソリューションを開きます。MAIN プロジェクトのプロパティを開き、デバッグタグを開きます。
  9. 開始動作の[外部プログラムの開始]を選択し、フルパスで作成されたコアファイルを指定してください。
  10. メニューの[デバッグ] > [開始]を選択してください。デバッガのポップアップが表示されますので[中断]ボタンをクリックします。
  11. プログラムソースが表示され SUB2 の move spaces to lk-test01. で 114 エラーが発生していることがわかります。

Net Express とコアダンプを使用したデバッグ方法

Net Express でのコアダンプのデバッグ方法を紹介します。Net Express にはデバッグ機能のアニメータがあります。デバッグを行うためには、プロジェクト内にデバッグ用にコンパイルした実行モジュール、ソースファイル、idy ファイルが保存されている必要があります。

  1. 114 エラーが発生するサンプルプログラムを準備します。ここでは SUB2.cbl の linkage section のデータ項目のサイズに誤りがあるために 114 エラーが発生するサンプルプログラムを使用します。
    >type MAIN.cbl
           working-storage section.
           01 wk-test01 pic x(3).
           procedure division.
               call 'SUB1' using wk-test01.
               call 'SUB2' using wk-test01.
               call 'SUB3' using wk-test01.
               stop run.
     
    >type SUB1.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(5).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
     
    >type SUB2.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(10000).
           procedure division using lk-test01.
               move spaces to lk-test01.
               goback.
     
    >type SUB3.cbl
           working-storage section.
           linkage section.
           01 lk-test01 pic x(3).
           procedure division using lk-test01.
               move 'ABC' to lk-test01.
               goback.
    
  2. 作業用のプロジェクトに各プログラムを追加し、MAIN は EXE 形式、SUB1 ~ SUB3 は DLL 形式でコンパイルします。
  3. サンプルプログラムを実行し、114 エラーが発生することを確認します。
    >MAIN.exe
    実行 エラー: ファイル 'SUB2'
    エラーコード: 114, pc=0, call=1, seg=0
    114  メモリ領域外の項目にアクセスしようとしている (シグナル 11)
    >
    
  4. ランタイム構成ファイルを準備します。実行時チューナー:core_on_error と core_filename を使用し、コアを出力する設定にしています。
    >type myconfig.cfg
    set core_on_error=3
    set core_filename="core.%p@%t_%d"
    >
    
  5. 環境変数:COBCONFIG_ にランタイム構成ファイルを設定します。
    >set COBCONFIG_=C:\work\TEST\PRG\myconfig.cfg
    
  6. コアダンプが生成されていることを確認します。
    >dir core.*
     ドライブ C のボリューム ラベルがありません。
     ボリューム シリアル番号は 3E69-2BF0 です
    
     C:\work\TEST\RELEASE のディレクトリ
    
    2019/07/17  16:17        18,863,928 core.552@161728_20190717
                   1 個のファイル          18,863,928 バイト
                   0 個のディレクトリ  40,419,274,752 バイトの空き領域
    
  7. Net Express を使用し、デバッグを行います。エラー発生したプログラムを作成したプロジェクトを開きます。
  8. メニューの[アニメート] > [アニメート開始]を選択してください。
  9. アニメーションの起動ポップアップが表示されますので、実行可能ファイルまたはプログラム名にフルパスで作成されたコアファイルを指定して、[OK]ボタンをクリックします。
  10. Net Expressのポップアップでエラーが表示されますので[OK]ボタンをクリックします。
  11. プログラムソースが表示され SUB2 の move spaces to lk-test01. で 114 エラーが発生していることがわかります。


製品マニュアルの参照箇所 - Visual COBOL


Visual COBOL 4.0 のマニュアルトップページは以下です。

・Visual COBOL 4.0 - マニュアルトップ
https://www.microfocus.co.jp/manuals/VC40/vc40indx.html

一般保護例外の詳細は下記のトピック配下をご参照下さい。

・記憶保護例外
https://www.microfocus.co.jp/manuals/VC40/Eclipse/GUID-27FBD013-7DF2-4FF7-9F4A-CA6E287FCF4C.html
マニュアルトップからは、[プログラミング] > [問題解決と診断ツール] > [記憶保護例外] に進んでください。

実行時チューナーの詳細は下記のトピック配下をご参照下さい。[実行時チューナーのリスト] に signal_regime 等の各種実行時チューナーの説明があります。

・実行時チューナー
https://www.microfocus.co.jp/manuals/VC40/Eclipse/GUID-FE176B48-9455-470A-855A-C0A62734DE51.html
マニュアルトップからは、[リファレンス] > [ランタイム システムの構成] > [実行時チューナー] に進んでください。

コア ダンプを使用したデバッグの詳細は下記のトピック配下をご参照下さい。
・コア ダンプを使用したデバッグ (Eclipse)
https://www.microfocus.co.jp/manuals/VC40/Eclipse/HHDGTHDEBG08.html
マニュアルトップからは、[IDE によるアプリケーションの開発] > [COBOL アプリケーションのデバッグ] > [デバッグ シナリオ] > [コア ダンプを使用したデバッグ] に進んでください。

・コア ダンプを使用したデバッグ (Visual Studio)
https://www.microfocus.co.jp/manuals/VC40/VS2017/HHDGCHDEBG09.html
マニュアルトップからは、[IDE によるアプリケーションの開発] > [COBOL アプリケーションのデバッグ] > [ネイティブ COBOL のデバッグ シナリオ] > [コア ダンプを使用したデバッグ] に進んでください。


製品マニュアルの参照箇所 - Enterprise Developer


Enterprise Developer 4.0 のマニュアルトップページは以下です。

・Enterprise Developer 4.0 - マニュアルトップ
https://www.microfocus.co.jp/manuals/ED40/ed40indx.html

一般保護例外の詳細は下記のトピック配下をご参照下さい。

・記憶保護例外
https://www.microfocus.co.jp/manuals/ED40/Eclipse/GUID-27FBD013-7DF2-4FF7-9F4A-CA6E287FCF4C.html
マニュアルトップからは、[プログラミング] > [問題解決と診断ツール] > [記憶保護例外] に進んでください。

実行時チューナーの詳細は下記のトピック配下をご参照下さい。[実行時チューナーのリスト] に signal_regime 等の各種実行時チューナーの説明があります。

・実行時チューナー
https://www.microfocus.co.jp/manuals/ED40/Eclipse/GUID-FE176B48-9455-470A-855A-C0A62734DE51.html
マニュアルトップからは、[リファレンス] > [ランタイム システムの構成] > [実行時チューナー] に進んでください。

コア ダンプを使用したデバッグの詳細は下記のトピック配下をご参照下さい。

・コア ダンプを使用したデバッグ (Eclipse)
https://www.microfocus.co.jp/manuals/ED40/Eclipse/HHDGTHDEBG08.html
マニュアルトップからは、[IDE によるアプリケーションの開発] > [COBOL アプリケーションのデバッグ] > [デバッグ シナリオ] > [コア ダンプを使用したデバッグ] に進んでください。

・コア ダンプを使用したデバッグ (Visual Studio)
https://www.microfocus.co.jp/manuals/ED40/VS2017/HHDGCHDEBG09.html
マニュアルトップからは、[IDE によるアプリケーションの開発] > [COBOL アプリケーションのデバッグ] > [ネイティブ COBOL のデバッグ シナリオ] > [コア ダンプを使用したデバッグ] に進んでください。


製品マニュアルの参照箇所 - Net Expresss

一般保護例外の詳細は、マニュアルトップから [プログラミング] > [保護違反] に進み、その配下の各トピックをご参照ください。

実行時チューナーの詳細は、マニュアルトップから [リファレンス] > [ランタイムシステムの構成] > [チューナによる実行時構成] に進み、その配下の各トピックをご参照ください。[実行時チューナー] に core_on_error 等の各種実行時チューナーの説明があります。

コア ダンプを使用したデバッグの詳細は、マニュアルトップから [Net Express の使用方法] > [プログラムのデバッグおよびアニメート] > [自動デバッグ] > [方法] > [コアダンプの作成およびアニメート] に進み、その配下のトピックをご参照ください。