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 を使用する例です。
- 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.
- サンプルプログラムを製品のコマンドプロンプトからコンパイルします。以下は、Visual COBOL コマンドプロンプト(32-Bit)の場合です。
>cbllink MAIN.cbl
>cbllink -d SUB1.cbl
>cbllink -d SUB2.cbl
>cbllink -d SUB3.cbl
- サンプルプログラムを実行し、114 エラーが発生することを確認します。 Just-In-Timeデバッガーのポップアップが表示されます。
>MAIN
実行 エラー: ファイル 'MAIN'
エラーコード: 114, pc=0, call=1, seg=0
114 メモリ領域外の項目にアクセスしようとしている (シグナル 11)
>
- エラーが発生すると 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 バイトの空き領域
>
- 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 ファイルが保存されている必要があります。
- 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.
- 作業用のワークスペースに、各プログラムのプロジェクトを作成し、サンプルプログラムをコンパイルします。
- サンプルプログラムを実行し、114 エラーが発生することを確認します。
>MAIN.exe
実行 エラー: ファイル 'SUB2'
エラーコード: 114, pc=0, call=1, seg=0
114 メモリ領域外の項目にアクセスしようとしている (シグナル 11)
>
- ランタイム構成ファイルを準備します。実行時チューナー:core_on_error と core_filename を使用し、コアダンプを出力する設定にしています。
>type myconfig.cfg
set core_on_error=3
set core_filename="core.%p@%t_%d"
>
- 環境変数:COBCONFIG_ にランタイム構成ファイルを設定します。
>set COBCONFIG_=C:\work\TEST\PRG\myconfig.cfg
- サンプルプログラムを実行します。 コアダンプが出力される旨のポップアップが開きます。
- コアダンプが生成されていることを確認します。
>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 バイトの空き領域
>
- Eclipse IDE を使用し、デバッグを行います。エラー発生したプログラムを作成したワークスペースを開きます。
- デバッグパースペクティブを開きます。メニューから [実行] > [デバッグ構成] を選択するとデバッグ構成ダイアログが開きます。 左ペインから「COBOL コアダンプ」をダブルクリックします。
- 作成されたコアダンプを指定して、[デバッグ]ボタンをクリックするとデバッガ実行時エラーのポップアップが表示されますので[OK]ボタンをクリックします。
- プログラムソースが表示され SUB2 の move spaces to lk-test01. で 114 エラーが発生していることがわかります。
Visual COBOL for Visual Studio とコアダンプを使用したデバッグ方法
Visual COBOL for Visual Studio でのコアダンプのデバッグ方法を紹介します。Visual COBOL for Visual Studio にはデバッグ機能があります。デバッグを行うためには、プロジェクト内にデバッグ用にコンパイルした実行モジュール、ソースファイル、idy ファイルが保存されている必要があります。
- 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.
- 作業用のソリューションに、各プログラムのプロジェクトを作成し、サンプルプログラムをコンパイルします。
- サンプルプログラムを実行し、114 エラーが発生することを確認します。
>MAIN.exe
実行 エラー: ファイル 'SUB2'
エラーコード: 114, pc=0, call=1, seg=0
114 メモリ領域外の項目にアクセスしようとしている (シグナル 11)
>
- ランタイム構成ファイルを準備します。実行時チューナー:core_on_error と core_filename を使用し、コアダンプを出力する設定にしています。
>type myconfig.cfg
set core_on_error=3
set core_filename="core.%p@%t_%d"
>
- 環境変数:COBCONFIG_ にランタイム構成ファイルを設定します。
>set COBCONFIG_=C:\work\TEST\PRG\myconfig.cfg
- サンプルプログラムを実行します。コアダンプが出力される旨のポップアップが開きます。
- コアダンプが生成されていることを確認します。
>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 バイトの空き領域
- Visual Studio IDE を使用し、デバッグを行います。エラー発生したプログラムを作成したソリューションを開きます。MAIN プロジェクトのプロパティを開き、デバッグタグを開きます。
- 開始動作の[外部プログラムの開始]を選択し、フルパスで作成されたコアファイルを指定してください。
- メニューの[デバッグ] > [開始]を選択してください。デバッガのポップアップが表示されますので[中断]ボタンをクリックします。
- プログラムソースが表示され SUB2 の move spaces to lk-test01. で 114 エラーが発生していることがわかります。
Net Express とコアダンプを使用したデバッグ方法
Net Express でのコアダンプのデバッグ方法を紹介します。Net Express にはデバッグ機能のアニメータがあります。デバッグを行うためには、プロジェクト内にデバッグ用にコンパイルした実行モジュール、ソースファイル、idy ファイルが保存されている必要があります。
- 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.
- 作業用のプロジェクトに各プログラムを追加し、MAIN は EXE 形式、SUB1 ~ SUB3 は DLL 形式でコンパイルします。
- サンプルプログラムを実行し、114 エラーが発生することを確認します。
>MAIN.exe
実行 エラー: ファイル 'SUB2'
エラーコード: 114, pc=0, call=1, seg=0
114 メモリ領域外の項目にアクセスしようとしている (シグナル 11)
>
- ランタイム構成ファイルを準備します。実行時チューナー:core_on_error と core_filename を使用し、コアを出力する設定にしています。
>type myconfig.cfg
set core_on_error=3
set core_filename="core.%p@%t_%d"
>
- 環境変数:COBCONFIG_ にランタイム構成ファイルを設定します。
>set COBCONFIG_=C:\work\TEST\PRG\myconfig.cfg
- コアダンプが生成されていることを確認します。
>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 バイトの空き領域
- Net Express を使用し、デバッグを行います。エラー発生したプログラムを作成したプロジェクトを開きます。
- メニューの[アニメート] > [アニメート開始]を選択してください。
- アニメーションの起動ポップアップが表示されますので、実行可能ファイルまたはプログラム名にフルパスで作成されたコアファイルを指定して、[OK]ボタンをクリックします。
- Net Expressのポップアップでエラーが表示されますので[OK]ボタンをクリックします。
- プログラムソースが表示され 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 の使用方法] > [プログラムのデバッグおよびアニメート] > [自動デバッグ] > [方法] > [コアダンプの作成およびアニメート] に進み、その配下のトピックをご参照ください。