(58)【調査した分野】(Int.Cl.,DB名)
端末機と、前記端末機からソースコードを受信してロギングコードを埋め込むプリプロセッシングを行うビルドサーバとを備えたオートリソースロギングシステムであって、
前記ビルドサーバは、
前記端末機で実行されるソフトウェアの性能評価を行うための、当該ソフトウェアに対応するソースコードの計測区間を記憶する計測区間記憶部と、
前記ソースコード内で性能計測を行うためのロギングコードが記憶されたロギングコード記憶部と、
前記計測区間記憶部に記憶された計測区間を取得し、この取得した計測区間での性能評価のための計測によるログを出力する命令を行うロギングコードを、前記ロギングコード記憶部から取得し、この取得したロギングコードを、前記端末機から受信したソースコードに埋め込むプリプロセッシング処理を実行するプリプロセッシング機能部と、
を備えることを特徴とするオートリソースロギングシステム。
前記プリプロセッシング機能部は、前記計測区間記憶部に記憶された前記計測区間の指定がメソッド単位である場合、計測区間の呼び出し元プログラムの命令を受けて、計測対象の計測区間を有する複数の下位モジュールに対して、間接的に区間計測を可能とするプログラムを更に備えることを特徴とする請求項1に記載のオートリソースロギングシステム。
前記プリプロセッシング機能部は、前記ロギングコードによる区間計測のために必要な命令による区間計測実行時のオーバーヘッドを事前に計測し、この計測オーバーヘッドを用いて、前記端末機による実行ファイルの実行時に得られる計測結果を補正可能とするロギングコードを、前記ソースコードに埋め込むことを特徴とする請求項1〜4の何れか1項に記載のオートリソースロギングシステム。
端末機と、前記端末機からソースコードを受信してロギングコードを埋め込むプリプロセッシングを行うビルドサーバとを備えたオートリソースロギングシステムのオートリソースロギング方法であって、
前記ビルドサーバは、
前記端末機で実行されるソフトウェアの性能評価を行うための、当該ソフトウェアに対応するソースコードの計測区間を記憶する第1ステップと、
前記ソースコード内で性能計測を行うためのロギングコードを記憶する第2ステップと、
前記第1ステップで記憶された計測区間を取得し、この取得した計測区間での性能評価のための計測によるログを出力する命令を行うロギングコードを、前記第2ステップで記憶されたロギングコードから取得し、この取得したロギングコードを、前記端末機から受信したソースコードに埋め込むプリプロセッシング処理を実行する第3ステップ
を実行することを特徴とするオートリソースロギング方法。
【発明を実施するための形態】
【0027】
以下、本発明の実施形態を、図面を参照して説明する。
<実施形態の構成>
図1は、本発明の実施形態に係るオートリソースロギングシステムの構成を示すブロック図である。
図1に示すオートリソースロギングシステム10(単に、システム10ともいう)は、ユーザ端末機20と、ビルドサーバ30と、アカウント管理サーバ40とを備え、ソフトウェアにロギングコードを埋め込むロギング埋込を行うプリプロセッシング処理(前処理)を行うものである。ロギング埋込の処理は、端末機20に当該ソフトウェアを実行させる前に行われる。この処理を、オートリソースロギング処理という。ロギング埋込の処理内容については、後述する。
【0028】
ユーザ端末機20、ビルドサーバ30及びアカウント管理サーバ40は、有線や無線回線によるインターネット回線で接続されている。なお、アカウント管理サーバ40を管理サーバ40ともいい、ユーザ端末機20を端末機20ともいう。
【0029】
端末機20は、システム10のユーザが、アカウント情報の登録、更新、削除や認証(又は特定)要求等の各種操作を行う通信機能付のコンピュータである。この端末機20は、通信に係る処理を行う送受信部20a及びアカウント要求応答部20bと、本発明の特徴構成要素の実行ファイル実行処理部20cと、ソースコード記憶部20d、オーバーヘッド記憶部20e及びCSV記憶部20fを有する外部記憶部20gとを備える。なお、アカウント情報は、ユーザが、インターネット上のサーバやコンピュータへのログインを行う権利を得るための情報であり、ユーザのユーザID(Identification)やパスワードを含むものである。
【0030】
ビルドサーバ30は、端末機20からソースコードSCを受信し、性能評価対象のソフトウェア(プログラム)にロギングコードLCを埋め込むプリプロセッシングを行うサーバである。このビルドサーバ30は、通信に係る処理を行う送受信部30a及びアカウント要求応答部30bと、本発明の特徴であるオートリソースロギング処理に係るプリプロセッシング機能部30cと、計測区間記憶部30dと、閾値記憶部30eと、ロギングコード記憶部30fと、コンパイル機能部30hとを備える。
【0031】
管理サーバ40は、ユーザのアカウント情報の登録、更新、削除や認証等を行ってアカウントの管理を行うサーバであり、送受信部40a及びアカウント管理処理部40bを備える。
【0032】
ここで、端末機20、ビルドサーバ30及び管理サーバ40における通信を行うための処理であるアカウント情報の登録、更新、削除や認証等の各種処理について説明する。
【0033】
端末機20において、送受信部20aは、ユーザのアカウント登録や認証に係るアカウント情報並びに、その他、後述のようにビルドサーバ30との間で遣り取りされる各種情報を送受信する。
アカウント要求応答部20bは、ユーザのアカウント情報をビルドサーバ30を介して管理サーバ40へ登録、更新、削除や認証する要求の制御を行うと共に、管理サーバ40からビルドサーバ30を介して返信されてきたアカウント登録、更新、削除や認証の応答結果を表示する制御を行う。
【0034】
ビルドサーバ30において、送受信部30aは、端末機20又は管理サーバ40との間で遣り取りされる各種情報を送受信する。
アカウント要求応答部30bは、端末機20から送信されてきた登録要求情報に応じて、管理サーバ40にアカウント登録要求を行い、この登録要求に応じて管理サーバ40から返信されてきた登録応答情報を、端末機20へ送信する。また、アカウント要求応答部30bは、端末機20から送信されてきた認証要求情報に応じて、管理サーバ40にアカウント認証要求を行い、この認証要求に応じて管理サーバ40から返信されてきた認証応答情報を、端末機20へ送信する。
【0035】
管理サーバ40において、送受信部40aは、ビルドサーバ30との間で、上述したような各種情報を送受信する。
アカウント管理処理部40bは、アカウント情報に含まれるユーザIDやパスワードを事前登録する処理、ユーザIDに紐づきユーザ情報を更新する処理、ユーザIDに紐づきユーザ情報を削除する処理、ユーザID及びパスワードを用いてユーザの特定を行うアカウント認証の処理を行う。
【0036】
端末機20、ビルドサーバ30及び管理サーバ40による通信を行うためのアカウント情報の登録や認証等の処理について、
図2に示すシーケンス図を参照して詳細に説明する。
【0037】
図2において、端末機20のアカウント要求応答部20b(
図1)は、ステップS1,S2に示すように、ユーザのアカウント情報をビルドサーバ30を介して管理サーバ40へ登録する要求制御(アカウント登録要求)を行う。これに応じて、ステップS3に示すように、管理サーバ40がそのユーザのアカウント情報を登録する。管理サーバ40は、そのアカウント登録の結果を、ステップS4,S5に示すようにビルドサーバ30を介して端末機20へ応答(アカウント登録応答)する。端末機20のアカウント要求応答部20bは、ステップS6に示すように、その返信されてきたアカウント登録結果を表示する。
【0038】
また、端末機20のアカウント要求応答部20bは、ステップS7,S8に示すように、ユーザのアカウント情報を認証する要求制御(アカウント認証要求)をビルドサーバ30を介して管理サーバ40へ行う。これに応じて、ステップS9に示すように、管理サーバ40がそのユーザのアカウント情報の認証を行う。管理サーバ40は、そのアカウント認証の結果を、ステップS10,S11に示すようにビルドサーバ30を介して端末機20へ応答(アカウント認証応答)する。端末機20のアカウント要求応答部20bは、ステップS12に示すように、その返信されてきたアカウント認証結果を、端末機20の図示せぬ画面に表示する。認証結果がOKであれば後述する次の処理へ進む。
【0039】
図1に戻って、端末機20の本発明の特徴構成要素について説明する。
ソースコード記憶部20dは、コンピュータでの処理が不可能なプログラミング言語で記述されたソースコードSCを記憶するものである。このソースコードSCには、後述するビルドサーバ30においてロギングコードLCが埋め込まれる。ロギングコードLCは、ソフトウェアの性能計測のためのプログラムに基づくコードであって、ソフトウェアの性能評価に必要なログを出力するためのコードである。
【0040】
実行ファイル実行処理部20cは、ロギングコードLCが埋め込まれた実行ファイルEFを実行し、この結果得られるログである
図3に示す後述のメモリ解放CSV(Comma-Separated Value)並びに消費クロックCSVを、外部記憶部20gのCSV記憶部20fに記憶するものである。外部記憶部20gは、図示せぬ外部装置とのアクセスが可能な記憶部である。なお、消費クロックとは、ロギングコードLC自体で性能計測のために消費してしまう、CPUに割り当てられたCPUクロックである。
【0041】
メモリ解放CSVは、メモリの解放情報(解放サイズの情報)をCSVで表したものであり、実行ファイル実行処理部20cに保持された実行ファイルEFの実行により、作動中のコンピュータとしての端末機20のCSV記憶部20fにメモリ解放CSVとして記憶されるものである。CSVは、必要なデータをデータ形式やファイル形式で表すフォーマットである。消費クロックCSVについては後述する。
【0042】
メモリ解放CSVの一例を
図4に示す。
図4には、メモリ解放CSVの項目として、メモリアドレス、メモリサイズ、タイムスタンプ、ファイル名、クラス名、行番号があり、これら項目において、凡例及びデータ量を示した。なお、凡例及びデータ量の補足の説明内容も示した。
【0043】
図1に示すオーバーヘッド記憶部20eは、後述する計測オーバーヘッドOH(
図3参照)を記憶するものである。
【0044】
次に、ビルドサーバ30の本発明の特徴構成要素について説明する。
計測区間記憶部30dは、端末機20で指定されたソフトウェアの、計測区間情報(
図3参照)を記憶するものである。なお、計測区間記憶部30dは、複数の計測区間情報を記憶できるようになっている。計測区間情報は、ソフトウェアの計測区間が、設定し易く管理が容易なテキスト形式等で表されている。
【0045】
計測区間情報の一例は、次の括弧内の通りである。括弧内は、(ファイル名,計測区間の先頭の行番号,計測区間の末尾の行番号)となっている。
(mainModule.cpp,135,207),
(mainModule.cpp,205,205),
(subModule.cpp,1092,1100),
....
【0046】
計測区間情報の具体的な一例を
図5に示す。
図5には、計測区間情報の項目として、ファイル名、計測区間先頭行番号、計測区間末尾行番号があり、これら項目において、凡例及びデータ量を示した。なお、凡例及びデータ量の補足の説明内容も示した。
【0047】
閾値記憶部30eは、ソフトウェアの性能評価のために出力されるログのサイズを制限する出力閾値(
図3参照)を記憶するものである。例えば、出力閾値を3MBに設定すると、3MB未満のサイズのログは出力されず、3MB以上のログが出力されるようになる。例えば、メモリの解放サイズの小容量のものは、殆どがノイズであり、ログ出力させる必要はない。このため、出力閾値を大きく(例えば8MB)しておけば、ノイズのような小容量のメモリ解放情報はログ出力されないようになる。また、出力閾値を「異常な値」と設定しておけば、出力閾値以上のサイズのログが出力された際に、異常と判定することが可能となる。但し、これと逆に、出力閾値は、当該出力閾値を3MBに設定した場合に、3MB以下のサイズのログが出力され、3MB超のサイズのログは出力されないように定義してもよい。
【0048】
出力閾値の一例は、次の括弧内の通りである。括弧内は、(ファイル名,出力値の下限,出力値の上限)となっている。但し、出力値の下限及び上限の指定なしは、空白となっている。
(mainModule.cpp,1350000, ),
(mainModule.cpp, ,2050000),
(subModule.cpp,10920000,11000000),
....
【0049】
ロギングコード記憶部30fは、
図3に示す少なくとも1つ以上のロギングコードLCと、オーバーヘッドベンチマーク機能コード(ベンチマーク機能コードともいう)OBCとを記憶するものである。
【0050】
そのロギングコードLCの一例を
図6及び
図7に示す。
図6にはロギングコード(_ReleaseObject.h)LC1を、
図7にはロギングコード(_ReleaseObject.cpp)LC2を示した。
【0051】
図1に戻り、プリプロセッシング機能部30cは、メモリの大きな解放サイズを検出するために、ソフトウェアにロギングコードLCを埋め込むロギング埋込を行うプリプロセッシング処理を、端末機20に当該ソフトウェアを実行させる前に行うものである。
【0052】
即ち、プリプロセッシング機能部30cは、
図3に示すように、計測区間記憶部30dに記憶された計測区間の情報(計測区間情報)と、閾値記憶部30eに記憶された出力閾値とを取得する。更に、プリプロセッシング機能部30cは、その取得した計測区間で尚且つ出力閾値以上のサイズのログを出力するためのロギングコードLCを、ロギングコード記憶部30fから取得する。更に、プリプロセッシング機能部30cは、その取得したロギングコードLCを、端末機20のソースコード記憶部20dから受信したソースコードSCに埋め込むロギング埋込を行うプリプロセッシング処理を実行する。
【0053】
このロギング埋込の具体例を、
図8を参照して説明する。
図8に示すソースコードSCにおいて、矢印Y1で指し示す先頭の「Class::~Class(){」と、矢印Y2で指し示す末尾の「}」とはデストラクタである。デストラクタは、クラス名の先頭にチルダ「~」を付けた名前のメンバ関数であり、引数も戻り値も持たないものである。
【0054】
また、破線枠内の文字列はロギングコードLCであり、矢印Y3,Y4で指し示す「,」と「,」の間の文字列「abi::__cxa_demangle((typeid(*this)).name()」は関数である。この関数は、ソフトウェアの性能計測等を行うためのものである。
【0055】
ロギング埋込を行う場合、ステップ(1)において、ソースコードSCに、矢印Y1,Y2で指し示すデストラクタが記述されているか否かを、ソースコードSCの全てにおいて探索する。この探索は、チルダ「~」を検索することにより行う。
【0056】
ステップ(2)において、ソースコードSC内にデストラクタが記述されていた場合、先頭と末尾のデストラクタ間に、ロギングコードLCを埋め込む。
ステップ(3)において、対象のロギングコードLCの行頭に、「1回のみの読込命令」(例えば、#pragma once)が記述されていない場合、その#pragma onceを行頭に埋め込む。
【0057】
ステップ(4)において、対象のロギングコードLCの中に、「ヘッダファイル」(例えば、cxxabi.h)がインクルードされていない場合、#include <cxxabi.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(3)の#pragma onceが行頭に存在する場合、その#pragma onceの次行に、#include <cxxabi.h>を埋め込む。
【0058】
ステップ(5)において、対象のロギングコードLCの中に、上記ステップ(4)と異なる「ヘッダファイル」(例えば、sys/time.h)がインクルードされていない場合、#include <sys/time.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(3)の#pragma once又は(4)のcxxabi.hが行頭に存在する場合、その#pragma once又はcxxabi.hの次行に、#include <sys/time.h>を埋め込む。
【0059】
コンパイル機能部30hは、そのロギングコードLCが埋め込まれたソースコードSCをコンパイルして、コンピュータがプログラムとして解釈実行できる実行ファイルEFを生成し、この実行ファイルEFを端末機20へ出力する。
【0060】
実行ファイル実行処理部20cは、ロギングコードLCが埋め込まれた実行ファイルEFを実行処理する。この実行により、端末機20のソフトウェア上の指定された計測区間において、メモリの出力閾値(例えば3MB)以上のログが検出された場合、このログがメモリ解放CSVとして外部記憶部20gへ出力される。言い換えれば、メモリの異常な解放が検出される。
【0061】
このようにメモリの異常な解放を検出することにより、データ異常やプロセス異常を発見することができるので、ソフトウェアのバグ検出が可能となる。なお、プロセス異常とは、OS(Operating System)からメモリ領域等の割り当てを受けて処理を実行しているプログラムとしてのプロセスの異常をいう。マルチプロセスシステム(既存の電話系システム等)のプロセスは、プロセス毎にメモリ利用量に変動は無い傾向がある。しかし、これをシングルプロセスで実現した場合は、1プロセスで動作することもあり、データ数に応じて必要なメモリ容量がダイナミックに変動し、プロセス異常となるケースがある。
【0062】
次に、プリプロセッシング機能部30cは、後述するCPUクロック消費量の直接計測による検出を行うために、計測区間記憶部30dから計測区間を取得し、ソースコードSCにおける、その取得した計測区間の前後の行に、ロギングコード記憶部30fから取得したロギングコードLCのアセンブリコード(後述)を埋め込みする。一般的にロギングコードLCには、C++コードと、アセンブリコードとがあるので、本実施形態では、アセンブリコードを用いるようになっている。
【0063】
この際のロギングコードLCの一例を
図9及び
図10に示す。
図9にはロギングコード(_ClockAssign.h)LC3を、
図10にはロギングコード(_ClockAssign.cpp)LC4を示した。
【0064】
このロギング埋込の具体例を、
図11を参照して説明する。
図11に示すソースコードSCにおいて、矢印Y5で指し示す先頭の「Class::func(){」と、矢印Y6で指し示す末尾の「}」とはデストラクタである。
【0065】
また、破線枠内の文字列はロギングコードLCであり、破線枠AC0,AC1で囲んだ文字列は、ロギングコードLCのアセンブリコードである。
【0066】
ロギング埋込を行う場合、ステップ(11)において、計測区間記憶部30dに記憶された計測区間情報の、矢印Y7で指し示す計測対象の区間の前後に、破線枠AC0,AC1で囲むロギングコードLCのアセンブリコードを埋め込む。
【0067】
ステップ(12)において、対象のロギングコードLCの行頭に、「1回のみの読込命令」(例えば、#pragma once)が記述されていない場合、その#pragma onceを行頭に埋め込む。
【0068】
ステップ(13)において、対象のロギングコードLCの中に、「ヘッダファイル」(例えば、cxxabi.h)がインクルードされていない場合、#include <cxxabi.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(12)の#pragma onceが行頭に存在する場合、その#pragma onceの次行に、#include <cxxabi.h>を埋め込む。
【0069】
ステップ(14)において、対象のロギングコードLCの中に、上記ステップ(13)と異なる「ヘッダファイル」(例えば、sys/time.h)がインクルードされていない場合、#include <sys/time.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(2)の#pragma once又は(3)のcxxabi.hが行頭に存在する場合、その#pragma once又はcxxabi.hの次行に、#include <sys/time.h>を埋め込む。
【0070】
プリプロセッシング機能部30cは、更に、ロギングコード記憶部30fからベンチマーク機能コードOBCを取得し、これをロギングコードLCと関連付けてソースコードSCに埋め込む。
ベンチマーク機能コードOBCは、後述する実行ファイル実行処理部20cによる実行ファイルEFの実行時に、ロギングコードLCによるソフトウェアの区間計測の命令実行時のオーバーヘッドを事前に計測し、この計測されたオーバーヘッド(計測オーバーヘッドOH)で、ソースコードSC上の区間計測結果を補正するコードである。
【0071】
ここで、計測オーバーヘッドOHについて説明する。性能評価対象のソフトウエアにおいて、性能評価のために取得したい計測区間(例えば0〜1500クロック数の区間)を実測した際に、計測開始から終了まで1515クロック数だったすると、1515−1500=15の差分が、計測オーバーヘッドOHとなる。つまり、ソースコードSC上の区間計測結果から、計測オーバーヘッドOHを減算することにより、その区間計測結果を補正することができる。
【0072】
コンパイル機能部30hは、そのロギングコードLCが埋め込まれたソースコードSCをコンパイルして、コンピュータがプログラムとして解釈実行できる実行ファイルEFに変換し、この実行ファイルEFを端末機20の実行ファイル実行処理部20cへ出力する。
【0073】
実行ファイル実行処理部20cは、実行ファイルEFを実行する。この実行により、ロギングコードLCによるソフトウェアの区間計測が行われ、この際に、ベンチマーク機能コードOBCによるシングルトンの仕組み(後述する)が用いられて、ソースコードSC上の区間計測結果が補正される。
【0074】
シングルトンの仕組みとは、
図12に示す計測モジュールMM、ベンチマークモジュールBM、及びオーバーヘッド記憶部20eにより、オーバーヘッドのベンチマーク機能(後述する)を実現するものである。
【0075】
計測モジュールMMは、ソフトウェアの区間計測を、計測区間を呼び出す上位モジュールと下位モジュール(ここではベンチマークモジュールBM)との間にあって、間接的に区間計測を行うためのプログラムである。
ベンチマークモジュールBMとは、ロギングコードLC自体で測定のために消費してしまうCPUクロックを測定するためのプログラムである。
【0076】
即ち、シングルトンの仕組みとは、1回目のソフトウェアの区間計測時に、計測モジュールMMがベンチマークモジュールBM(後述)にアクセスして、その区間計測の命令実行時のオーバーヘッドを計測し、この計測オーバーヘッドOHをオーバーヘッド記憶部20eに記憶する。この記憶後、2回目以降のソフトウェアの区間計測時には、計測の都度、1回のみ、計測モジュールMMがオーバーヘッド記憶部20eにアクセスして計測オーバーヘッドOHを取得可能とする仕組みである。この仕組みの動作を行う機能がベンチマーク機能である。
【0077】
なお、オーバーヘッド記憶部20eに記憶される計測オーバーヘッドOHの一例を
図13及び
図14に示す。
図13には計測オーバーヘッドコード(_OverHead.h)OH1を、
図14には計測オーバーヘッドコード(_OverHead.cpp)OH2を示した。
【0078】
このベンチマーク機能によれば、実行ファイルEFの実行時に、ロギングコードLCに応じてソフトウェアの区間計測を行った際に、その区間計測の命令実行時の計測オーバーヘッドOHを、その計測区間上のCPUクロック数の計測結果から減算することで、計測結果が補正される。この補正後に、CPUクロック数の区間計測結果である消費クロックCSVを、CSV記憶部20fに記憶する。
【0079】
更に説明すると、実行ファイルEFの実行により、端末機20のソフトウェア上の指定された計測区間におけるCPUクロック数が検出される。この検出クロック数により、後述するCPUクロック消費量が検出され、このログが、消費クロックCSVとして外部記憶部20gへ出力される。
【0080】
ここで、CPUクロック消費量とは、例えば2.2GHz等の定格クロックをどれだけ消費したかを示す消費量であり、CPUの中に実装された図示せぬプログラムカウンタで計数する。このプログラムカウンタでの計数は、例えばクロックが論理回路を通過して元に戻った際にプログラムカウンタを1加算する。このように、CPUクロック消費量を検出することにより、プログラム(ソフトウェア)がどれだけCPUリソースを消費したかを把握することが可能となる。通常、OSで標準装備されているリソースモニタでは、プログラムがどれだけCPUリソースを消費したかをクロック数単位で把握することはできない。
【0081】
消費クロックCSVの一例を
図15に示す。
図15には、消費クロックCSVの項目として、クロック数、タイムスタンプ(開始)、タイムスタンプ(終了)、ファイル名、クラス名、行番号があり、これら項目において、凡例及びデータ量を示した。なお、凡例及びデータ量の補足の説明内容も示した。
【0082】
<実施形態の動作>
次に、本実施形態に係るオートリソースロギングシステム10によるオートリソースロギング処理の動作を、
図16〜
図17に示すフローチャートを参照して説明する。但し、端末機20、ビルドサーバ30及び管理サーバ40において、
図2のステップS1〜S12の処理は完了し、認証結果はOKであったとする。
【0083】
また、事前準備として、端末機20で指定されたソフトウェアの計測区間の情報(
図3の計測区間情報)が計測区間記憶部30dに記憶され、ソフトウェアの性能評価のために出力されるログのサイズを制限する出力閾値(
図3参照)が閾値記憶部30eに記憶され、更に、ロギングコードLC及びベンチマーク機能コードOBCがロギングコード記憶部30fに記憶されているとする。
【0084】
最初に、オートリソースロギング処理によって、端末機20におけるメモリの異常な解放の検出を行う際の動作について、
図16を参照して説明する。
【0085】
まず、
図16に示すステップS101において、端末機20からソースコードSCが送信(
図2のS13参照)されると、ビルドサーバ30のプリプロセッシング機能部30cは、そのソースコードSCを受信する。
【0086】
次に、ステップS102において、プリプロセッシング機能部30cは、計測区間記憶部30dに記憶された計測区間情報と、閾値記憶部30eに記憶された出力閾値とを取得する。更に、ステップS103において、プリプロセッシング機能部30cは、その取得した計測区間で且つ出力閾値以上のサイズのログを出力するためのロギングコードLCを、ロギングコード記憶部30fから取得する。
【0087】
次に、ステップS104において、プリプロセッシング機能部30cは、その取得したロギングコードLCを、端末機20から受信したソースコードSCに埋め込むロギング埋込を行う(
図2のS14参照)。
【0088】
次に、ステップS105において、
図3に示すように、コンパイル機能部30hは、ロギングコードLCが埋め込まれたソースコードSCを取得してコンパイルする。このコンパイルによりロギングコードLCが埋め込まれた実行ファイルEFが生成され、端末機20の実行ファイル実行処理部20cへ出力される(
図2のS16参照)。
【0089】
次に、ステップS106において、実行ファイル実行処理部20cは、実行ファイルEFを実行処理する(
図2のS17参照)。この実行により、ステップS107において、端末機20のソフトウェア上の指定された計測区間において、メモリの出力閾値以上の大きな解放サイズが検出されたか否かが判定される。
【0090】
この結果、メモリの出力閾値以上の大きな解放サイズが検出された場合、ステップS108において、その検出結果(ログ)がメモリ解放CSVとしてCSV記憶部20fへ出力される(
図2のS18参照)。言い換えれば、メモリの異常な解放がメモリ解放CSVとして出力される。このメモリ解放CSVとしてのメモリの異常な解放の検出情報により、データ異常やプロセス異常を発見することができ、ソフトウェアのバグ検出が可能となる。一方、検出されない場合、ログは出力されず、本処理は終了する。
【0091】
次に、オートリソースロギング処理によって、端末機20におけるCPUクロック消費量の直接計測による検出を行う際の動作について、
図17を参照して説明する。但し、初期条件において、オーバーヘッド記憶部20eには、計測オーバーヘッドOHは記憶されていないとする。
【0092】
まず、
図17に示すステップS201は、
図16のステップS101と同じ処理である。
次に、ステップS202において、プリプロセッシング機能部30cは、計測区間記憶部30dに記憶された計測区間情報を取得する。更に、ステップS203において、プリプロセッシング機能部30cは、その取得した計測区間でそのログを出力するためのロギングコードLCと、このロギングコードLCによる区間計測実行時のオーバーヘッドによる計測結果を補正するためのベンチマーク機能コードOBCとを取得する。
【0093】
次に、ステップS204において、プリプロセッシング機能部30cは、その取得したロギングコードLC及びベンチマーク機能コードOBCを、端末機20から受信したソースコードSCに埋め込むロギング埋込を行う。
【0094】
次に、ステップS205において、
図3に示すように、コンパイル機能部30hは、ソースコードSCを取得してコンパイルする。このコンパイルによりロギングコードLC及びベンチマーク機能コードOBCが埋め込まれた実行ファイルEFが生成され、端末機20の実行ファイル実行処理部20cへ出力される。
【0095】
ステップS206において、実行ファイル実行処理部20cは、実行ファイルEFを実行処理する。この実行により、ステップS207において、ロギングコードLCによるソフトウェアの区間計測の命令実行時のオーバーヘッドが計測され、この計測オーバーヘッドOHがオーバーヘッド記憶部20eに記憶される。
【0096】
ステップS208において、実行ファイル実行処理部20cは、上記ステップS207の計測オーバーヘッドOHを用い、上記ソフトウェアの区間計測の命令実行時の、計測区間上のCPUクロック数の計測結果を補正する。即ち、計測区間上のCPUクロック数の計測結果から計測オーバーヘッドOHを減算することで、計測結果を補正する。
【0097】
この補正後に、ステップS209において、実行ファイル実行処理部20cは、CPUクロック数の区間計測結果である消費クロックCSVを、CSV記憶部20fに出力して記憶する。この記憶された消費クロックCSVからCPUクロック消費量を認識することができる。
【0098】
但し、実行ファイルEFの実行時に、オーバーヘッド記憶部20eに計測オーバーヘッドOHが記憶されていれば、この記憶された計測オーバーヘッドOHを用いて上記ステップS208の補正を行う。一方、計測オーバーヘッドOHが記憶されていなければ、上記ステップS207のオーバーヘッドの計測を行って記憶し、上記ステップS208の補正を行う。
【0099】
<CPUクロック消費量の他の検出処理例>
次に、CPUクロック消費量を間接計測で検出する際の処理について説明する。
【0100】
本例では、プリプロセッシング機能部30cが、計測区間記憶部30dから計測区間情報を取得する際に、その計測区間情報の取得の指定が、ある纏まりのメソッド単位である場合、計測区間情報の呼び出し元プログラムの命令を受けて、間接的に区間計測を可能とするプログラムを備え、CPUクロック消費量を間接計測により検出できるようにした。
【0101】
この構成は、
図18に示すように、呼び出し元プログラムとしての上位モジュールJMと、区間計測対象がモジュール単位(又はメソッド単位)である場合、これに対応した複数の下位モジュールKM1〜KM4と、上位モジュールJMと下位モジュールKM1〜KM4との間に介在された計測モジュールMMAとを備えて成る。なお、計測モジュールMMAは、請求項記載の間接的に区間計測を可能とするプログラムである。
【0102】
計測モジュールMMAは、上位モジュールJMから矢印Y21で示す区間計測の命令を受けて、同種の下位モジュールKM1,KM2の各々に、矢印Y21a,Y21bで示すように区間計測の命令を行うものである。これにより、ビルド範囲を局所化し、ビルド時間の短縮できるようになっている。計測モジュールMMAは、破線枠W1で囲むように、上位モジュールJMと同一ファイル内に埋め込まれている。
なお、計測モジュールMMAが存在しない通常の場合は、矢印Y22,Y23で示すように、上位モジュールJMから、下位モジュールKM3、KM4毎に区間計測の命令を行う。
【0103】
ここで、プリプロセッシング機能部30cの上位モジュールJMが、
図18に示した構成を用いて、ソースコードSCに、ロギングコード記憶部30fから取得したロギングコードLCを埋め込む場合の具体例を、
図19を参照して説明する。
図19に示すソースコードSCにおいて、矢印Y8で指し示す先頭の「void __check(void *l_func()){」と、矢印Y9で指し示す末尾の「}」とはメソッド__checkの末尾である。
【0104】
また、破線枠内の文字列はロギングコードLCであり、破線枠AC0,AC1で囲んだ文字列は、ロギングコードLCのアセンブリコードである。
【0105】
まず、ステップ(21)において、計測区間記憶部30dに記憶された計測区間情報の、矢印Y10で指し示す計測対象の区間(l_func();)の前後に、破線枠AC0,AC1で囲むロギングコードLCのアセンブリコードを埋め込む。
【0106】
ステップ(22)において、対象のロギングコードLCの行頭に、「1回のみの読込命令」(例えば、#pragma once)が記述されていない場合、その#pragma onceを行頭に埋め込む。
【0107】
ステップ(23)において、対象のロギングコードLCの中に、「ヘッダファイル」(例えば、cxxabi.h)がインクルードされていない場合、#include <cxxabi.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(22)の#pragma onceが行頭に存在する場合、その#pragma onceの次行に、#include <cxxabi.h>を埋め込む。
【0108】
ステップ(24)において、対象のロギングコードLCの中に、上記ステップ(23)と異なる「ヘッダファイル」(例えば、sys/time.h)がインクルードされていない場合、#include <sys/time.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(22)の#pragma once又は(23)のcxxabi.hが行頭に存在する場合、その#pragma once又はcxxabi.hの次行に、#include <sys/time.h>を埋め込む。
【0109】
次に、計測モジュールMMAが、上位モジュールJMから区間計測の命令を受けて、同じ種類の下位モジュールKM1,KM2の各々に区間計測を可能とする際のコードの具体例を次に示し、その埋め込みを説明する。
【0110】
int main(){
・・・
func1(); −> __check(func1);(*1)
func2(); −> __check(func2);(*2)
func3();
func4();
・・・
}
【0111】
まず、ステップ(31)において、計測区間記憶部30dに記憶されたメソッドの呼び出し元ファイル(プログラム)のメソッドを、上記コードの符号*1,*2で示す行のように書き換える。
【0112】
ステップ(32)において、対象のロギングコードLCの行頭に、「1回のみの読込命令」(例えば、#pragma once)が記述されていない場合、その#pragma onceを行頭に埋め込む。
【0113】
ステップ(33)において、対象のロギングコードLCの中に、「ヘッダファイル」(例えば、cxxabi.h)がインクルードされていない場合、#include <cxxabi.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(32)の#pragma onceが行頭に存在する場合、その#pragma onceの次行に、#include <cxxabi.h>を埋め込む。
【0114】
ステップ(34)において、対象のロギングコードLCの中に、上記ステップ(33)と異なる「ヘッダファイル」(例えば、sys/time.h)がインクルードされていない場合、#include <sys/time.h>を、対象のロギングコードLCの中に埋め込む。但し、上記ステップ(32)の#pragma once又は(33)のcxxabi.hが行頭に存在する場合、その#pragma once又はcxxabi.hの次行に、#include <sys/time.h>を埋め込む。
【0115】
この後、プリプロセッシング機能部30cは、更に、ロギングコード記憶部30fからベンチマーク機能コードOBCを取得し、これをロギングコードLCと関連付けてソースコードSCに埋め込む。後の処理は、前述したCPUクロック消費量の直接計測による検出時の処理と同じである。
【0116】
<実施形態の効果>
以上説明した本実施形態のオートリソースロギングシステム10は、端末機20と、端末機20からソースコードSCを受信してロギングコードLCを埋め込むプリプロセッシングを行うビルドサーバ30とを備える。
【0117】
本実施形態の特徴は、ビルドサーバ30が、端末機20から指定され、当該端末機20で実行されるソフトウェアの性能評価を行うための、当該ソフトウェアに対応するソースコードSCの計測区間を記憶する計測区間記憶部30dと、ソースコードSC内で性能計測を行うためのロギングコードLCが記憶されたロギングコード記憶部30fと、計測区間記憶部30dに記憶された計測区間を取得し、この取得した計測区間での性能評価のための計測によるログを出力する命令を行うロギングコードLCを、ロギングコード記憶部30fから取得し、この取得したロギングコードLCを、端末機20から受信したソースコードSCに埋め込むプリプロセッシング処理を実行するプリプロセッシング機能部30cとを備える構成とした。
【0118】
この構成によれば、ソースコードSCに対応するソフトウェアの性能評価のための計測区間を容易に管理することができる。また、ソフトウェアへのロギングコードLCの埋め込みを容易に行うことができる。更に、端末機20のユーザが指定する任意の区間のみの計測が可能となるので、計測オーバーヘッドを最小化できる。言い換えれば、計測オーバーヘッドを減少させることができる。
【0119】
また、ロギングコードLCは、ソフトウェアの計測区間のクロック数を計測するコードを有することとした。
これによって、端末機20のCPUクロック消費量を検出することができるので、プログラム(ソフトウェア)がどれだけCPUリソースを消費したかを把握することができる。
【0120】
また、ビルドサーバ30は、端末機20から指定された計測区間のログを出力する条件としての出力閾値を記憶する閾値記憶部30eを更に備え、プリプロセッシング機能部30cは、計測区間を取得した際に、閾値記憶部30eに記憶された出力閾値も取得し、この取得した計測区間で尚且つ出力閾値以上のサイズのログを出力するためのロギングコードLCを、ソースコードSCに埋め込む処理を実行するようにした。
【0121】
これによって、ソフトウェアの区間計測時のログのサイズが、出力閾値で制限されるので、例えば、出力閾値を3MBに設定すると、3MB未満のサイズのログは出力されず、3MB以上のログが出力されるようになる。このため、出力閾値を大きく(例えば8MB)しておけば、ノイズのような小容量のログは出力されない。また、出力閾値以上のサイズのログが出力された際に、「異常な値」と設定しておけば、出力閾値以上のサイズのログが出力された際に、異常と判定することが可能となる。
【0122】
また、プリプロセッシング機能部30cは、計測区間記憶部30dに記憶された計測区間の指定がメソッド単位である場合、計測区間の呼び出し元プログラムの命令を受けて、計測対象の計測区間を有する複数の下位モジュールに対して、間接的に区間計測を可能とするプログラムを更に備える構成とした。
【0123】
この構成によれば、計測区間の呼び出し元プログラムが1回の命令を行えは、間接的に区間計測を可能とするプログラムにより、複数の下位モジュールに対して区間計測を行うことができる。
【0124】
また、プリプロセッシング機能部30cは、ロギングコードLCによる計測のために必要な命令による区間計測実行時のオーバーヘッドを事前に計測し、この計測オーバーヘッドを用いて、端末機20による実行ファイルEFの実行時に得られる計測結果を補正可能とするロギングコードLCを、ソースコードSC上に備える構成とした。
【0125】
この構成によれば、次のような作用効果が得られる。性能評価対象のソフトウエアにおいて、性能評価のために取得した計測区間の実際のクロック数に対して、区間計測時のクロック数はずれており、このずれが計測オーバーヘッドである。例えば、実行ファイルEF実行時に得られる計測結果から計測オーバーヘッドを減算することにより、その計測結果を補正することができる。
【0126】
また、ビルドサーバ30は、ロギングコードLCを埋め込んだソースコードSCをコンパイルして、コンピュータが処理可能な実行ファイルEFに変換するコンパイル機能部を更に備える構成とし、端末機20は、実行ファイルEFを実行するようにした。
【0127】
この構成によれば、端末機20が、ソフトウェアの計測区間において、クロック数計測によるCPUクロック消費量を検出することができるので、プログラム(ソフトウェア)がどれだけCPUリソースを消費したかを把握することができる。また、同計測区間において、出力閾値以上のログのサイズを検出できるので、メモリの異常な解放を検出することができる。これにより、データ異常やプロセス異常を発見することができるので、ソフトウェアのバグ検出を行うことができる。
【0128】
また、ビルドサーバ30は、次の第1〜第3ステップのオートリソースロギング方法を実行してもよい。
第1ステップにおいて、端末機20から指定され、当該端末機20で実行されるソフトウェアの性能評価を行うための、当該ソフトウェアに対応するソースコードSCの計測区間を記憶する。
第2ステップにおいて、ソースコードSC内で性能計測を行うためのロギングコードLCを記憶する。
【0129】
第3ステップにおいて、第1ステップで記憶された計測区間を取得し、この取得した計測区間での性能評価のための計測によるログを出力する命令を行うロギングコードLCを、第2ステップで記憶されたロギングコードLCから取得し、この取得したロギングコードLCを、端末機20から受信したソースコードSCに埋め込むプリプロセッシング処理を実行する。
【0130】
この方法によれば、ソースコードSCに対応するソフトウェアの性能評価のための計測区間を容易に管理することができる。また、ソフトウェアへのロギングコードLCの埋め込みを容易に行うことができる。更に、端末機20のユーザが指定する任意の区間のみの計測が可能となるので、計測オーバーヘッドを減少させることができる。
【0131】
更に、上記のオートリソースロギング方法を、ビルドサーバ30としてのコンピュータに実行させるためのプログラムを備えてもよい。このプログラムによっても、オートリソースロギング方法と同様な効果が得られる。
【0132】
その他、具体的な構成について、本発明の主旨を逸脱しない範囲で適宜変更が可能である。