(57)【要約】【課題】プログラムにおける障害要因箇所を特定する時間を短縮する技術を提供する。【解決手段】コンピュータに、コンパイラ２２により生成されたコード２６のうち、いずれかのコード２６の指定を受け付けると、いずれかのコード２６に対応した、少なくとも変数名を含む第１の機械語命令を生成し、生成した第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、生成した第１の機械語命令に含まれる変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令２７を生成する、処理を実行させる。【選択図】図８
2020052953.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成し、
生成した前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、生成した前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する、
処理を実行させる、生成プログラム。
【請求項２】
生成した前記第１の機械語命令に前記特定の種別ではない種別の変数名が含まれる場合に、生成した前記第１の機械語命令に含まれる前記特定の種別ではない種別の変数を特定の変数値情報とした、前記複数の第２の機械語命令を生成する、
処理を前記コンピュータに実行させる、請求項１に記載の生成プログラム。
【請求項３】
生成した前記複数の第２の機械語命令を特定の情報処理装置に送信する、
処理を前記コンピュータに実行させる、請求項１又は２に記載の生成プログラム。
【請求項４】
コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成する第１生成部と、
前記第１生成部によって生成された前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、前記第１生成部によって生成された前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する第２生成部と、
を備える、情報処理装置。
【請求項５】
コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成し、
生成した前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、生成した前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する、
生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、生成プログラム，情報処理装置及び生成方法に関する。
【背景技術】
【０００２】
プログラムのコンパイラにおいて障害が発生した場合には、保守担当者は、例えば、障害レポートに記述された障害の発生条件に基づき、運用中のシステムに影響がないかを検証する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００４−２２７１２９号公報
【特許文献２】特開平１−１９６６４１号公報
【特許文献３】特開昭５９−１６０２４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
保守担当者は、単純な発生条件を受け取った場合にはキーワード検索によって運用中のシステムに対する影響を検証するが、複雑な発生条件を受け取った場合にはキーワード検索を実施した後にロジックの検証を行なう。
【０００５】
プログラムがCommon Business Oriented Language（ＣＯＢＯＬ）やFormula Translating System（ＦＯＲＴＲＡＮ）等の利用頻度が減少している言語によって記述されている場合には、これらの言語を利用できる技術者が減少しているため、ロジックの検証に時間を要するおそれがある。
【０００６】
１つの側面では、プログラムにおける障害要因箇所を特定する時間を短縮する技術を提供することを目的とする。
【課題を解決するための手段】
【０００７】
生成プログラムは、コンピュータに、コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成し、生成した前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、生成した前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する、処理を実行させる。
【発明の効果】
【０００８】
１つの側面では、プログラムにおける障害要因箇所を特定する時間を短縮する技術を提供することができる。
【図面の簡単な説明】
【０００９】
【図１】関連例におけるコンパイラの障害調査の第１の例を説明する図である。
【図２】関連例におけるコンパイラの障害調査の第２の例を説明する図である。
【図３】図２に示したチェックツールを用いた検索処理を説明する図である。
【図４】図３に示した検索処理においてレジスタ値が可変の場合の処理を説明する図である。
【図５】関連例におけるプログラム毎の機械語の相違を説明する図である。
【図６】実施例における情報処理装置のハードウェア構成を模式的に示すブロック図である。
【図７】図６に示した情報処理装置の機能構成を模式的に示すブロック図である。
【図８】図６に示した情報処理装置における障害調査処理を説明するブロック図である。
【図９】図８に示したカスタムコンパイラにおける処理の詳細を説明するブロック図である。
【図１０】図８に示したマスク値及び機械語命令ブロックの予測リストの具体例を示す図である。
【図１１】ＣＯＢＯＬソースからのバイナリの生成処理を説明する図である。
【図１２】図６に示した情報処理装置における障害調査処理を説明するフローチャートである。
【図１３】マスク値及び機械語命令ブロックの予測リストの読み取り方法を説明する図である。
【図１４】機械語命令ブロックの比較処理を説明する図である。
【図１５】関連例における機械語命令ブロックと実施例における機械語命令ブロックとを比較する図である。
【発明を実施するための形態】
【００１０】
以下、図面を参照して一実施の形態を説明する。ただし、以下に示す実施形態はあくまでも例示に過ぎず、実施形態で明示しない種々の変形例や技術の適用を排除する意図はない。すなわち、本実施形態を、その趣旨を逸脱しない範囲で種々変形して実施することができる。
【００１１】
また、各図は、図中に示す構成要素のみを備えるという趣旨ではなく、他の機能等を含むことができる。
【００１２】
以下、図中において、同一の各符号は同様の部分を示しているので、その説明は省略する。
【００１３】
〔Ａ〕関連例
図１は、関連例におけるコンパイラ６１の障害調査の第１の例を説明する図である。
【００１４】
ユーザまたはベンダにおいてコンパイラ６１を使ってプログラムを翻訳して実行した結果、コンパイラ６１の障害が検出された場合（符号Ａ１参照）、コンパイラ開発者６２は、コンパイラ６１の障害が発生した条件を示す発生条件を生成する（符号Ａ２参照）。そして、コンパイラ開発者６２は、生成した発生条件をコンパイラ６１を使って開発する開発環境における保守要員６３に連絡する（符号Ａ３参照）。
【００１５】
保守要員６３は、受け取った発生条件に基づき、ＣＯＢＯＬ資産６４におけるキーワード検索を実施する（符号Ａ４参照）。ＣＯＢＯＬ資産６４は、運用環境におけるアプリケーション６５のプログラムから抽出され、ＣＯＢＯＬ言語によって記載されている。従来は多数のＣＯＢＯＬ技術者が存在していたため、人海戦術によって、ＣＯＢＯＬ資産６４の検索結果からロジック検証を行ない、コンパイラ６１の障害に影響するプログラム資産があるか判断できた（符号Ａ５及びＡ７参照）。一方、現在ではＣＯＢＯＬ技術者が不足しているため、ＣＯＢＯＬ資産６４の検索結果からのロジック検証は困難である（符号Ａ６及び符号Ａ７参照）。
【００１６】
図２は、関連例におけるコンパイラ６１の障害調査の第２の例を説明する図である。
【００１７】
コンパイラ６１において障害が検出された場合（符号Ｂ１参照）、コンパイラ開発者６２は、障害の原因を調査し、障害の発生条件を特定する。そして、コンパイラ開発者６２は、障害が発生する際に必ず生成される機械語命令が存在する場合には、コンパイラ６１を使って生成したアプリケーション６５がコンパイラ６１の障害に影響を受けて生成されたかを判断するために、障害に該当する時に必ず生成される機械語命令を検索するためのチェックツール６６を運用環境における保守要員６３に提供する（符号Ｂ２参照）。
【００１８】
保守要員６３は、提供されたチェックツール６６を用いて、アプリケーション６５における機械語命令を検索する。
【００１９】
図３は、図２に示したチェックツール６６を用いた検索処理を説明する図である。
【００２０】
図３に示すチェックツール６６は、検索条件（１）として、機械語命令「mov  dword ptr [rsp+XXXXXXXX],r11d」に対応するバイナリ「44899C24XXXXXXXX」を検索する。また、チェックツール６６は、検索条件（２）として、機械語命令「lea  rdx,[rsp+YYYYYYYY]」に対応するバイナリ「488D9424YYYYYYYY」を検索する。更に、チェックツール６６は、検索条件（３）として、機械語命令「mov  rcx,qword ptr [rsp+ZZZZZZZZ]」に対応するバイナリ「488B8C24ZZZZZZZZ」を検索する。なお、「XXXXXXXX」，「YYYYYYYY」及び「ZZZZZZZZ」は、任意のバイナリである。
【００２１】
チェックツール６６は、ファイルポインタをアプリケーション６５のプログラムの検索位置へ移動させる（ステップＳ１）。
【００２２】
チェックツール６６は、ファイルポインタをアプリケーション６５のプログラムにおいて、１バイト（Ｂｙｔｅ）ずつ移動させる（ステップＳ２）。
【００２３】
チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが「0x44」であるかを判定する（ステップＳ３）。
【００２４】
バイナリが「0x44」でない場合には（ステップＳ３のＮｏルート参照）、処理はステップＳ２へ戻る。
【００２５】
一方、バイナリが「0x44」である場合には（ステップＳ３のＹｅｓルート参照）、チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが検索条件（１）の「44899C24」に一致するかを判定する（ステップＳ４）。図３に示す例では、符号Ｃ１に示すように、アプリケーション６５のプログラムにおいて、「0x44」のバイナリが存在する。
【００２６】
バイナリが検索条件（１）に一致しない場合には（ステップＳ４のＮｏルート参照）、処理はステップＳ２へ戻る。
【００２７】
一方、バイナリが検索条件（１）に一致する場合には（ステップＳ４のＹｅｓルート参照）、チェックツール６６は、ファイルポインタを条件（１）の任意の文字列「XXXXXXXX」の４バイト分スキップさせる（ステップＳ５）。図３に示す例では、符号Ｃ２に示すように、アプリケーション６５のプログラムにおいて、条件（１）の「44899C24」のバイナリが存在する。また、符号Ｃ３に示すように、アプリケーション６５のプログラムにおいて、「AC010000」のバイナリがスキップされる。
【００２８】
チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが検索条件（２）の「488D9424」に一致するかを判定する（ステップＳ６）。
【００２９】
バイナリが検索条件（２）に一致しない場合には（ステップＳ６のＮｏルート参照）、処理はステップＳ２へ戻る。
【００３０】
一方、バイナリが検索条件（２）に一致する場合には（ステップＳ６のＹｅｓルート参照）、チェックツール６６は、ファイルポインタを条件（２）の任意の文字列「YYYYYYYY」の４バイト分スキップさせる（ステップＳ７）。図３に示す例では、符号Ｃ４に示すように、アプリケーション６５のプログラムにおいて、条件（２）の「488D9424」のバイナリが存在する。また、符号Ｃ５に示すように、アプリケーション６５のプログラムにおいて、「98020000」のバイナリがスキップされる。
【００３１】
チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが検索条件（３）の「488B8C24」に一致するかを判定する（ステップＳ８）。
【００３２】
バイナリが検索条件（３）に一致しない場合には（ステップＳ８のＮｏルート参照）、処理はステップＳ２へ戻る。
【００３３】
一方、バイナリが検索条件（３）に一致する場合には（ステップＳ８のＹｅｓルート参照）、チェックツール６６は、検索対象のバイナリを検出する（ステップＳ９）。
【００３４】
そして、チェックツール６６は、ステップＳ２〜Ｓ９における処理を、検査範囲の終端まで繰り返し実施する（ステップＳ１０）。
【００３５】
図４は、図３に示した検索処理においてレジスタ値が可変の場合の処理を説明する図である。
【００３６】
図４に示すチェックツール６６は、検索条件（１）として、機械語命令「mov  dword ptr [r0+XXXXXXXX],r1d」に対応するバイナリ「??89????XXXXXXXX」を検索する。また、チェックツール６６は、検索条件（２）として、機械語命令「lea  r2,[rsp+YYYYYYYY]」に対応するバイナリ「??8D????YYYYYYYY」を検索する。更に、チェックツール６６は、検索条件（３）として、機械語命令「mov  r3,qword ptr [r0+ZZZZZZZZ]」に対応するバイナリ「488B8C24ZZZZZZZZ」を検索する。なお、「XXXXXXXX」，「YYYYYYYY」，「ZZZZZZZZ」，「??」及び「????」は任意のバイナリである。また、「r0」，「r1d」，「r2」及び「r3」は、任意の文字列である。
【００３７】
チェックツール６６は、ファイルポインタをアプリケーション６５のプログラムの検索位置へ移動させる（ステップＳ１１）。
【００３８】
チェックツール６６は、ファイルポインタをアプリケーション６５のプログラムにおいて、１バイト（Ｂｙｔｅ）ずつ移動させる（ステップＳ１２）。
【００３９】
チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが「0x89」であるかを判定する（ステップＳ１３）。
【００４０】
バイナリが「0x89」でない場合には（ステップＳ１３のＮｏルート参照）、処理はステップＳ１２へ戻る。
【００４１】
一方、バイナリが「0x89」である場合には（ステップＳ１３のＹｅｓルート参照）、チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが検索条件（１）の「0x89????」に一致するかを判定する（ステップＳ１４）。
【００４２】
バイナリが検索条件（１）に一致しない場合には（ステップＳ１４のＮｏルート参照）、処理はステップＳ１２へ戻る。
【００４３】
一方、バイナリが検索条件（１）に一致する場合には（ステップＳ１４のＹｅｓルート参照）、チェックツール６６は、ファイルポインタを条件（１）の任意の文字列「XXXXXXXX」の４バイト分スキップさせる（ステップＳ１５）。
【００４４】
チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが検索条件（２）の「0x8D????」に一致するかを判定する（ステップＳ１６）。
【００４５】
バイナリが検索条件（２）に一致しない場合には（ステップＳ１６のＮｏルート参照）、処理はステップＳ１２へ戻る。
【００４６】
一方、バイナリが検索条件（２）に一致する場合には（ステップＳ１６のＹｅｓルート参照）、チェックツール６６は、ファイルポインタを条件（２）の任意の文字列「YYYYYYYY」の４バイト分スキップさせる（ステップＳ１７）。
【００４７】
チェックツール６６は、アプリケーション６５のプログラムにおいて、バイナリが検索条件（３）の「0x8B????」に一致するかを判定する（ステップＳ１８）。
【００４８】
バイナリが検索条件（３）に一致しない場合には（ステップＳ１８のＮｏルート参照）、処理はステップＳ１２へ戻る。
【００４９】
一方、バイナリが検索条件（３）に一致する場合には（ステップＳ１８のＹｅｓルート参照）、チェックツール６６は、検索対象のバイナリを検出する（ステップＳ１９）。
【００５０】
そして、チェックツール６６は、ステップＳ１２〜Ｓ１９における処理を、検査範囲の終端である「.text」まで繰り返し実施する（ステップＳ２０）。
【００５１】
図５は、関連例におけるプログラム毎の機械語の相違を説明する図である。
【００５２】
図５に示すように、プログラムＡ及びＢには、いずれも、中間コードα，β及びγが記述されている。しかしながら、中間コードβに示すように、コンパイラ６１はプログラム毎に最適なレジスタを割り当てるため、同一の中間コードであっても、異なる機械語が生成される場合がある。
【００５３】
すなわち、図４及び図５に示したように、機械語命令のフォーマットには、レジスタ情報が含まれる。レジスタが決まっていない機械語命令を検索する場合には、機械語命令のうちオペコード（別言すれば、「命令部」）の情報だけではバイナリの一致を判定できない。
【００５４】
〔Ｂ〕実施形態の一例
〔Ｂ−１〕システム構成例
図６は、実施例における情報処理装置１のハードウェア構成を模式的に示すブロック図である。
【００５５】
情報処理装置１は、Central Processing Unit（ＣＰＵ）１１，メモリ１２，表示制御部１３，記憶装置１４，入力Interface（Ｉ／Ｆ）１５，読み書き処理部１６及び通信Ｉ／Ｆ１７を備える。
【００５６】
メモリ１２は、記憶部の一例であり、例示的に、Read Only Memory（ＲＯＭ）及びRandom Access Memory（ＲＡＭ）を含む記憶装置である。メモリ１２のＲＯＭには、Basic Input/Output System（ＢＩＯＳ）等のプログラムが書き込まれてよい。メモリ１２のソフトウェアプログラムは、ＣＰＵ１１に適宜に読み込まれて実行されてよい。また、メモリ１２のＲＡＭは、一次記録メモリあるいはワーキングメモリとして利用されてよい。
【００５７】
表示制御部１３は、表示装置１３０と接続され、表示装置１３０を制御する。表示装置１３０は、液晶ディスプレイやOrganic Light-Emitting Diode（ＯＬＥＤ）ディスプレイ，Cathode Ray Tube（ＣＲＴ），電子ペーパーディスプレイ等であり、オペレータ等に対する各種情報を表示する。表示装置１３０は、入力装置と組み合わされたものでもよく、例えば、タッチパネルでもよい。
【００５８】
記憶装置１４は、例示的に、データを読み書き可能に記憶する装置であり、例えば、Hard Disk Drive（ＨＤＤ）やSolid State Drive（ＳＳＤ），Storage Class Memory（ＳＣＭ）が用いられてよい。
【００５９】
入力Ｉ／Ｆ１５は、マウス１５１やキーボード１５２等の入力装置と接続され、マウス１５１やキーボード１５２等の入力装置を制御する。マウス１５１やキーボード１５２は、入力装置の一例であり、これらの入力装置を介して、オペレータが各種の入力操作を行なう。
【００６０】
読み書き処理部１６は、記録媒体１６０が装着可能に構成される。読み書き処理部１６は、記録媒体１６０が装着された状態において、記録媒体１６０に記録されている情報を読み取り可能に構成される。本例では、記録媒体１６０は、可搬性を有する。例えば、記録媒体１６０は、フレキシブルディスク、光ディスク、磁気ディスク、光磁気ディスク、又は、半導体メモリ等である。
【００６１】
通信Ｉ／Ｆ１７は、外部装置との通信を可能にするためのインタフェースである。
【００６２】
ＣＰＵ１１は、種々の制御や演算を行なう処理装置であり、メモリ１２に格納されたOperating System（ＯＳ）やプログラム（例えば、「生成プログラム」及び「検索プログラム」）を実行することにより、種々の機能を実現する。
【００６３】
ＣＰＵ１１は例示的に情報処理装置１全体の動作を制御するための装置は、ＣＰＵ１１に限定されず、例えば、ＭＰＵやＤＳＰ，ＡＳＩＣ，ＰＬＤ，ＦＰＧＡのいずれか１つであってもよい。また、情報処理装置１全体の動作を制御するための装置は、ＣＰＵ，ＭＰＵ，ＤＳＰ，ＡＳＩＣ，ＰＬＤ及びＦＰＧＡのうちの２種類以上の組み合わせであってもよい。なお、ＭＰＵはMicro Processing Unitの略称であり、ＤＳＰはDigital Signal Processorの略称であり、ＡＳＩＣはApplication Specific Integrated Circuitの略称である。また、ＰＬＤはProgrammable Logic Deviceの略称であり、ＦＰＧＡはField Programmable Gate Arrayの略称である。
【００６４】
図７は、図６に示した情報処理装置１の機能構成を模式的に示すブロック図である。
【００６５】
情報処理装置１は、処理部１０としての機能を備える。図７に示すように、処理部１０は、第１生成部１１１，第２生成部１１２，第１取得部１１３，第２取得部１１４，算出部１１５，検索部１１６及び送信部１１７として機能する。
【００６６】
なお、これらの第１生成部１１１，第２生成部１１２，第１取得部１１３，第２取得部１１４，算出部１１５，検索部１１６及び送信部１１７として機能を実現するためのプログラムは、例えば前述した記録媒体１６０に記録された形態で提供される。そして、コンピュータは読み書き処理部１６を介してその記録媒体１６０からプログラムを読み取って内部記憶装置または外部記憶装置に転送し格納して用いる。また、そのプログラムを、例えば磁気ディスク，光ディスク，光磁気ディスク等の記憶装置（記録媒体）に記録しておき、その記憶装置から通信経路を介してコンピュータに提供してもよい。
【００６７】
第１生成部１１１，第２生成部１１２，第１取得部１１３，第２取得部１１４，算出部１１５，検索部１１６及び送信部１１７としての機能を実現する際には、内部記憶装置に格納されたプログラムがコンピュータのマイクロプロセッサによって実行される。このとき、記録媒体１６０に記録されたプログラムをコンピュータが読み取って実行してもよい。なお、本実施形態において、内部記憶装置はメモリ１２であり、マイクロプロセッサはＣＰＵ１１である。
【００６８】
第１生成部１１１は、コンパイラ２２により生成された中間コード２６のうち、いずれかの中間コード２６の指定を受け付けると、いずれかの中間コード２６に対応した、少なくとも変数名を含む機械語命令２５７を生成する。
【００６９】
なお、コンパイラ２２及び中間コード２６については、図８等を用いて後述する。また、第１生成部１１１における機能の詳細については、図８及び図９等を用いて後述する。
【００７０】
第２生成部１１２は、第１生成部１１１によって生成された機械語命令２５７に特定の種別の変数名が含まれる場合に、変数値の候補となる複数のバイナリ情報（「変数値情報」と称してもよい。）を変数名に対応付けて記憶するメモリ１２を参照する。変数値の候補となる複数のバイナリ情報は、アーキテクチャ（例えばインテル系など）毎に決められる。そして、第２生成部１１２は、第１生成部１１１によって生成された機械語命令２５７に含まれる変数名をそれぞれ変数名に対応付けられた複数のバイナリ情報とした、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を生成する。
【００７１】
第２生成部１１２は、第１生成部１１１によって生成された機械語命令に特定の種別ではない種別の変数名が含まれる場合に、第１生成部１１１によって生成された機械語命令に含まれる特定の種別ではない種別の変数を特定のバイナリ情報とした、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を生成する。
【００７２】
なお、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７については、図８及び図１０等を用いて後述する。また、第２生成部１１２における機能の詳細については、図８〜図１０等を用いて後述する。
【００７３】
第１取得部１１３は、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を取得する。また、第１取得部１１３は、マスク値２７２及び機械語命令ブロック２７３の長さ２７１を取得してもよい。なお、第１取得部１１３における機能の詳細については、図８及び図１０等を用いて後述する。
【００７４】
第２取得部１１４は、アプリケーション２４における検索対象のバイナリ情報を取得する。また、第２取得部１１４は、取得した長さと等しい特定の長さのバイナリ情報を、検索対象のバイナリ情報から抽出してもよい。なお、第２取得部１１４における機能の詳細については、図８等を用いて後述する。
【００７５】
算出部１１５は、第１取得部１１３によって取得されたマスク値２７２と、第２取得部１１４によって取得された検索対象のバイナリ情報の一部との論理積を算出する。また、算出部１１５は、抽出した特定の長さのバイナリ情報と、マスク値２７２との論理積を算出してもよい。なお、算出部１１５における機能の詳細については、図８及び図１０等を用いて後述する。
【００７６】
検索部１１６は、第１取得部１１３によって取得された機械語命令２５７と算出部１１５によって算出された論理積とを比較することにより、検索対象のバイナリ情報の中から特定のバイナリ情報を検索する。なお、検索部１１６における機能の詳細については、図８及び図１０等を用いて後述する。
【００７７】
送信部１１７は、第２生成部１１２によって生成されたマスク値２７２及び機械語命令ブロック２７３の予測リスト２７を他の情報処理装置（不図示）に送信する。
【００７８】
図８は、図６に示した情報処理装置１における障害調査処理を説明するブロック図である。
【００７９】
開発環境において、コンパイラ２２は、ＣＯＢＯＬソース２１をコンパイルして複数のオブジェクトを生成する。リンカ２３は、生成された複数のオブジェクトを結合して、アプリケーション２４に対して実行プログラムを提供する。
【００８０】
ベンダ環境において、カスタムコンパイラ２５は、中間コード２６に基づいたコンパイルを実行する（符号Ｄ１参照）。なお、コンパイラ２２とカスタムコンパイラ２５とは、同一のバージョンを有する。
【００８１】
図９は、図８に示したカスタムコンパイラ２５における処理の詳細を説明するブロック図である。
【００８２】
カスタムコンパイラ２５は、機械語生成部２５１，レジスタ割付部２５２，アドレス解決部２５３及びオブジェクト生成部２５４として機能する。
【００８３】
機械語生成部２５１，レジスタ割付部２５２及びアドレス解決部２５３は、図７に示した第１生成部１１１の一例として機能する。また、オブジェクト生成部２５４は、図７に示した第２生成部１１２の一例として機能する。
【００８４】
機械語生成部２５１は、中間コード２６に基づき、機械語命令の原型２５５（別言すれば、「レジスタ未解決及びアドレス未解決の機械語命令」）を生成する（符号Ｄ１１参照）。中間コード２６には、コンパイラ２２が独自に定義した機械語の疑似命令（別言すれば、「マクロ命令」）が含まれる。中間コードは、機械語命令と共に擬似アセンブラとしてファイルされる。すなわち、機械語生成部２５１は、機械語の疑似命令を機械語に展開する。
【００８５】
レジスタ割付部２５２は、生成された機械語命令の原型２５５を取得し（符号Ｄ１２参照）、仮想レジスタに全レジスタを割り当ててレジスタ割付機械語命令２５６を生成することにより、レジスタを解決する（符号Ｄ１３参照）。図９に示す例では、機械語命令の原型２５５における仮想レジスタ「r0w」に対して、レジスタ「ax」，「dx」，・・・「r15x」が割り当てられている。レジスタ「ax」，「dx」，・・・「r15x」などは、アーキテクチャ（例えばインテル系など）に応じて定まるものであり、このうち、未使用のレジスタが仮想レジスタ「r0w」に割り当てられる。
【００８６】
アドレス解決部２５３は、生成されたレジスタ割付機械語命令２５６を取得し（符号Ｄ１４参照）、ベースレジスタ及びインデックスレジスタに全レジスタを割り当てた場合の機械語命令２５７を生成して、アドレスを解決する（符号Ｄ１５参照）。
【００８７】
アドレス解決部２５３は、オフセット「xx」が１バイトであり、オフセット「yy」が１バイトである場合の機械語命令２５７を生成する。また、アドレス解決部２５３は、オフセット「xx」が１バイトであり、オフセット「yy」が４バイトである場合の機械語命令２５７を生成する。更に、アドレス解決部２５３は、オフセット「xx」が４バイトであり、オフセット「yy」が１バイトである場合の機械語命令２５７を生成する。また、アドレス解決部２５３はオフセット「xx」が４バイトであり、オフセット「yy」が４バイトである場合の機械語命令２５７を生成する。
【００８８】
図９に示す例では、レジスタ割付機械語命令２５６におけるレジスタ「[OPD2]」に対して、オフセット「xx」が１バイトであり、オフセット「yy」が１バイトである場合の機械語命令２５７において「[rax+xx]」，「[rbx+xx]」，・・・，「[r14x+xx]」，「[r15x+xx]」が割り当てられる。また、レジスタ割付機械語命令２５６におけるレジスタ「[OPD1]」に対して、オフセット「xx」が１バイトであり、オフセット「yy」が１バイトである場合の機械語命令２５７において「[rax+yy]」，「[rbx+yy]」，・・・，「[r14x+yy]」，「[r15x+yy]」が割り当てられる。
【００８９】
オブジェクト生成部２５４は、生成された機械語命令２５７を取得し（符号Ｄ１６参照）、図８に示すように、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を生成する（符号Ｄ２参照）。
【００９０】
図１０は、図８に示したマスク値２７２及び機械語命令ブロック２７３の予測リスト２７の具体例を示す図である。
【００９１】
オブジェクト生成部２５４は、取得した機械語命令２５７に基づき、バイナリ（別言すれば、「機械語命令ブロック２７３」）とマスク値２７２とバイナリの長さ２７１とをリスト化して、予測リスト２７を生成する。
【００９２】
図１０に示す例において、機械語命令ブロック２７３の長さ２７１には、「08」で示される８バイトや、「0A」で示される１０バイトを表す数値が登録されている。また、マスク値２７２には、８バイトの長さの「FFFFFF00FFFFFF00」や、１０バイトの長さの「FFFFFFFF00FFFFFFFF00」が登録されている。更に、械語命令語ブロック２７３には、「668B430066894300」や「668B500066895000」，「66448BBB00664489BB00」が登録されている。
【００９３】
マスク値２７２において「0x00」は任意の値が設定されることを示す可変部を示し、「0xFF」は特定の値が設定される可変部以外を示す。
【００９４】
図８に示すように、検索装置２８は、生成された予測リスト２７を取得し（符号Ｄ３参照）、アプリケーション２４のプログラムにおいて、対象のオブジェクトを検索する（符号Ｄ４参照）。
【００９５】
アプリケーション２４のプログラムにおいては、破線枠で示すように、コンパイラは検索開始位置を示す固定のバイナリを埋め込む。検索装置２８は、検索開始位置を検索して、検索対象のオブジェクトの先頭を参照する。
【００９６】
図８に示す例において、検索結果として検出される文字列は、アプリケーション２４のプログラムにおいて実線枠で示すように「66448BBB03664489BB01」であり、図１０の符号Ｄ４１で示すマスク値２７２と機械語命令ブロック２７３との論理積に一致する。実線枠で示した「66448BBB03664489BB01」のうち斜線枠で示す「03」及び「01」は、任意の値であってよい可変部を示す。
【００９７】
図１１は、ＣＯＢＯＬソース２１からのバイナリの生成処理を説明する図である。
【００９８】
図１１に示すように、コンパイラ２２は、Frontend（ＦＥ）部２２１，Backend（ＢＥ）部２２３として機能する。
【００９９】
ＦＥ部２２１は、ＣＯＢＯＬソース２１の入力に基づき、字句解析処理や意味解析処理等の種々の処理を行ない、中間コード２６を展開する。展開された中間コード２６には、２バイト以下の２進転記を示す「MVB2」や４バイト以下の２進加算を示す「ADDB4」等のプログラムが含まれる。
【０１００】
「ADDB4」のプログラム２２２は、２進データ項目であって、長さが４バイトであるため、「#ADD22 r0d, [OPD1], [OPD2]」が展開される。
【０１０１】
ＢＥ部２２３は、領域割付処理部２２３１，レジスタ割付処理部２２３２，第１機械語生成処理部２２３３及び第２機械語生成処理部２２３４として機能する。
【０１０２】
領域割付処理部２２３１は、データを割り付ける領域を決定する（符号Ｅ１参照）。図１１に示す例において、領域ｉはデータ領域やスタック領域である。オフセットは、領域ｉの先頭からの距離を示す。符号Ｅ１に示す状態では、ベースレジスタ（別言すれば、「領域の先頭を示すレジスタ」）は未定である。
【０１０３】
レジスタ割付処理部２２３２は、仮想レジスタとベースレジスタとを割り付ける（符号Ｅ２参照）。図１１に示す例では、符号Ｅ１に示した「［領域ｉ＋オフセット］」が、「[RBX+xxxx]」及び「[RBX+yyyy]」に設定される。
【０１０４】
第１機械語生成処理部２２３３は、符号Ｅ２に示した「#ADD22」を機械語命令に展開する（符号Ｅ３参照）。
【０１０５】
第２機械語生成処理部２２３４は、符号Ｅ３に示した機械語命令に基づき、バイナリ情報を生成する（符号Ｅ４参照）。
【０１０６】
〔Ｂ−２〕動作例
図６に示した情報処理装置における障害調査処理を、図１３及び図１４を参照しながら、図１２に示すフローチャート（ステップＳ２１〜Ｓ２８）に従って説明する。図１３は、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７の読み取り方法を説明する図である。また、機械語命令ブロック２７３の比較処理を説明する図である。
【０１０７】
検索装置２８は、予測リスト２７を一行ずつ読み込む（ステップＳ２１）。
【０１０８】
図１３の（Ａ）に示すように、予測リスト２７の各行においては、始めに、長さ２７１の先頭にファイルポインタ（ｆｐ）が移動される。次に、図１３の（Ｂ）に示すように、マスク値２７２の先頭にファイルポインタが移動され、本例における長さ２７１である８バイトのマスク値２７２が読み込まれる。そして、図１３の（Ｃ）に示すように、機械語命令ブロック２７３の先頭にファイルポインタが移動され、本例における長さ２７１である８バイトの機械語命令ブロック２７３が読み込まれる。
【０１０９】
検索装置２８は、アプリケーション２４におけるファイルポインタを検索位置へ移動させる（ステップＳ２２）。
【０１１０】
検索装置２８は、アプリケーション２４におけるファイルポインタを１バイト（byte）ずつ移動させる（ステップＳ２３）。
【０１１１】
検索装置２８は、予測リスト２７の機械語命令ブロック２７３の長さ２７１分、アプリケーション２４のプログラムが記録されたメモリ１２を読み込む（ステップＳ２４）。
【０１１２】
検索装置２８は、予測リスト２７の機械語命令ブロック２７３と、マスク値２７２によるマスク後のアプリケーション２４のバイナリとが等しいかを判定する（ステップＳ２５）。
【０１１３】
図１４に示すように、アプリケーション２４のバイナリとマスク値２７２との論理積が算出される（符号Ｆ１参照）。そして、マスク後のバイナリと予測リスト２７の機械語命令ブロック２７３とが比較される（符号Ｆ２参照）。
【０１１４】
マスク後の値が等しくない場合には（ステップＳ２５のＮｏルート参照）、処理はステップＳ２３へ戻る。
【０１１５】
一方、マスク後の値が等しい場合には（ステップＳ２５のＹｅｓルート参照）、検索装置２８は、アプリケーション２４のプログラムから検索対象のバイナリを検出する（ステップＳ２６）。
【０１１６】
検索装置２８は、アプリケーション２４のプログラムにおける検索範囲の終端まで、ステップＳ２３〜Ｓ２６における処理を繰り返す。
【０１１７】
検索装置２８は、予測リスト２７の最終行まで、ステップＳ２１〜Ｓ２７における処理を繰り返す。そして、障害調査処理は終了する。
【０１１８】
〔Ｂ−３〕効果
上述した実施形態の一例における情報処理装置１によれば、例えば、以下の作用効果を奏することができる。
【０１１９】
第１生成部１１１は、コンパイラ２２により生成された中間コード２６のうち、いずれかの中間コード２６の指定を受け付けると、いずれかの中間コード２６に対応した、少なくとも変数名を含む機械語命令２５７を生成する。第２生成部１１２は、第１生成部１１１によって生成された機械語命令２５７に特定の種別の変数名が含まれる場合に、変数値の候補となる複数のバイナリ情報を変数名に対応付けて記憶する記憶装置１４を参照する。そして、第２生成部１１２は、第１生成部１１１によって生成された機械語命令２５７に含まれる変数名をそれぞれ変数名に対応付けられた複数のバイナリ情報とした、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を生成する。
【０１２０】
これにより、プログラムにおける障害要因を特定するための時間を短縮できる。
【０１２１】
第２生成部１１２は、第１生成部１１１によって生成された機械語命令２５７に特定の種別ではない種別の変数名が含まれる場合に、第１生成部１１１によって生成された機械語命令２５７に含まれる特定の種別ではない種別の変数を特定のバイナリ情報とした、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を生成する。
【０１２２】
これにより、レジスタを割り当てる前の処理の障害を検索でき、チェックツールによる検証可能な障害の範囲が広がる。
【０１２３】
送信部１１７は、第２生成部１１２によって生成されたマスク値２７２及び機械語命令ブロック２７３の予測リスト２７を他の情報処理装置に送信する。
【０１２４】
これにより、検索装置２８としての機能が情報処理装置１以外の装置に備えられている場合においても、情報処理装置１以外の装置において、アプリケーション２４のプログラムを検索することができる。
【０１２５】
第１取得部１１３は、マスク値２７２及び機械語命令ブロック２７３の予測リスト２７を取得する。第２取得部１１４は、アプリケーション２４における検索対象のバイナリ情報を取得する。算出部１１５は、第１取得部１１３によって取得されたマスク値２７２と、第２取得部１１４によって取得された検索対象のバイナリ情報の一部との論理積を算出する。検索部１１６は、第１取得部１１３によって取得された機械語命令２５７と算出部１１５によって算出された論理積とを比較することにより、検索対象のバイナリ情報の中から特定のバイナリ情報を検索する。
【０１２６】
これにより、プログラムにおける障害要因を特定するための時間を短縮できる。
【０１２７】
第１取得部１１３は、マスク値２７２及び機械語命令ブロック２７３の長さ２７１を取得する。第２取得部１１４は、取得した長さと等しい特定の長さのバイナリ情報を、検索対象のバイナリ情報から抽出する。算出部１１５は、抽出した特定の長さのバイナリ情報と、マスク値２７２との論理積を算出する。
【０１２８】
これにより、機械語命令２５７をひと固まりのブロック（別言すれば、「長さ」）で検索するため、検索時間を短縮できる。
【０１２９】
図１５は、関連例における機械語命令と実施例における機械語命令とを比較する図である。具体的には、図１５の（Ａ）は、関連例における機械語命令の一例を示す図である。また、図１５の（Ｂ）は、実施例においてマルチスレッドオプションが指定された場合の中間コード２６から生成される機械語命令の一例を示す図である。更に、図１５の（Ｃ）は、実施例においてマルチスレッドオプションが指定されなかった場合の中間コード２６から生成される機械語命令の一例を示す図である。
【０１３０】
ユーザが指定する情報で機械語命令の展開が変わる場合には、オブジェクトに書き込まれた翻訳オプション情報等のユーザ指定情報が逐一参照されるため、ブロックの検索ができない。
【０１３１】
例えば、関連例において、図１５の（Ａ）に示す機械語命令の展開を検索する場合には、符号Ｇ１の機械語命令を検出した後に、コンパイラオプション（ＭＵＬＴＯＰＴ）の指定の有無を調べる。そして、ＭＵＬＴＯＰＴが指定されていれば、符号Ｇ２の機械語命令とのマッチング判定を行ない、ＭＵＬＴＯＰＴが指定されていなければ、符号Ｇ３の機械語命令とのマッチング判定を行なう。
【０１３２】
一方、上述した実施例においては、機械語命令２５７の生成に中間コード２６を使用する。中間コード２６には、オプション情報や環境変数等、中間コード２６がどのように振舞うのかを指定する情報が含まれているため、中間コード２６から生成される機械語命令２５７は固定される。図１５の（Ｂ）に示すように、ＭＵＬＴＯＰＴが指定されている場合の中間コード２６からは、固定の機械語命令２５７が生成される（符号Ｈ１〜Ｈ３参照）。また、図１５の（Ｃ）に示すように、ＭＵＬＴＯＰＴが指定されていない場合の中間コード２６からも、固定の機械語命令２５７が生成される（符号Ｉ１及びＩ２参照）。
【０１３３】
すなわち、上述した実施形態の一例においては、図１５の（Ｂ）及び（Ｃ）に示す両方の機械語命令２５７を検索装置２８に与えることで、ＭＵＬＴＯＰＴが指定されている場合と指定されている場合の両方の場合において、プログラムの検索ができる。
【０１３４】
〔Ｃ〕その他
開示の技術は上述した実施形態に限定されるものではなく、本実施形態の趣旨を逸脱しない範囲で種々変形して実施することができる。本実施形態の各構成及び各処理は、必要に応じて取捨選択することができ、あるいは適宜組み合わせてもよい。
【０１３５】
上述した実施形態の一例においてはＣＯＢＯＬソース２１のアプリケーション２４において障害の検索を行なったが、これに限定されるものではない。上述した実施形態の一例においては、種々の機械語で記述されるアプリケーション２４における障害の検索を行なうことができる。
【０１３６】
〔Ｄ〕付記
以上の実施形態に関し、さらに以下の付記を開示する。
【０１３７】
（付記１）
コンピュータに、
コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成し、
生成した前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、生成した前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する、
処理を実行させる、生成プログラム。
【０１３８】
（付記２）
生成した前記第１の機械語命令に前記特定の種別ではない種別の変数名が含まれる場合に、生成した前記第１の機械語命令に含まれる前記特定の種別ではない種別の変数を特定の変数値情報とした、前記複数の第２の機械語命令を生成する、
処理を前記コンピュータに実行させる、付記１に記載の生成プログラム。
【０１３９】
（付記３）
生成した前記複数の第２の機械語命令を特定の情報処理装置に送信する、
処理を前記コンピュータに実行させる、付記１又は２に記載の生成プログラム。
【０１４０】
（付記４）
コンピュータに、
検索対象の変数値情報を取得し、
マスク値及び機械語命令を取得し、
取得した前記マスク値と、取得した前記検索対象の変数値情報の一部との論理積を算出し、
取得した前記機械語命令と算出した前記論理積とを比較することにより、前記検索対象の変数値情報の中から特定の変数値情報を検索する、
処理を実行させる、検索プログラム。
【０１４１】
（付記５）
前記マスク値及び前記機械語命令の長さを取得し、
取得した前記長さと等しい特定の長さの変数値情報を、前記検索対象の変数値情報から抽出し、
抽出した前記特定の長さの変数値情報と、前記マスク値とについて、前記論理積を算出する、
処理を前記コンピュータに実行させる、付記４に記載の検索プログラム。
【０１４２】
（付記６）
コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成する第１生成部と、
前記第１生成部によって生成された前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、前記第１生成部によって生成された前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する第２生成部と、
を備える、情報処理装置。
【０１４３】
（付記７）
前記第２生成部は、前記第１生成部によって生成された前記第１の機械語命令に前記特定の種別ではない種別の変数名が含まれる場合に、前記第１生成部によって生成された前記第１の機械語命令に含まれる前記特定の種別ではない種別の変数を特定の変数値情報とした、前記複数の第２の機械語命令を生成する、
付記６に記載の情報処理装置。
【０１４４】
（付記８）
前記第２生成部によって生成された前記複数の第２の機械語命令を他の情報処理装置に送信する送信部
を更に備える、付記６又は７に記載の情報処理装置。
【０１４５】
（付記９）
マスク値及び機械語命令を取得する第１取得部と、
検索対象の変数値情報を取得する第２取得部と、
前記第１取得部によって取得された前記マスク値と、前記第２取得部によって取得された前記検索対象の変数値情報の一部との論理積を算出する算出部と、
前記第１取得部によって取得された前記機械語命令と前記算出部によって算出された前記論理積とを比較することにより、前記検索対象の変数値情報の中から特定の変数値情報を検索する検索部と、
を備える、情報処理装置。
【０１４６】
（付記１０）
前記第１取得部は、前記マスク値及び前記機械語命令の長さを取得し、
前記第２取得部は、取得した前記長さと等しい特定の長さの変数値情報を、前記検索対象の変数値情報から抽出し、
前記算出部は、抽出した前記特定の長さの変数値情報と、前記マスク値とについて、前記論理積を算出する、
付記９に記載の情報処理装置。
【０１４７】
（付記１１）
コンパイラにより生成されたコードのうち、いずれかのコードの指定を受け付けると、前記いずれかのコードに対応した、少なくとも変数名を含む第１の機械語命令を生成し、
生成した前記第１の機械語命令に特定の種別の変数名が含まれる場合に、変数値の候補となる複数の変数値情報を変数名に対応付けて記憶する記憶部を参照して、生成した前記第１の機械語命令に含まれる前記変数名をそれぞれ当該変数名に対応付けられた複数の変数値情報とした複数の第２の機械語命令を生成する、
生成方法。
【０１４８】
（付記１２）
生成した前記第１の機械語命令に前記特定の種別ではない種別の変数名が含まれる場合に、生成した前記第１の機械語命令に含まれる前記特定の種別ではない種別の変数を特定の変数値情報とした、前記複数の第２の機械語命令を生成する、
付記１１に記載の生成方法。
【０１４９】
（付記１３）
生成した前記複数の第２の機械語命令を特定の情報処理装置に送信する、
付記１１又は１２に記載の生成方法。
【０１５０】
（付記１４）
検索対象の変数値情報を取得し、
マスク値及び機械語命令を取得し、
取得した前記マスク値と、取得した前記検索対象の変数値情報の一部との論理積を算出し、
取得した前記機械語命令と算出した前記論理積とを比較することにより、前記検索対象の変数値情報の中から特定の変数値情報を検索する、
検索方法。
【０１５１】
（付記１５）
前記マスク値及び前記機械語命令の長さを取得し、
取得した前記長さと等しい特定の長さの変数値情報を、前記検索対象の変数値情報から抽出し、
抽出した前記特定の長さの変数値情報と、前記マスク値とについて、前記論理積を算出する、
付記１４に記載の検索方法。
【符号の説明】
【０１５２】
１        ：情報処理装置
１１      ：ＣＰＵ
１２      ：メモリ
１３      ：表示制御部
１３０    ：表示装置
１４      ：記憶装置
１５      ：入力Ｉ／Ｆ
１５１    ：マウス
１５２    ：キーボード
１６      ：読み書き処理部
１６０    ：記録媒体
１７      ：通信Ｉ／Ｆ
１０      ：処理部
１１１    ：第１生成部
１１２    ：第２生成部
１１３    ：第１取得部
１１４    ：第２取得部
１１５    ：算出部
１１６    ：検索部
１１７    ：送信部
２１      ：ＣＯＢＯＬソース
２２      ：コンパイラ
２３      ：リンカ
２４      ：アプリケーション
２５      ：カスタムコンパイラ
２６      ：中間コード
２７      ：予測リスト
２８      ：検索装置
２２１    ：ＦＥ部
２２２    ：プログラム
２２３    ：ＢＥ部
２５１    ：機械語生成部
２５２    ：レジスタ割付部
２５３    ：アドレス解決部
２５４    ：オブジェクト生成部
２５５    ：機械語命令の原型
２５６    ：レジスタ割付機械語命令
２５７    ：機械語命令
２７１    ：長さ
２７２    ：マスク値
２７３    ：機械語命令ブロック
２２３１  ：領域割付処理部
２２３２  ：レジスタ割付処理部
２２３３  ：第１機械語生成処理部
２２３４  ：第２機械語生成処理部
６１      ：コンパイラ
６２      ：コンパイラ開発者
６３      ：保守要員
６４      ：ＣＯＢＯＬ資産
６５      ：アプリケーション
６６      ：チェックツール
【図１】
2020052953.tif 000003
【図２】
2020052953.tif 000004
【図３】
2020052953.tif 000005
【図４】
2020052953.tif 000006
【図５】
2020052953.tif 000007
【図６】
2020052953.tif 000008
【図７】
2020052953.tif 000009
【図８】
2020052953.tif 000010
【図９】
2020052953.tif 000011
【図１０】
2020052953.tif 000012
【図１１】
2020052953.tif 000013
【図１２】
2020052953.tif 000014
【図１３】
2020052953.tif 000015
【図１４】
2020052953.tif 000016
【図１５】
2020052953.tif 000017