(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024012759
(43)【公開日】2024-01-31
(54)【発明の名称】ソフトウェア分析システム、ソフトウェア分析方法
(51)【国際特許分類】
G06F 11/36 20060101AFI20240124BHJP
【FI】
G06F11/36 180
G06F11/36 112
【審査請求】未請求
【請求項の数】12
【出願形態】OL
(21)【出願番号】P 2022114474
(22)【出願日】2022-07-19
(71)【出願人】
【識別番号】509186579
【氏名又は名称】日立Astemo株式会社
(74)【代理人】
【識別番号】110002572
【氏名又は名称】弁理士法人平木国際特許事務所
(72)【発明者】
【氏名】若林 昇
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042HH11
5B042HH20
5B042KK13
(57)【要約】
【課題】複数のソフトウェアの更新履歴が個別に管理されている場合であっても、不具合の原因となっているソフトウェアのバージョンを速やかに特定する。
【解決手段】本発明に係るソフトウェア分析システムは、性能テストによって第2ソフトウェアの性能低下を検出した場合、前記第2ソフトウェアの過去バージョンのうち第1ソフトウェアをマージして更新されたものを特定するか、または、前記第1ソフトウェアの参照情報が従前のものから変更されたものを特定することにより、低下原因となっている前記第1ソフトウェアの候補を特定する。
【選択図】
図4B
【特許請求の範囲】
【請求項1】
第1ソフトウェアの性能テストを実行する第1分析装置と、第2ソフトウェアの性能テストを実行する第2分析装置と、を有するソフトウェア分析システムであって、
前記第1分析装置は、
前記第1ソフトウェアの更新情報を含めたソフトウェアの情報を蓄積する第1リポジトリと、
前記第1ソフトウェアの更新情報に基づき前記第1リポジトリ内に蓄積された複数の第1ソフトウェアを探索する第1探索部とを備え、
前記第2分析装置は、
前記第2ソフトウェアの更新情報を含めたソフトウェアの情報を蓄積する第2リポジトリと、
前記第2ソフトウェアの更新情報に基づき前記第2リポジトリ内に蓄積された複数の第2ソフトウェアを探索する第2探索部とを備え、
前記第2探索部は、
前記第2ソフトウェアの性能テストを実行することにより、前記第2ソフトウェアの性能低下を検知した場合、
前記第2リポジトリ内にある前記更新情報を検索し、前記第1ソフトウェアの更新情報をマージして更新された1つ以上の古いバージョンの前記第2ソフトウェアを特定し、特定された前記古いバージョンの前記第2ソフトウェアのテストを実行し、前記第2ソフトウェアの性能劣化に寄与した前記第1ソフトウェアを特定し、
もしくは、前記第2リポジトリ内にある前記更新情報を検索し、前記第1ソフトウェアの参照情報が更新された1つ以上の古いバージョンの前記第2ソフトウェアと前記第1ソフトウェアとを特定し、
前記特定された前記第1ソフトウェアの情報を前記第1分析装置に送信し、
前記第1探索部は、
前記第2探索部より送信された前記特定された前記第1ソフトウェアの情報に基づき、前記第1リポジトリに格納された1つ以上の古いバージョンの前記第1ソフトウェアを特定し、
前記古いバージョンの前記第1ソフトウェアの性能テストを実行することにより、性能劣化をした前記第1ソフトウェアを特定する
ことを特徴とするソフトウェア分析システム。
【請求項2】
前記第2探索部は、前記古いバージョンの前記第2ソフトウェアのうち、前記第1ソフトウェアの更新情報をマージして更新されたものについてのみ、テストを実行することにより、前記古いバージョンの前記第2ソフトウェアのうち性能劣化しているバージョンと性能劣化していないバージョンをそれぞれ特定し、
前記第1探索部は、前記第2探索部が特定した、前記第2ソフトウェアのうち性能劣化しているバージョンと性能劣化していないバージョンそれぞれに対してマージされた前記第1ソフトウェアのバージョンを、前記第1リポジトリから探索する前記第1ソフトウェアのバージョンの両端として特定し、
前記第1探索部は、前記特定した両端の間にある前記第1ソフトウェアのバージョンに対して性能テストを実行することにより、性能劣化した前記第1ソフトウェアのバージョンを特定する
ことを特徴とする請求項1記載のソフトウェア分析システム。
【請求項3】
前記ソフトウェア分析システムは、前記古いバージョンの前記第2ソフトウェアのうち、前記第1ソフトウェアの更新情報をマージして更新されたものが、性能劣化していない場合は、前記第2ソフトウェアにおける性能劣化の原因は前記第2ソフトウェア側にあると推定する
ことを特徴とする請求項2記載のソフトウェア分析システム。
【請求項4】
前記ソフトウェア分析システムは、前記第1探索部が特定した前記両端の前記第1ソフトウェアのバージョンがいずれも性能劣化していない場合は、前記第2ソフトウェアにおける性能劣化の原因は前記第2ソフトウェア側にあると推定する
ことを特徴とする請求項2記載のソフトウェア分析システム。
【請求項5】
前記第2探索部は、前記第2ソフトウェアが呼び出す関数の呼び出し頻度についての統計を取得し、
前記第2探索部は、前記統計に含まれる関数のうち、前記第1ソフトウェアが提供しており、かつ、前記第2ソフトウェアのバージョンのうち性能劣化しているものと性能劣化していないものとの間で呼び出し頻度が所定値以上異なっているものを、劣化原因候補関数として特定し、
前記第1探索部は、前記劣化原因候補関数の更新履歴に基づき、前記両端間にある前記第1ソフトウェアのバージョンのうち前記劣化原因候補関数を従前バージョンから変更したものを、前記第2ソフトウェアにおける性能劣化の原因候補として特定する
ことを特徴とする請求項2記載のソフトウェア分析システム。
【請求項6】
前記第1探索部は、前記第1ソフトウェアが呼び出す関数の順序を記述したトレース情報を取得し、
前記第1探索部は、前記トレース情報に基づき、前記劣化原因候補関数を呼び出す呼出元関数を特定し、
前記第1探索部は、前記呼出元関数の更新履歴から、前記両端の間にある前記第1ソフトウェアのバージョンのうち前記呼出元関数を従前バージョンから変更したものを、前記第2ソフトウェアにおける性能劣化の原因候補として特定する
ことを特徴とする請求項5記載のソフトウェア分析システム。
【請求項7】
前記第1探索部は、前記両端間の前記第1ソフトウェアのバージョンにおいて、前記劣化原因候補関数が従前バージョンから変更されている場合は、前記呼出元関数を従前バージョンから変更した前記第1ソフトウェアのバージョンを探索することなく、前記劣化原因候補関数を従前バージョンから変更した前記第1ソフトウェアのバージョンを探索し、
前記第1探索部は、前記両端間の前記第1ソフトウェアのバージョンにおいて、前記劣化原因候補関数が従前バージョンから変更されていない場合は、前記呼出元関数を従前バージョンから変更した前記第1ソフトウェアのバージョンを探索する
ことを特徴とする請求項6記載のソフトウェア分析システム。
【請求項8】
前記参照情報は、前記第1ソフトウェアのシステムコール関数の変更情報、前記第1ソフトウェアが参照するOSの変更情報、前記第1ソフトウェアのコンパイラの変更情報、のうち少なくとも1つである
ことを特徴とする請求項1記載のソフトウェア分析システム。
【請求項9】
前記第1探索部は、前記参照情報として、前記第1ソフトウェアが参照するOSの設定変更を記述した変更情報、または、前記第1ソフトウェアのコンパイラのコンパイルオプションの変更を記述した変更情報、のうち少なくとも1つを取得し、
前記第1探索部は、前記両端間にある前記第1ソフトウェアのバージョンのうち、前記OSの設定または前記コンパイルオプションが従前バージョンから変更されたことを前記変更情報が記述しているものを、前記第2ソフトウェアにおける性能劣化の原因候補として特定する
ことを特徴とする請求項2記載のソフトウェア分析システム。
【請求項10】
前記第1探索部または前記第2探索部のうち少なくともいずれかは、前記探索の過程または前記テストの結果のうち少なくともいずれかを可視化した結果を出力する
ことを特徴とする請求項1記載のソフトウェア分析システム。
【請求項11】
前記第1探索部および前記第2探索部は、2分探索によって前記第1ソフトウェアおよび前記第2ソフトウェアを特定する
ことを特徴とする請求項1記載のソフトウェア分析システム。
【請求項12】
第1ソフトウェアの性能テストを実行する第1分析装置と、第2ソフトウェアの性能テストを実行する第2分析装置と、によってソフトウェアを分析するソフトウェア分析方法であって、
前記第1分析装置は、
前記第1ソフトウェアの更新情報に基づき、前記第1ソフトウェアの更新情報を含めたソフトウェアの情報を蓄積する第1リポジトリ内に蓄積された複数の第1ソフトウェアを探索するステップを実施し、
前記第2分析装置は、
前記第2ソフトウェアの更新情報に基づき、前記第2ソフトウェアの更新情報を含めたソフトウェアの情報を蓄積する第2リポジトリ内に蓄積された複数の第2ソフトウェアを探索するステップを実施し、
前記第2ソフトウェアを探索するステップにおいては、
前記第2ソフトウェアの性能テストを実行することにより、前記第2ソフトウェアの性能低下を検知した場合、
前記第2リポジトリ内にある前記更新情報を検索し、前記第1ソフトウェアの更新情報をマージして更新された1つ以上の古いバージョンの前記第2ソフトウェアを特定し、特定された前記古いバージョンの前記第2ソフトウェアのテストを実行し、前記第2ソフトウェアの性能劣化に寄与した前記第1ソフトウェアを特定し、
もしくは、前記第2リポジトリ内にある前記更新情報を検索し、前記第1ソフトウェアの参照情報が更新された1つ以上の古いバージョンの前記第2ソフトウェアと前記第1ソフトウェアとを特定し、
前記特定された前記第1ソフトウェアの情報を前記第1分析装置に送信し、
前記第1ソフトウェアを探索するステップにおいては、
前記第2分析装置より送信された前記特定された前記第1ソフトウェアの情報に基づき、前記第1リポジトリに格納された1つ以上の古いバージョンの前記第1ソフトウェアを特定し、
前記古いバージョンの前記第1ソフトウェアの性能テストを実行することにより、性能劣化をした前記第1ソフトウェアを特定する
ことを特徴とするソフトウェア分析方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェアの性能劣化の原因を分析する技術に関する。
【背景技術】
【0002】
複数のソフトウェアによって構成されている情報システムにおいては、性能劣化や不具合があるソフトウェアにおいて生じたとき、その原因が別のソフトウェアにある可能性も考えられる。例えば車両の動作を制御する電子制御装置(Electronic Control Unit:ECU)は、アプリケーションサイドのソフトウェア(以下ではASWと呼ぶ)、基盤システムサイドのソフトウェア(以下ではBSWと呼ぶ)、などのように、複数のソフトウェアが連携して動作する。例えばASWにおいて性能劣化が生じたとき、その原因がBSW側に起因する場合もある。
【0003】
下記特許文献1は、プログラムの性能問題の原因を特定する技術を記載している。同文献が記載している技術は、『経路決定装置(1)は、第1差分抽出部(21),経路抽出部(22)及び決定部(23)を備える。第1差分抽出部(21)は、第1プログラムのソースコードと第2プログラムのソースコードとの複数の差分箇所と、第2プログラムの第1カバレッジ情報とを取得する。第1差分抽出部(21)は第1カバレッジ情報を参照して、複数の差分箇所から第1カバレッジ情報に含まれる第1差分箇所を抽出する。経路抽出部(22)は、第2プログラムのソースコードから第1差分箇所から影響を受ける複数の影響経路(32)を、第1差分箇所(31)ごとに抽出する。決定部(23)は、第2プログラムの第2カバレッジ情報を取得し、経路抽出部(22)によって抽出された複数の影響経路のうち、第2カバレッジ情報に含まれる影響経路を除外する。』というものである(要約参照)。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
ソフトウェアの性能テストは、必ずしも頻繁に実施されるとは限らず、実施間隔がある程度の期間にわたる場合もある。特許文献1のような従来技術は、性能劣化の原因となるソフトウェア変更が比較的直近である場合を想定していると考えられる。そうすると、原因となったソフトウェア変更が分析時点からかなり前の時点である場合は、その変更箇所が変更差分箇所として抽出されず、原因箇所を発見することが困難となる可能性が考えられる。
【0006】
またシステムを構成する複数のソフトウェアがそれぞれ更新履歴を有する場合、ソフトウェアごとに更新履歴が管理されているので、別の開発者が担当しているソフトウェアにおいて性能劣化などの原因がある場合はその原因部分を特定することが困難または長時間を要する場合がある。
【0007】
本発明は、上記課題に鑑みてなされたものであり、複数のソフトウェアの更新履歴が個別に管理されている場合であっても、不具合の原因となっているソフトウェアのバージョンを速やかに特定することを目的とする。
【課題を解決するための手段】
【0008】
本発明に係るソフトウェア分析システムは、性能テストによって第2ソフトウェアの性能低下を検出した場合、前記第2ソフトウェアの過去バージョンのうち第1ソフトウェアをマージして更新されたものを特定するか、または、前記第1ソフトウェアの参照情報が従前のものから変更されたものを特定することにより、低下原因となっている前記第1ソフトウェアの候補を特定する。
【発明の効果】
【0009】
本発明に係るソフトウェア分析システムによれば、複数のソフトウェアの更新履歴が個別に管理されている場合であっても、不具合の原因となっているソフトウェアのバージョンを速やかに特定することができる。上記以外の課題、構成、効果などについては、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【0010】
【
図1】ECUが搭載しているソフトウェアの構成を模式的に示す図である。
【
図2】ソフトウェアの継続的インテグレーション(CI)を説明する模式図である。
【
図3】複数のソフトウェアがそれぞれ個別にバージョン管理されている場合の課題を説明する図である。
【
図4A】実施形態1において不具合の原因箇所を探索する手順を説明する概念図である。
【
図4B】実施形態1において不具合の原因箇所を探索する手順を説明する概念図である。
【
図5】従来の2分探索によってBSW側の問題個所を探索する手順を説明する概念図である。
【
図6A】実施形態2に係るソフトウェア分析手法において不具合の原因箇所を探索する手順を説明する概念図である。
【
図6B】実施形態2に係るソフトウェア分析手法において不具合の原因箇所を探索する手順を説明する概念図である。
【
図7】実施形態4に係るソフトウェア分析システム1の構成図である。
【
図8】分析装置200の動作を説明するフローチャートである。
【
図9】分析装置100の動作を説明するフローチャートである。
【
図10】性能劣化の原因となっている問題個所を特定した結果を可視化して提示する画面インターフェースの例である。
【発明を実施するための形態】
【0011】
<実施の形態1>
図1は、ECUが搭載しているソフトウェアの構成を模式的に示す図である。ECUは例えば、アプリケーションサイドのソフトウェア(ASW)と、基盤システムサイドのソフトウェア(BSW)とを搭載している。ASWとBSWとの間は、適当なインターフェースを介して、相互に(あるいは一方から他方に向けて)機能を提供することができる。例えばBSWがソフトウェア上の関数として提供する機能を、ASWが利用することができる。
【0012】
図2は、ソフトウェアの継続的インテグレーション(CI)を説明する模式図である。CIにおいて典型的には、ソースコードのバージョン管理ツール内に、ソースコードの変更履歴(例えば変更するごとのソースコード全文と差分箇所のマーク)を蓄積する。ソースコードをバージョン管理ツールへ登録する(その時点におけるバージョンを確定する)ことを、コミットと呼ぶ。コミットにともなって、自動テストツールを実行することにより、回帰テストや性能テストを実施する場合もある。このテストは、ソースコードの静的解析や、ビルド(ソースコードをコンパイルして実行可能形式とする)して実際にプログラムを実行することを含む。テスト結果は関係者(開発者など)に対して通知される。
【0013】
CIの上記仕組みは、自動テスト機能によって、不具合をチェックするための所要時間を抑制しつつも、不具合箇所はテスト結果として確実に報告され、かつテストの属人性を排除して均一なテスト品質を維持することができる。ただし、性能テストなど一部のテスト項目は、所要時間が長時間にわたる場合があるので、コミットごとにテストを実施することは困難であり、ある程度の間隔(例:2週間ごと、1か月ごと、など)を空けて実施されるのが一般的である。このようなテスト項目については、不具合を発見するまで、その時間間隔を要することになる。従来のソフトウェア分析手法は、この点について改善の余地があると考えられる。
【0014】
図3は、複数のソフトウェアがそれぞれ個別にバージョン管理されている場合の課題を説明する図である。バージョン管理ツールは一般に、例えば2分探索によって、問題があるバージョン(コミットの通番)のソースコードを探索する機能を備えている。
図3の例においては、最初にコミット(C1)したソースコードはテスト結果が問題なし(good)であったが、9回目にコミットしたソースコードは問題あり(bad)であった。バージョン管理ツールは、C9から遡って過去バージョン(典型的にはC1とC9との間の中間バージョン、
図3においてはC5)を取得してテストする。テスト結果が問題なしであれば、C5よりも前方(より新しい)の中間バージョン(
図3においてはC7)について、同様にテストする。この繰り返しにより、テスト結果が問題あるバージョンのうち最も古いもの(すなわちC9における問題の原因となっているバージョン)を特定することができる。このときのテストは、自動でも手動でもよい。
【0015】
図3のような2分探索による問題バージョンの探索は、効率的に問題個所を特定することができる。一方で、複数のソフトウェアが連動して動作し、かつ各ソフトウェアが個別にバージョン管理されている場合を想定する。この場合、開発しているソフトウェアのテスト時に不具合が発見されたとき、その不具合の原因が別ソフトウェア上にある可能性が考えられる。したがって、別ソフトウェアのバージョン管理ツール内を探索して問題個所を特定する必要がある。しかしバージョン管理ツールをまたいで効率的に問題個所を探索する手法は、これまで十分検討されていない。
【0016】
本発明の実施形態1に係るソフトウェア分析手法は、このような課題に鑑みて、連動動作する複数のソフトウェアがそれぞれ個別にバージョン管理されている場合において、性能テストなどの結果が問題ありの場合、その原因箇所を効率的に探索する手法を提供するものである。
【0017】
図4A~
図4Bは、本実施形態において不具合の原因箇所を探索する手順を説明する概念図である。開発者は
図1のASWを開発しており、ASWはBSWが提供する機能を利用する。ASWとBSWは、それぞれ個別のバージョン管理ツール(または同じバージョン管理ツール内の別インスタンスなど)によって、互いに独立してバージョン管理されている。ここでは、ASWの性能テストにおいて性能低下が発見され、その原因がBSW側にある場面を想定する。
【0018】
ASWがBSW側の機能を利用する場合、ASWをビルドまたはテストする際に、BSWを取り込んだ上でこれらを実施する場合がある。例えばBSW側のあるバージョンのソースコード(あるいはコンパイル済のバイナリ、クラスライブラリ、などのように、ASW側の実行時においてBSW機能を利用できるようにするためのもの)を、ASW側の開発環境へ取り込む場合がある。取込元のBSWバージョンと取込先のASWバージョンとの間の対応関係は、開発計画においてあらかじめ定めておけばよい。この例においては、ASWのコミットC2がBSWのコミットC1(
図4Bに示す)を取り込み、ASWのコミットC6がBSWのコミットC5(
図4Bに示す)を取り込むことを、あらかじめ規定済であるものとする。
【0019】
図4Aの開始時点において、過去に実施した初回コミットはテスト結果に問題なく(good)、9回目のコミット時に実施した性能テストにおいて問題が発見された(bad)ものとする。以下に説明する手順により、BSW側においてその問題の原因となったソースコードバージョンを探索する。ASW側において探索工程を実施するのは第2分析装置であり、BSW側において探索工程を実施するのは第1分析装置であるものとする。これらの分析装置の構成は後述する。後述するBSW側においても、BSWのコミットC1は性能テスト結果が良好であったことを前提とする。
【0020】
1回目の性能テストにおいて、第2分析装置は、ASWのソースコードの過去バージョンのうち、BSWを取り込んだものを特定する。ここではコミットC2とC6がこれに相当する。第2分析装置は、それらのうち最も古いもの(C2)について、性能テストを実施する。ここではテスト結果が良好であったものとする。
【0021】
2回目の性能テストにおいて、第2分析装置は、BSWを取り込んだ過去バージョンのうち最も新しいもの(ここではBSWを取り込んだバージョンがC2とC6の2つのみなので、C6が最も新しい)について、性能テストを実施する。ここではテスト結果が問題ありであったものとする。ASW側において実施する性能テストは、BSWを取り込んだバージョンについてのみとする。したがってASW側における性能テストは以上で完了する。
【0022】
ASW側におけるテスト対象は、BSWを取り込んだバージョンに限定するが、そのなかで探索対象(テスト対象)を選択する基準としては2分探索に準じる。すなわち第2分析装置は、2分探索によって、ASWソースコードのうちテスト対象とするものを選択する。例えば
図4Aにおいて、C2とC6以外にもBSWを取り込んだ過去バージョンがあれば、それらに対して2分探索の要領で、性能テストの対象を決定する。
【0023】
3回目の性能テスト(
図4B)において、第1分析装置は、BSWソースコードの過去バージョンのうちASW側へ取り込んだものの最新版(ここではBSWのコミットC5)について、性能テストを実施する。ここではテスト結果が問題ありであったものとする。そうするとBSW側においては、コミットC2~C5のうちいずれかの時点で、問題原因が発生したと推定することができる。以下の探索手順は2分探索と同様である。
【0024】
4回目の性能テストにおいて、第1分析装置は、BSWのコミットC2~C4のうち中間バージョン(ここではC3)について、性能テストを実施する。ここではテスト結果が良好であったとする。5回目の性能テストにおいて、第1分析装置は、C2~C5のうちテスト未実施のコミットC4について性能テストを実施する。ここではテスト結果が問題ありであったものとする。以上により、BSW側において問題原因となっているバージョンC4を特定できたことになる。
【0025】
図5は、従来の2分探索によってBSW側の問題個所を探索する手順を説明する概念図である。ASW側において第2分析装置は、コミットC9から開始する2分探索によって問題個所を探索する。ここでは、C9=>C5=>C7=>C6の順に、性能テストを実施することになる。以下の手順は
図4A~
図4Bと同様である。
図4Aとは異なり、ASW側における探索対象を、BSWとマージしたバージョンに限定していないので、C6の性能テストは3回目となる。したがって、
図4A~
図4Bよりも性能テストの実施回数が多いので、問題個所を発見するためにより長時間を必要とする。本実施形態はこの点において従来の2分探索よりも有利である。
【0026】
<実施の形態1:補足>
上記とは異なり、
図4Aの1回目の性能テストにおいて、C2の性能テスト結果が不良であれば、ASW側の不良個所のうち最も古いものはC2であることが、その時点で特定できる。したがって次は、BSW側のコミットC1について性能テストを実施すればよい。その上で、BSWのコミットC1が問題ありであればそれが問題原因であり、BSWのコミットC1が問題なしであればASWのコミットC2が問題原因ということになる。ソフトウェア分析システム1(例えばいずれかの探索部)は、その旨の推定結果を出力する。
【0027】
上記とは異なり、
図4Aの2回目の性能テストにおいて、C6の性能テスト結果が良好であれば、ASW側において最初に問題が生じたのはASW側のコミットC7~C9いずれかということになる。これらはBSWを取り込んでいないので、問題原因はASW側にあるということになる。ソフトウェア分析システム1(例えばいずれかの探索部)は、その旨の推定結果を出力する。この場合は、バージョン管理ツールをまたいで原因を探索する必要はないので、本発明が対象とする課題は生じない。
【0028】
上記とは異なり、
図4Bの3回目の性能テストにおいて、C5の性能テスト結果が良好であれば、BSW側には問題がないことになる。問題ないBSWソースコードC5をASWのC6へ取り込んだ結果、ASWのC6が問題ありとなったからである。ソフトウェア分析システム1(例えばいずれかの探索部)は、その旨の推定結果を出力する。
【0029】
<実施の形態1:まとめ>
本実施形態に係るソフトウェア分析手法は、BSW側において性能劣化の原因となっているバージョンを、2分探索に準じて自動的に探索する。これにより、問題個所を特定する技術の属人性を排除し、分析者の分析技能に依拠することなく問題個所を特定することができる。
【0030】
本実施形態に係るソフトウェア分析手法は、ASW側において探索対象とするコミットを特定する際に、2分探索に準じつつも、BSWを取り込んだバージョンのみについて探索対象とする。これにより、探索対象を絞り込むことができるので、問題個所を特定するために必要な時間を、従来よりも探索することができる。例えば
図5に示す従来手法は性能テストを6回実施しているのに対して、
図4A~
図4Bに示す本実施形態は5回で済んでいることが分かる。
【0031】
本実施形態に係るソフトウェア分析手法は、ASW側においてBSWを取り込んだバージョンを起点として、BSW側の過去バージョンを探索する。これにより、ASWとBSWがそれぞれ個別にバージョン管理されている場合であっても、バージョン管理ツールをまたいで、かつ効率的に、問題個所を特定することができる。
【0032】
本実施形態に係るソフトウェア分析手法は、ソースコードを変更するごと(コミットするごと)に性能テストを実施する必要はなく、ある時点において性能テスト結果が問題あることが分かれば、その時点から遡って問題個所を特定すれば足りる。例えば
図4A~
図4Bにおいて、コミットC9の時点で性能問題があることが分かると、過去バージョンに遡りながら性能テストを実施すれば足りる。したがって、性能テストを実施するために用いる実機(例:車載システムにおけるECU)を、性能テスト回数分だけ準備する必要はない。
【0033】
<実施の形態2>
図6A~
図6Bは、本発明の実施形態2に係るソフトウェア分析手法において不具合の原因箇所を探索する手順を説明する概念図である。本実施形態においては、実施形態1で説明した手順に加えて、ASW内で呼び出す関数のプロファイル情報を用いる。プロファイル情報は関数の呼び出し頻度の統計を記述した情報であり、例えばバージョン管理ツールがその統計を取得する機能を備えていればこれを用いればよい。あるいはテスト実行時に関数ごとの呼び出しを記録してもよい。その他は実施形態1と概ね同様であるので、前提条件などについては実施形態1に準じる。
【0034】
図6Aの開始時点において、第2分析装置は、ASWのコミットC9(性能テストによって問題が見つかった最新バージョン)のプロファイル情報を取得する。便宜上、ASWが提供する関数名は「asw_」から開始し、BSWが提供する関数名は「bsw_」から開始するものとしている。
【0035】
1回目の性能テストにおいて、第2分析装置は、
図4Aと同様にコミットC2をテストする。ここではテスト結果が問題なしであったものとする。第2分析装置は、コミットC2についてプロファイル情報を取得する。C9のプロファイル情報とC2のプロファイル情報を比較すると、関数bsw_func2の呼出頻度が、C2とC9との間で大きく変化し、C9における頻度が増加している。そうすると、この関数がC9における性能低下の原因になっているのではないかと推測することができる。
【0036】
2回目の性能テスト(
図6B)において、第1分析装置は、ASW側へ取り込んだBSW過去バージョンのうち最も新しいもの(
図6BにおいてはC5)について、性能テストを実施する。ここではテスト結果が問題ありであったものとする。そうすると、ASW側の性能劣化の原因はBSW側にあると想定され、かつプロファイル情報によれば、関数bsw_func2がその原因であると推定される。第1分析装置は、BSWのコミットC5よりも前について、関数bsw_func2の変更履歴を取得する。ここではコミットC1~C3については変更がなく、コミットC4において同関数を変更したものとする。
【0037】
3回目の性能テストにおいて、第1分析装置は、関数bsw_func2を変更したコミットC4について、性能テストを実施する。ここではテスト結果が問題ありであったものとする。そうすると、このバージョンが性能劣化の原因となっている可能性が大きいので、このバージョン(特に関数bsw_func2の変更箇所)について、詳細調査を実施すればよい。
【0038】
図6Aにおいては、関数bsw_func2が性能劣化の原因であると推定した。ただし関数の構造によっては、その関数を呼び出した呼出元関数が、性能劣化の原因となっている可能性も考えられる。例えば、呼出元関数は以前は別の関数を呼び出していたが、あるバージョン以降はbsw_func2を呼び出すように変更され、これによりASW側におけるbsw_func2の呼出頻度が増えたと仮定する。この場合、bsw_func2には問題がないにも関わらず、プロファイル情報上では同関数が劣化原因であるかのように見えるので、分析結果として妥当ではない。そこで本実施形態においては、このような場合における探索精度を高めるために、トレース情報を追加的に用いてもよい。
【0039】
トレース情報は、ASW(またはBSW)が関数を呼び出す順序を記述している。
図6Bに示す例において、第1分析装置は、2回目の性能テスト時に、コミットC5のトレース情報を取得する。トレース情報によれば、関数bsw_func2は、関数bsw_initから呼び出されている。そこで第1分析装置は、bsw_initについてコミットC5以前の変更履歴を取得する。ここではコミットC1~C3については変更がなく、コミットC4において同関数を変更したものとする。
【0040】
3回目の性能テストにおいて、第1分析装置は、関数bsw_initを変更したコミットC4について、性能テストを実施する。ここではテスト結果が問題ありであったものとする。そうすると、このバージョンが性能劣化の原因となっている可能性が大きいので、このバージョン(特に関数bsw_initの変更箇所)について、詳細調査を実施すればよい。
【0041】
bsw_initの変更履歴について調査するのは、bsw_func2を変更した履歴がない場合に限ってもよい。その場合は、bsw_func2が劣化原因ではないと想定されるからである。あるいはbsw_func2を変更したバージョンにおいて性能テストが問題なしであった場合に限り、bsw_initの変更履歴を調査してもよい。
【0042】
本実施形態2におけるソフトウェア分析手法は、性能テストの実施回数が3回であるので、実施形態1と比較してさらにテスト回数を削減することができる。
図5で説明した従来手法と比較すると、半分の回数で足りる。
【0043】
<実施の形態3>
実施形態2においては、ASWの性能劣化の原因を推定する根拠として、プロファイル情報またはトレース情報を用いることを説明した。関数の呼出順序に関する変更は、性能劣化の原因となり得るからである。その他に性能劣化の原因となり得るパラメータとしては、以下が挙げられる。
【0044】
(原因パラメータの例その1)ソースコードをコンパイルするとき、コンパイルオプションを指定する。例えば最適化オプションとして、コンパイル時間の短縮/バイナリサイズの削減/実行パフォーマンスの向上などのうちいずれを重視するかを指定する場合がある。コンパイルオプションが変更されると、それが実行時の性能劣化の原因となり得る。
【0045】
(原因パラメータの例その2)ソフトウェアを実行するOS(Operating System)上のメモリマップ(バイナリをメモリ上のどこに配置するかについての情報)や排他制御レベルを変更すると、それが実行時の性能劣化の原因となり得る。
【0046】
第1分析装置は、テスト対象とするBSWの過去バージョンを特定する際に、実施形態2で説明したトレース情報に代えてまたはこれと併用して、上記2つのパラメータのうち少なくともいずれかを用いてもよい。例えば
図6BにおいてC5のテスト結果が問題ありであった場合、コミットC2~C4のうちコンパイルオプションを変更した時点を、バージョン管理ツール上の変更履歴などを介して取得する。OSパラメータについても同様に取得できる。第1分析装置は、パラメータが変更された時点のコミットについて、性能テストを実施する。以後は実施形態2と同様である。
【0047】
<実施の形態4>
図7は、本発明の実施形態4に係るソフトウェア分析システム1の構成図である。ソフトウェア分析システム1は、実施形態1~3で説明したソフトウェア分析手法を実施するシステムであり、分析装置100と分析装置200によって構成されている。分析装置100は、BSW側のコミットを探索する装置であり、BSWの開発環境を兼ねている。分析装置200は、ASW側のコミットを探索する装置であり、ASWの開発環境を兼ねている。
【0048】
分析装置200(第2分析装置)は、ASWリポジトリ210(第2リポジトリ)、ソースコード取得部220、探索部230(第2探索部)、BSWマージ情報取得部240、テスト実行部250、疑義コミット情報送信部260、プロファイル取得部270を備える。ASWリポジトリ210は、ASWのバージョン管理ツールがASWのソースコードの過去バージョンを格納するデータベースである。ソースコード取得部220はASWリポジトリ210からASWのソースコードの各バージョンを取得する。探索部230は、実施形態1~3で説明した、2分探索によるテスト対象バージョンの探索(ASW側)を実施する。BSWマージ情報取得部240は、ASWの過去バージョンのうちBSWを取り込んだコミットを特定する。テスト実行部250はASWの性能テストを実施する。プロファイル取得部270は、実施形態2で説明したプロファイル情報を取得する。疑義コミット情報送信部260は、プロファイル情報において呼出頻度が基準値以上変化している(例:
図6AのC2においては10位だが、C9においては順位が5位以上上がっている)関数がある場合、その旨を分析装置100に対して通知する。
【0049】
分析装置100(第1分析装置)は、BSWリポジトリ110(第1リポジトリ)、ソースコード取得部120、探索部130(第1探索部)、OS情報取得部140、テスト実行部150、トレース取得部160を備える。BSWリポジトリ110は、BSWのバージョン管理ツールがBSWのソースコードの過去バージョンを格納するデータベースである。ソースコード取得部120はBSWリポジトリ110からBSWのソースコードの各バージョンを取得する。探索部130は、実施形態1~3で説明した、2分探索によるテスト対象バージョンの探索(BSW側)を実施する。OS情報取得部140は、実施形態3で説明した、OSパラメータおよびその変化点を取得する。コンパイルオプションおよびその変化点を併せて取得してもよい。テスト実行部150はBSWの性能テストを実施する。トレース取得部160は、実施形態3で説明したトレース情報を取得する。
【0050】
図8は、分析装置200の動作を説明するフローチャートである。ここでは1例として実施形態2で説明した手順を説明する。本フローチャートは、
図4A(または
図6A)の開始時点を初期状態として実施される。以下
図8の各ステップについて説明する。
【0051】
(
図8:ステップS801~S803)
BSWマージ情報取得部240は、ASWの過去バージョンのうちBSWを取り込んだコミットを特定する(S801)。探索部230は、ASW側における探索対象(テスト実施によって性能劣化の原因有無を調査する対象となるバージョン)を決定する(S802)。具体的には、ASWの過去バージョンのうちBSWを取り込んだものを、探索対象として決定する。探索対象を決定できた場合はS804へ進み(S803:Yes)、決定できなければS809へスキップする(S803:No)。
【0052】
(
図8:ステップS804~S807)
ソースコード取得部220は、探索対象コミットのASWソースコードを取得する(S804)。テスト実行部250は、テストに先立って設定すべきプロファイル情報がある場合はこれをセットした上で(S805)、探索対象コミットのテストを実施する(S806)。プロファイル情報取得もS805において実施することができる。テスト実行部250は、テスト結果が変化するまで、探索対象コミットを変えながらS802~S806を実施する(S807)。具体的には、探索対象コミットのうちテスト結果が問題なしのものと問題ありのものをそれぞれ特定するまで、2分探索の要領で探索を実施する。
【0053】
(
図8:ステップS808~S809)
探索部230は、プロファイル情報上の呼出頻度がC9におけるものと比較して基準値以上変化しているコミットを特定できるまで、S802~S807を実施する(S808)。
図6Aの例においては、関数bsw_func2の呼出頻度がC9におけるものと比較して大きく変化しているコミットC2を特定するまで、S802~S807を実施する。疑義コミット情報送信部260は、コミットを特定できた時点で、その旨および呼出頻度が大きく変化している関数名を、分析装置100に対して通知する(S809)。
【0054】
(
図8:ステップS809:補足)
実施形態1:補足において説明したように、ASW側における探索が終了し、BSW側においてそれ以上の探索を実施する必要がない場合もある。この場合は、S803において探索対象コミット:なしと判断し、S809においてBSW側に対してその旨を通知することにより、ソフトウェア分析システム1としての動作を終了することができる。
【0055】
図9は、分析装置100の動作を説明するフローチャートである。ここでは1例として
図8に対応するBSW側の動作(トレース情報を用いる動作例)を説明する。本フローチャートは、実施形態2において、探索するリポジトリをASW側からBSW側へ切り替えた時点(
図6Bにおいては2回目の性能テスト)で開始される。
【0056】
(
図9:ステップS901~S902)
探索部130は、BSW側における探索対象(テスト実施によって性能劣化の原因有無を調査する対象となるバージョン)を決定する(S901)。具体的には、S901を最初に実施するときは、ASW側においてテスト結果が問題ありであったバージョンに対して取り込まれているBSW側バージョンを探索開始点とする。2回目以後は、2分探索の要領で、テスト結果が問題ありとなっているバージョンを探索する。探索対象コミットがあればS903へ進み、なければS908へスキップする(S902)。
【0057】
(
図9:ステップS903~S907)
ソースコード取得部120は、探索対象コミットのBSWソースコードを取得する(S903)。テスト実行部150は、テストに先立って設定すべきトレース情報がある場合はこれをセットした上で(S904)、探索対象コミットのテストを実施する(S905)。トレース情報取得もS904において実施することができる。テスト実行部150は、テスト結果が問題あるコミットを特定した上で(
図6BにおいてはコミットC5)、それ以前のコミットにおいてトレース情報における呼出元関数(
図6Bにおいてはbsw_init)が変更された時点を特定するまで、S901~S905を実施する(S906)。探索部130は、次に探索する対象コミットを、呼出元関数が変化した時点のコミットとする(S907)。
図6Bにおいては、コミットC4を次の探索対象とする。
【0058】
(
図9:ステップS908)
探索部130は、以上の手順により、BSW側において性能劣化の原因となっている問題個所(問題があるバージョン)を特定する。探索部130は、特定した問題個所を記述したデータ、画面インターフェースなどを出力する。
【0059】
図10は、性能劣化の原因となっている問題個所を特定した結果を可視化して提示する画面インターフェースの例である。探索部130または230は、以上の手順によって特定した問題個所(BSW側において問題原因となっているバージョン)およびその探索過程を可視化し、例えば画面インターフェースとして提示することができる。可視化の具体的な内容としては、
図4A~
図4B、
図6A~
図6Bなどをそのまま提示してもよいし、これらの過程を時系列に沿って提示してもよい。あるいは可視化結果を記述したデータを出力し、別の装置上でこれを再現できるようにしてもよい。
【0060】
<本発明の変形例について>
本発明は、前述した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施形態の構成の一部を他の実施形態の構成に置き換えることが可能であり、また、ある実施形態の構成に他の実施形態の構成を加えることも可能である。また、各実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【0061】
以上の実施形態において、ソースコードのバージョンを2分探索によって探索する例を説明したが、その他の探索手法を用いる場合においても本発明を適用することができる。すなわち、以上の実施形態において説明した手法を用いて、探索対象とするバージョンを絞り込むことにより、2分探索以外の探索手法においても、以上の実施形態と同様の効果を発揮できる。
【0062】
以上の実施形態において、分析装置100と200が備える各機能部は、その機能を実装した回路デバイスなどのハードウェアによって構成することもできるし、その機能を実装したソフトウェアをCPU(Central Processing Unit)などの演算装置が実行することによって構成することもできる。
【0063】
以上の実施形態において、複数のソフトウェアによって構成されているシステムの例としてECUを例示したが、本発明はその他のソフトウェアシステムにおいても適用することができる。
【符号の説明】
【0064】
1:ソフトウェア分析システム
100:分析装置
110:BSWリポジトリ
130:探索部
200:分析装置
210:ASWリポジトリ
230:探索部