(57)【特許請求の範囲】
【請求項１】
プロセッサを含むデータ処理システムにおいて、オブジェクト指向プログラミングにおけるクラス・ファイルを変更することによりユーザに固有のインスツルメンテーションを支援するデータ処理システムであって、
前記プロセッサが、
オブジェクト指向プログラムメソッド名によってインスツルメントされるべきクラスの中のオブジェクト指向プログラムメソッドを特定し、
前記クラスの中の前記オブジェクト指向プログラムメソッドをインスツルメントし、
オブジェクト指向プログラムメソッド・インスツルメンテーション識別子と前記インスツルメントされたオブジェクト指向プログラムメソッド用のオブジェクト指向プログラムメソッド名識別子との間のマッピング情報を含むように、前記クラスのクラス・ファイルを変更し、
前記クラス・ファイルをオープンし、
前記クラス・ファイルから読み込んだ前記マッピング情報を含むレコードをメモリ内に書き込みをし、
前記オブジェクト指向プログラムメソッドを実行し、
前記オブジェクト指向プログラムメソッドの前記実行の一側面を記述するトレース・レコードをメモリ内に書き込みをするように動作する、前記システム。
【請求項２】
前記オブジェクト指向プログラムメソッド・インスツルメンテーション識別子が前記オブジェクト指向プログラムメソッドのメジャー・コードおよびマイナー・コードを含む、請求項１に記載のシステム。
【請求項３】
前記プロセッサが、
前記レコード及び前記トレース・レコードを後処理し、
前記オブジェクト指向プログラムメソッド名識別子によって前記オブジェクト指向プログラムメソッドを特定するレポートをメモリ内に生成するようにさらに動作する、請求項１に記載のシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ユーザに固有のインスツルメンテーション（instrumentation:動作状況の表示）を支援する方法とシステムに関する。本発明は、一般にデータ処理システムに関し、特にオブジェクト指向プログラミング言語においてインスツルメンテーションをクラス・ファイルに関連付ける方法に関する。
【０００２】
【従来の技術】
データ処理システムのパフォーマンス（性能）と、当該データ処理システム内で実行されているアプリケーションのパフォーマンスを解析してそれらを増進させる際に、データ処理システム内のどのソフトウェア・モジュールがシステム資源を使っているのかを知ることは、有益である。データ処理システムを管理しその機能を強化するには、様々なシステム資源がいついかなる方法で使われているのかを知ることか必要である。データ処理システム内で様々なソフトウェアが実行されているときに、そのデータ処理システムをモニタしかつ調べて資源の消費量を測定するために、パフォーマンス・ツール類が使われている。たとえば、あるパフォーマンス・ツールは、データ処理システムで最も頻繁に実行されたモジュールと命令を特定する、あるいは、最も大量のメモリを割り当てたモジュール、または、最も頻繁に入出力（Ｉ／Ｏ）要求を実行したモジュールを特定する。ハードウェア・パフォーマンス・ツールは、データ処理システムに組み込まれているか、あるいは、事後に取り付けるかする。パーソナル・コンピュータ・システムなどは、通常、もし備えているとしても多くの組み込みハードウェア・パフォーマンス・ツールを備えてはいない。このようなデータ処理システムでは、ソフトウェア・パフォーマンス・ツールも役に立つ。
【０００３】
公知のソフトウェア・パフォーマンス・ツールの１つに、トレース・ツールがある。トレース・ツールは、複数の手法を使って、実行中のプログラムに対する実行フローを示すトレース情報を提供するものである。１つの手法に、特定の命令シーケンスが現れると、あるイベントをロギングすることにより、当該特定の命令シーケンスを追跡するものがある。（ロギングとは、一連のイベントを時間の経過に従って記録することである）。これが、いわゆるイベント・ベースのプロファイリング手法である。たとえば、トレース・ツールは、モジュール、サブルーチン、メソッド、関数などのシステム・コンポーネントへのエントリ（entry)と、それからのエグジット（exit）をすべてロギングする。あるいは、トレース・ツールは、リクエスタ（requester:メモリ割り当てを要求するもの）と各メモリ割り当て要求に対して割り当てられたメモリの量とをロギングする。通常、このような各イベントに対して、消費された資源の量に関係する値とともにタイム・スタンプが記録されたレコードが生成される。
【０００４】
様々なコンピュータ・ファミリーが生成するコードのパフォーマンスを改善するためには、コードを実行する際にプロセッサが時間を使う場所を突き止めることが必要になる場合が多い。このような取り組みは、コンピュータ処理技術の分野では、普通、「ホット・スポット（hot spot）」を突き止める、と呼ばれている。理想的には、このようなホット・スポットをコード・レベルの命令行および／またはソース行に孤立させてしまい、命令行および／またはソース行の集合である面に注意を集中させたい。そうすれば、当該コードを改善したときに受ける恩恵が最も大きくなりうる。（「Ａおよび／またはＢ」は「ＡおよびＢ、ＡまたはＢ」を表わす）。
【０００５】
したがって、実行パス・フローをモジュール間で適切にマッピングすることは、少なくとも、特定のモジュールが消費する資源を適切に計測するのと同じくらいに重要である。実行パス・フローを適切にマッピングすることができないと、特定のモジュールが消費する資源も疑わしいものになってしまう。実行パス・フローを追跡する方法の１つに、個々のモジュールに対する呼び出しをインスツルメントする方法がある。インスツルメント（instrument）するとは、動作状況を表示することである。この場合、クラス・ファイルは、モジュール（あるいはメソッド）にエントリ（entry)する（あるいはエグジット（exit）する）たびにレコードに書き込むことのできるトレース・フック（trace hook）によってインスツルメントされる。たとえば、各メソッド・エントリ・イベントで、エントリ・トレース・フックは当該メソッド・エントリ・イベントに対する出力であり、各メソッド・エグジット・イベントで、エグジット・トレース・フックは当該メソッド・エグジット・イベントに対する出力である。
【０００６】
トレース・フックは、あるソフトウェア・メソッドに固有のメジャー・コード（major code）とマイナー・コード（minor code）によって当該ソフトウェア・メソッドを特定する。したがって、あるメソッドをインスツルメントするときに、メソッド名と当該メソッド用のメジャー・コードおよびマイナー・コードとを関連付けるファイルが生成される。（以下では「メジャー・コードおよびマイナー・コード」を「メジャー／マイナー・コード」とも表記する）。このファイルは、フック定義ファイル（hook definition file: ＨＤＦ）と呼ばれている。クラスのインスツルメンテーション（insrumentation: 動作状況の表示）を変更するたびに、既存のＨＤＦを更新するか、あるいは、新しいファイルを生成するかする必要がある。ＨＤＦは、後処理段階で使用するために格納される。
【０００７】
メソッド・エントリ（あるいはエグジット）イベントが発生すると、消費された資源の量に関係するメトリック情報とともに、当該イベント用のトレース・フックが出力される。このトレース・フックには、インスツルメントしたメソッド用の一意のメジャー／マイナー・コードが含まれている。後処理段階では、各メソッド（あるいは他のソフトウェア・モジュール）が消費した資源の量は、トレース出力から算出することができ、また、詳細なプロファイル情報レポートを生成することもできる。プロファイル情報レポートを使うと、トレース・フックから得られる一意のメジャー／マイナー・コードによって、各メソッドを特定することができる。このプロファイル情報レポートは、上記メジャー／マイナー・コードが対応するメソッド名で置き換えると、はるかに役に立つ。したがって、最新の版のＨＤＦを見つけて、プロファイル情報レポートとマージする。
【０００８】
プロファイル情報レポートとマージするのに最新の版のＨＤＦを使わないと、メソッドを特定するのを誤る可能性がある、あるいは、メソッドを名無しのまま放置してしまう可能性がある。また、ＨＤＦは分離したファイルであるとともにどのクラスとも物理的に関連付けられていないので、ＨＤＦは失われる可能性がある。ＨＤＦが失われた場合、ユーザは、プロファイル情報レポートを解析する前に、新しい版のＨＤＦを生成する必要がある。
【０００９】
したがって、クラス・ファイルとインスツルメンテーションとの間の関連付け情報を提供するシステムと方法を備えることが望ましい。また、このような情報とそれを生成したクラス・ファイルとを関連付けるシステムと方法を備えることが望ましい。
【００１０】
【課題を解決するための手段】
まず、フックを使ってクラスをインスツルメントする。各フックは、メソッドの、パス・フローを追跡しているコードの中のクリティカル・ポイント、たとえばメソッドをエントリあるいはエグジットすることのできる場所に導入する。各フックには、当該各フックが導入されているメソッドを特定する識別子が含まれている。フックは、メソッド名を使うのではなく、一意のメジャー・コードとマイナー・コードを使ってメソッドを特定している。さらに、クラスが、インスツルメントしているメソッドを特定する別のフックを出力するために、静的イニシャライザを宣言する。クラスをロードするときに、この静的イニシャライザを実行して、メソッド名とインスツルメントした各メソッド用のメジャー・コードおよびマイナー・コードとを特定するフックを、たとえばトレース・レコードに出力する。次いで、メソッドをエントリあるいはエグジットするときに、当該エントリあるいはエグジットを特定するフックもトレース・レコードに出力する。このトレース・レコードを後処理すると、クラスとインスツルメンテーションとを関連付ける情報が、トレース・ストリーム中のトレース・レコードから入手可能になるので、それをマージの用に供する。
【００１１】
【発明の実施の形態】
本発明は、パーソナル・コンピュータ、ワークステーション、組み込みシステム、ミニコンピュータ、メインフレーム・コンピュータなど、様々なハードウェア・プラットフォーム上に実装（implement)することができる。本発明に係る方法のステップの多くは、様々な型の並列プロセッサ上に実装することができる。これが本発明の有利な点である。
【００１２】
図１（ａ）は、サーバとして実装することのできるデータ処理システムを示すブロック図である。データ処理システム１００には、システム・バス１０６に接続された複数のプロセッサ１０２、１０４を備えたＳＭＰ（symmetric multiprocessor: 対称型マルチプロセッサ）システムを用いることができる。あるいは、単一プロセッサ・システムを用いてもよい。また、システム・バス１０６には、ローカル・メモリ１０９へのインタフェースを提供するメモリ・コントローラ／キャッシュ１０８が接続されている。システム・バス１０６には、さらに、Ｉ／Ｏバス・ブリッジ１１０が接続されており、Ｉ／Ｏバス１１２へのインタフェースを提供している。メモリ・コントローラ／キャッシュ１０８とＩ／Ｏバス・ブリッジ１１０は、図示したように、統合することができる。
【００１３】
Ｉ／Ｏバス１１２に接続されたＰＣＩ（peripheral component interconnect)バス・ブリッジ１１４は、ＰＣＩローカル・バス１１６へのインタフェースを提供している。（ＰＣＩバスとは、多数のパーソナル・コンピュータ・メーカーが参加するＰＣＩＳＩＧ〔PCI special interest group〕が策定したローカル・バス・アーキテクチャのことである）。ＰＣＩローカル・バス１１６には、モデム１１８を接続することができる。典型的なＰＣＩバスの実装では、４個のＰＣＩ拡張スロットまたはＰＣＩアドイン・コネクタをサポートすることができる。ネットワーク・コンピュータへの通信リンクは、アドイン・ボードを通じてＰＣＩローカル・バス１１６に接続されたモデム１１８とネットワーク・アダプタ１２０を通じて実現することができる。
【００１４】
追加のＰＣＩバス・ブリッジ１２２、１２４は、追加のＰＣＩバス１２６、１２８用のインタフェースを提供している。追加のＰＣＩバス１２６、１２８により、追加のモデムまたはネットワーク・アダプタをサポートすることができる。この場合、サーバ１００には、複数のネットワーク・コンピュータを接続することができる。また、図示したように、Ｉ／Ｏバス１１２には、メモリ・マップト・グラフィックス・アダプタ１３０とハードディスク駆動装置１３２を直接にあるいは間接的に接続することもできる。
【００１５】
当業者は、図１（ａ）に示したハードウェアは変更しうるものである、ということを認識できる。たとえば、図示したハードウェアに加えて、あるいはその代わりに光ディスク駆動装置などの周辺装置を用いることができる。また、図示した例は、本発明についてアーキテクチャ上の限定を示唆することを意味するものではない。
【００１６】
図１（ａ）に示したデータ処理システムには、たとえば、ＡＩＸ（Advanced Interactive Executive）オペレーティング・システムを実行しているＩＢＭ  ＲＩＳＣ／Ｓｙｓｔｅｍ６０００システム（インターナショナル・ビジネス・マシーンズ・コーポレーション〔International Business Machines Corporation 、アメリカ合衆国ニューヨーク州アーモンク〕の製品）を用いることができる。
【００１７】
図１（ｂ）は、本発明を実装することのできるデータ処理システムを示すブロック図である。データ処理システム１５０は、クライアント・コンピュータの一例である。データ処理システム１５０は、ＰＣＩローカル・バス・アーキテクチャを採用している。図示した例ではＰＣＩバスを採用しているけれども、マイクロ・チャネル（Micro Channel)やＩＳＡなど他のバス・アーキテクチャを用いることもできる。（マイクロ・チャネルとは、米ＩＢＭ社が同社のパーソナル・コンピュータＰＳ／２用に開発した３２ビット仕様のバスのことである。ＩＳＡ〔Industry Standard Architecture〕バスとは、米ＩＢＭ社のパーソナル・コンピュータＰＣ／ＡＴで採用された拡張バスを基本にして、国際的な標準規格とされた拡張バスのことである）。プロセッサ１５２とメインメモリ１５４は、ＰＣＩブリッジ１５８を介してＰＣＩローカル・バス１５６に接続されている。ＰＣＩブリッジ１５８は、統合されたメモリ・コントローラとプロセッサ１５２用のキャッシュ・メモリをも備えている。直接コンポーネント相互接続またはアドイン・ボードを介して、ＰＣＩローカル・バス１５６に追加の接続を行なうことができる。図示した例では、ＬＡＮ（local area network）アダプタ１６０、ＳＣＳＩホスト・バス・アダプタ１６２、および拡張バス・インタフェース１６４は、直接コンポーネント接続によってＰＣＩローカル・バス１５６に接続されている。（ＳＣＳＩ（small computer syetem interface)とは、ＡＮＳＩ〔米国規格協会〕が規格化したハードディスク駆動装置など周辺装置用の汎用の接続規格のことである）。対照的に、オーディオ・アダプタ１６６、グラフィックス・アダプタ１６８、およびオーディオ／ビデオ（ＡＶ）アダプタ１６９は、拡張スロットに挿入したアドイン・ボードによってＰＣＩローカル・バス１５６に接続されている。拡張バス・インタフェース１６４は、キーボード／マウス・アダプタ１７０、モデム１７２、および補助メモリ１７４用の接続を提供している。ＳＣＳＩホスト・バス・アダプタ１６２は、図示した例では、ハードディスク駆動装置１７６、テープ駆動装置１７８、およびＣＤ−ＲＯＭ駆動装置１８０用の接続を提供している。典型的なＰＣＩローカル・バス実装では、３個または４個のＰＣＩ拡張スロットまたはＰＣＩアドイン・コネクタをサポートすることができる。
【００１８】
プロセッサ１５２ではオペレーティング・システムが実行されており、それが図１（ｂ）のデータ処理システム１５０内の様々なコンポーネントを調整するとともに制御している。このオペレーティング・システムには、ＪａｖａＯＳ  ｆｏｒ  Ｂｕｓｉｎｅｓｓ（商標）やＯＳ／２（商標）（これらはインターナショナル・ビジネス・マシーンズ・コーポレーション〔International Business Machines Corporation 〕から入手できる）など市販のオペレーティング・システムを用いることができる。ＪａｖａＯＳは、ネットワーク上のサーバからネットワーク・クライアントにロードされ、ＪａｖａプログラムとＪａｖａアプレットをサポートする。スタック・アンウインド（stack unwind、後述）を使ってトレースを実行するのに有利なＪａｖａＯＳのいくつかの特徴は、ＪａｖａＯＳがページングや仮想記憶をサポートしていない点である。Ｊａｖａなどのオブジェクト指向プログラミング・システムは、オペレーティング・システムとともに実行することができ、データ処理システム１５０で実行されているＪａｖａプログラムやアプリケーションからのオペレーティング・システムへの呼び出しを提供することができる。オペレーティング・システム、オブジェクト指向プログラミング・システム、およびアプリケーション（あるいはプログラム）用の命令群は、ハードディスク駆動装置１７６などの記憶装置に格納されており、メインメモリ１５４にロードされてプロセッサ１５２による実行の用に供される。データ処理システム１５０がネットワーク・クライアントとして使われる場合には、ハードディスク駆動装置がない場合が多く、メモリも制約を受けている。
【００１９】
当業者は、図１（ｂ）のハードウェアは実装に応じて変化しうる、ということを認識できる。たとえば、図１（ｂ）に示したハードウェアに加え、あるいはその代わりに光ディスク駆動装置など別の周辺装置を用いることもできる。また、図示した例は、本発明についてアーキテクチャ上の限定を示唆することを意味するものではない。たとえば、本発明のプロセス（方法）は、マルチプロセッサ型のデータ処理システムに適用することができる。
【００２０】
インスツルメントしたクラスを実行すると、一連のトレース・レコードがトレース・ファイルに出力される。トレース・ファイルには、メソッド間の実行パス・フローをマッピングするのに必要な情報と、特定のメソッドが消費した資源を算出するのに必要な情報とが含まれている。メソッド・エントリ（あるいはエグジット）イベントが発生すると、消費された資源の量に関係するメトリック情報とともに、当該イベント用のフックがトレース・レコードに出力される。フックには、インスツルメントしたメソッド用の一意のメジャー／マイナー・コードが含まれている。後処理段階で、各メソッドが消費した資源の量がトレース出力から算出されるとともに、詳細なプロファイル情報レコードが生成される。プロファイル情報レコードを用いると、フックから得られる一意のメジャー・コードとマイナー・コードによって各メソッドを特定することができる。メジャー・コードとマイナー・コードを対応するメソッド名で置き換えると、プロファイル情報レコードは、はるかに役立つようになる。
【００２１】
従来技術によると、特定のトレース・フックのメジャー・コードおよびマイナー・コードと、それらが挿入されているメソッドとの間のマッピングに関する情報を記録するために、ヘッダー（あるいはフック）定義ファイル（ＨＤＦ）を使う。たとえば、２つのメソッド＜method＿X ＞、＜method＿Y ＞を備えたクラス「TEST」を考える。各メソッドをエントリ・フックとエグジット・フックを使ってインスツルメントすると、ＨＤＦファイルに、クラス名およびメソッド・シグニチャーとともに、これらのフック用のメジャー・コードおよびマイナー・コードを特定するエントリ群が作られる。そのエントリ群は、たとえば、次に示すようなものである。
【００２２】
メジャー／マイナー  クラス／メソッド
−−−−−−−−−  −−−−−−−−
22/01               TEST.method ＿X(I)
22/81               TEST.method ＿X ＿exit
22/02               TEST.method ＿Y()
22/82               TEST.method ＿Y ＿exit
【００２３】
上に示したＨＤＦファイルの例の抜粋において、メジャー・コード22とマイナー・コード01は、クラスTEST内のメソッドmethod＿X のエントリに配置されたトレース・フックと関連付けられている。メソッド・シグニチャー（たとえば「(I) 」）は、ロードし過ぎたメソッドを明確に識別できるように記録されている（すなわち、クラス・コンストラクタはロードし過ぎることが多いが、あるコンストラクタを他のコンストラクタから識別する唯一の方法は、メソッド・シグニチャーを検査することである）。
【００２４】
ＨＤＦファイルは、トレース・フックを実装する際の要件ではないが、しかし、最適化手段として機能する。結果として得られるトレース・ストリームは、（タイムスタンプを備えた）メジャー／マイナー・コードの列から成る。後処理段階では、ＨＤＦファイルを取り上げ、それとトレース・ストリームとをマージさせる結果、メソッド／クラスを名前によって識別するトレース・ストリームが得られる。トレース・データと上のＨＤＦファイルとをマージさせることによって生成することのできるトレース・ストリームの例を下に示す。
【００２５】
メジャー  マイナー  タイムスタンプ  記述
−−−−  −−−−  −−−−−−−  −−
12        1           15:985860940  Dispatch thread: e18507a0
22        1           15:985833507  ENTRY:  TEST.method ＿X(I)
12        1           15:985845671  Dispatch thread: e17d5bb0
12        1           15:985860940  Dispatch thread: e1807a0
22        81          15:985833507  EXIT:  TEST.method＿X ＿exit
22        2           15:985833507  ENTRY:  TEST.method ＿Y()
22        82          15:985833507  EXIT:  TEST.method＿Y ＿exit
【００２６】
以上のとおりであるから、最新の版のＨＤＦを特定したのち、それとプロファイル情報レコードとをマージする必要がある。
【００２７】
図２は、メソッド名を使って後処理レポートを生成するプロセスを示すフローチャートを示す図である。プロセスは、トレース・ファイル中のトレース・レコードから後処理プロファイル情報レポートを生成することにより開始する（ステップ２０２）。次いで、トレース・ファイルを生成したインスツルメントしたクラス用に、最新のＨＤＦファイルのありかを突き止める必要がある（ステップ２０４）。上述したように、最新のＨＤＦファイルは、インスツルメントしたクラスに物理的に配置されているわけではないので、任意の場所に格納されている可能性がある。いったん見つかったら、最新のＨＤＦファイルは、後処理プロファイル情報レポートとマージする（ステップ２０６）。また、上述したように、プロファイル情報レポート中のメジャー・コードとマイナー・コードによってメソッドを特定する。ＨＤＦファイルには、メソッド名とインスツルメントしたクラス用のメソッド・メジャー・コードおよびメソッド・マイナー・コードとの間のマッピングが含まれている。マージしたあと、プロファイル情報レポートには、すべてのメソッドに対するメソッド名が含まれているはずである。しかし、ＨＤＦが未完了あるいは無効である可能性があるので、マージしたプロファイル情報レポート中のメソッド名は、サンプリングして正確であるか否かを確かめる必要がある（ステップ２０８）。プロファイル情報レポート中のメソッドがすべて名前で識別されており、かつ、それらの正確さにユーザが納得している場合には、プロセスは終了する。しかし、メソッドがそれらのメジャー・コードとマイナー・コードだけで識別されており、および／または、メソッドに誤った名前が付けられている場合には、プロファイル情報レポートは、より新しいＨＤＦファイルとマージする必要がある。この場合、次の２つの選択肢のうちの一方を選ぶことができる。（１）インスツルメントしたクラスに関連付けられた別のフック定義ファイル（ＨＤＦ）を見つけるように試みるか、（２）インスツルメントしたクラス用のメジャー・コードとマイナー・コードのマッピングに合わせて、最新のＨＤＦファイルを正確なメソッド名を使って更新する（ステップ２１０）。次いで、プロファイル情報レポートとＨＤＦファイルとを再マージしたのち（ステップ２０６）、メソッド名が正確になるまで再度調べる（ステップ２０８）。以上の各ステップを経て、メソッド名を使ってプロファイル情報レポートを生成するプロセスは終了する。
【００２８】
プロファイル情報レポートとマージする際に最新の版のＨＤＦを使わないと、メソッドに誤った名前を付けてしまう、あるいは、メソッドに名前を付けないで放置してしまう可能性がある。正確な結果を得るためには、正確かつ最新の版のＨＤＦファイルの所在を突き止めることが重要である。複数のＨＤＦ候補をマージし、その結果を調べることは、時間がかかるとともに、ユーザ・エラーを引き起こしやすい。特に、ユーザが未熟である場合、あるいは、ユーザがメソッド名またはマージ・プロセスをよく知らない場合に、そうである。ＨＤＦファイルは、分離したファイルであり、トレース・ファイルを生成したクラスに物理的に関連付けられているわけではないので、失われる可能性がある。失われた場合、ユーザは、プロファイル情報レポートを解析する前に、新しい版のＨＤＦファイルを生成する必要がある。
【００２９】
上述した欠点を緩和する方策として、クラス・ファイル自身の中にメジャー・コードとマイナー・コードのマッピングに合わせたメソッド名が含めてある。本発明の好適な実施形態によれば、クラスの中のインスツルメントしたメソッド用に、静的イニシャライザを宣言している。クラスの中のインスツルメントした各メソッドごとに、当該クラスの静的イニシャライザにエントリを付加して、名前とメジャー・コードおよびマイナー・コードとによってメソッドを特定するフックを出力するようにしている。クラスをロードしてイニシャライズすると、静的イニシャライザが実行される結果、メソッドを特定するフックが出力される。そのフックはメソッド名と当該メソッド用のメジャー・コードおよびマイナー・コードとの双方を備えているので、上記出力によって、メソッド名とメジャー・コードおよびマイナー・コードとの間のマッピングが得られる。各フックは、トレース・ファイル内の分離したトレース・レコードに書き込むことができる。後処理段階の間に、マッピングを含んだすべてのトレース・レコードは、プロファイル情報レポートとマージするのに役立つ単一のファイルに集約する。当業者は、プロファイル情報レポートと集約したメソッド・マッピング・ファイルとをマージするのとは別の選択肢も可能である、ということを認識できる。たとえば、プロファイル情報レポートを生成する間に、メソッド名をメジャー・コードおよびマイナー・コードにマッピングするように、後処理を変更することができる。この場合、プロファイル情報レポートと集約したメソッド・マッピング・ファイルとをマージすることなく、プロファイル情報レポートには、メソッド名が含まれることになる。
【００３０】
図３は、本発明の好適な実施形態に従い、インスツルメンテーションに関連付ける分離したファイルを必要とせずに、アプリケーション・クラスをインスツルメントするプロセスを示すフローチャートを示す図である。好適な実施形態を説明するのにここで用いる例では、特に、エントリ・イベントとエグジット・イベント用のメソッドのインスツルメンテーションを説明している。しかし、当業者は、ここに示すプロセスはメソッドのエントリとエグジット以外の他のイベント用にも容易に変更可能である、ということを認識できる。
【００３１】
まず、クラス・ファイルの一定のプール部分中に、インスツルメンテーションに対する参照を付加したのち（ステップ３０２）、フックすべきメソッドが他にないかどうか調べる（ステップ３０４）。フックすべきメソッドが他にもある場合、当該メソッドにエントリ・ポイント（入口点）と少なくとも１つのエグジット・ポイント（出口点）を配置する（ステップ３０６）。必要に応じて、メジャー・コードとマイナー・コード用に、エントリ・フックとエグジット・フックを挿入する（ステップ３０８）。
【００３２】
バイトコードを変更するには、上述したメソッド呼び出しに影響するＪａｖａバイトコード命令を挿入する必要がある。このＪａｖａバイトコード命令の挿入には、メソッドのボディを識別すること、既存のバイトコードを解釈すること、および、エントリ・ポイントとエグジット・ポイントを配置することが必要である。バイトコードの変更は、クラス・ファイル・ベリファイア（verifier）が採用している基準に一致している必要がある。クラス・ファイル・ベリファイアとは、バイトコード（およびクラス・ファイルの残部）が有効であり、ＪＶＭ（Java virtual machine: Ｊａｖａ仮想マシン）によって実行可能であることを保証するものである。したがって、クラス・ファイル・ベリファイアの制約条件を満足していることを保証するように変更する必要のある他のコンポーネントをすべて変更する（ステップ３１０）。最後に、マイナー・コンポーネントをインクリメントして、当該マイナー・コンポーネントが各メソッドごとに一意であることを保証する（ステップ３１２）。
【００３３】
フックすべきメソッドが他になければ、変更したクラス・ファイルを生成する（ステップ３１４）。次いで、インスツルメントしたクラス用の静的イニシャライザを更新して、メソッドを特定するフックを出力する（ステップ３１６）。各フックには、メソッド名と当該メソッドのメジャー・コードおよびマイナー・コードとの間のマッピングが含まれている。次いで、変更したクラスをクローズ（close)する（ステップ３１８）。以上の各ステップを経て、インスツルメンテーションを関連付ける分離したファイルを必要とすることなく、アプリケーション・クラスをインスツルメントするプロセスが完了する。
【００３４】
図４は、本発明の好適な実施形態に従って、インスツルメンテーション用の分離した関連付けファイルを必要とせずに、コードを実行するとともにフックを出力するプロセスを示すフローチャートを示す図である。図４に示すフローチャートは、あるアプリケーションの一部を実行することに関して本発明の好適な実施形態の一例を示すものであり、完全なアプリケーションの実行を描写することを意図していない。プロセスの都合のよい開始点は、インスツルメントしたメソッドの内部でコードが実行されている場所である（ステップ４０２）。上記メソッドは、別のインスツルメントしたメソッドを呼び出す（ステップ４０４）。
【００３５】
好ましいプロセスは、プレロードしたクラスの中に新しいメソッドがあるか、あるいは、別のクラスの中に新しいメソッドがあるかに応じて、異なった方法で実行される。したがって、呼び出されているメソッドがプレロードしたクラスの中に存在するか否かを判断する（ステップ４０６）。上記メソッドがプレロードしたクラスの中に存在する場合には、新しいクラスをロードする必要なく、新しいメソッドを導入することができる。この事実の重要性は、下で明らかになる。新しいメソッド用のエントリ・ポイントで、トレース・フックを見つける（ステップ４０８）。このトレース・フックは、メソッド識別子によって、コード中のエントリ・ポイントを特定している。次いで、上記トレース・フックを、たとえばトレース・レコードに書き込む（ステップ４１０）。上記トレース・フックは、メソッドのメジャー・コードとマイナー・コードによって、エントリを特定している。
いったん新しいメソッドを導入したら、再び、そのメソッドの内部でコードを実行する（ステップ４０２）。
【００３６】
ステップ４０６に戻って、プレロードしたクラスの中に呼び出されているメソッドが存在しない場合には、上記メソッドのクラスを新しくオープンする必要がある（ステップ４１２）。次いで、初期化処理の間に、上記クラスからの第１の静的イニシャライザを実行する。各静的イニシャライザを実行することによって、インスツルメントしたメソッドを特定しているフックを、たとえばトレース・レコードに書き込む（ステップ４１４）。上記フックには、メソッド名と当該メソッドのメジャー・コードおよびマイナー・コードとの双方が含まれている。次いで、実行すべき静的イニシャライザが他にないかどうか調べる（ステップ４１６）。実行すべき静的イニシャライザが存在する場合には、それを実行して別のフックを別のトレース・レコードに書き込む（ステップ４１４）。すべての静的イニシャライザを実行し終えるまで、ステップ４１４とステップ４１６を繰り返す。いったんクラスをロードし、すべての静的イニシャライザを実行し終えたら、メソッドの中の、フックが見つかったエントリ・ポイントに、新しいクラスの中の新しいメソッドを導入する（ステップ４０８）。上記フックを，たとえばトレース・レコードに出力する（ステップ４１０）。上記フックは、トレース・レコード中でメソッドのメジャー・コードとマイナー・コードによってエントリ・ポイントを特定している。最後に、再び、新しいメソッドの内部でコードを実行する（ステップ４０２）。プロセスは、終了するまで、あるいはコード中でエラーが発生するまで継続する（どちらの場合もこの例には示してない）。
【００３７】
本発明の好適な実施形態に従うと、新しいクラス・ファイルをオープンしたときにはいつでも、マッピング情報をトレース・ファイルに直接に書き込む。特定のフックのメジャー・コードおよびマイナー・コードと、当該特定のフックが挿入されているメソッドとの間のマッピングに関する情報を記録するのに、ＨＤＦは、もはや使わない。図５は、本発明の好適な実施形態によるトレース・ストリーム・ファイルすなわちトレース・レコード・ファイルを示す図である。レコード０〜３には、クラス内の各メソッドごとに、メジャー・コードおよびマイナー・コードとクラス／メソッド名との間のマッピングが含まれている点に留意されたい。これらのレコードは、クラスをロードして静的イニシャライザを実行すると、出力される。レコード４〜１０は、メソッド・エントリまたはメソッド・エグジットなどのイベントに応答して生成される、上述した種類のトレース・データ・レコードである。これらレコード４〜１０のおのおのには、メソッドに関するパフォーマンス情報がいくつか含まれている。これらレコード４〜１０のおのおのは、メジャー・コードおよびマイナー・コードだけによって、インスツルメントしたメソッドを特定している点にも留意されたい。クラス・ファイル自身にメソッド名からメジャー・コードおよびマイナー・コードへのマッピングを含めることにより、クラスからインスツルメンテーションへのマッピング情報は、クラス用のパフォーマンス・プロファイル情報を備えたトレース・レコード・ファイルで常に入手することができる。この結果、ユーザは、ＨＤＦを見つけてその妥当性を検査する作業から解放される。図２に関して上述した、メソッド名を使って後処理プロファイル情報レポートを生成するプロセスは、はるかに簡単になる。図６は、本発明の好適な実施形態に従い、トレース・レコードだけから、メソッド名を含む後処理プロファイル情報レポートを生成する方法を示すフローチャートを示す図である。
【００３８】
プロセスは、インスツルメントしたメソッドを特定しているトレース・レコードをクラスの中で見つけることにより、開始する（ステップ６０２）。このステップは、後処理と同時に実行してもよいし、あるいは、後処理とは独立に実行してもよい。これらのトレース・レコードは、通常、トレース・ストリーム中の、新しくインスツルメントしたクラス内に新しいメソッドが存在する場所、すなわち新しくインスツルメントしたクラスをロードする場所である新しいメソッド・レコードより前のポイントに存在する。これらのトレース・レコードには、クラス内のすべてのインスツルメントしたメソッド用の、メソッド名からメソッドのメジャー・コードとマイナー・コードへのマッピングが含まれている。すべてのレコードからのこのマッピング情報は、１つのクラスまたはクラス群内のすべてのメソッドを特定するテーブルに集約することができる。次いで、トレース・レコードを後処理し、その結果を後処理プロファイル情報レポートに出力する（ステップ６０４）。後処理のあとで後処理プロファイル情報レポートを使うと、各メソッドのメジャー・コードとマイナー・コードだけによって当該各メソッドを特定することができる。最後に、トレース・レコードからのマッピング情報と後処理プロファイル情報レポートとをマージする（ステップ６０６）。マージした結果得られるレポートは、インスツルメントしたメソッドの一意のメソッド名によって当該インスツルメントしたメソッドを特定しているので、ユーザにとって理解しやすいものになっている。
【００３９】
本発明の別の実施形態によると、ポストプロセッサ（後処理を行なうソフトウェア）は、個々のトレース・レコードを読み取るときにマッピング情報を追跡する。メソッド識別子を、たとえばレポートに出力すべきときにはいつでも、ポストプロセッサは、直ちにメソッドのメジャー・コードとマイナー・コードをメソッド名にマッピングし、メソッド名だけを出力する。いずれの場合においても、トレース・レコードだけから、メソッド名を含む後処理プロファイル情報レポートを生成するプロセスは、以上の各ステップを経て、完了する。
【００４０】
トレース・データ・レコードとマッピング情報トレース・レコードとをマージして生成した後処理プロファイル情報レポートは、トレース・データ・レコードとＨＤＦファイルとをマージして生成した、上述した後処理プロファイル情報レポートと一致する。図５のトレース・ファイル５００から生成したマージ後の後処理プロファイル情報レポートを、以下に示す。
【００４１】
メジャー  マイナー  タイムスタンプ  記述
−−−−  −−−−  −−−−−−−  −−
12        1         15:985860940    Dispatch thread: e18507a0
22        1         15:985833507    ENTRY: TEST.method＿X(I)
12        1         15:985845671    Dispatch thread: e17d5bb0
12        1         15:985860940    Dispatch thread: e1807a0
22        81        15:985833507    EXIT: TEST.method ＿X ＿exit
22        2         15:985833507    ENTRY: TEST.method＿Y()
22        82        15:985833507    EXIT: TEST.method ＿Y ＿exit
【００４２】
ある程度の特定性をもって本発明を説明したけれども、当業者は、本発明の本旨と範囲の内でその構成要素を変更しうる、ということを認識すべきである。本発明の好適な実現方法の１つは、図１（ａ）に記載したように一般的に構成される少なくとも１つのコンピュータ・システムのメインメモリ１５４に常駐する命令の集合としてのものである。上記コンピュータ・システムが必要とするまで、上記命令の集合は、別のコンピュータ読み取り可能な記憶装置、たとえば、ハード・ディスク駆動装置内のハード・ディスク、あるいは、ＣＤ−ＲＯＭ駆動装置内で実用されている光ディスク、または、フロッピー・ディスク駆動装置内で実用されているフロッピー・ディスクなどの着脱可能な記憶装置に格納することができる。さらに、上記命令の集合は、別のコンピュータの記憶装置に格納しておき、ユーザが望むときに、ＬＡＮ（local area network）あるいはインターネットなどのＷＡＮ（wide area network)を介して転送することができる。また、上記命令の集合を物理的に格納することは、上記命令の集合を電気的に、機械的に、あるいは化学的に格納する媒体がコンピュータ読み取り可能な情報を保持しうるように、当該媒体を変えて行なうことができる、ということを、当業者は認識できる。本発明は、特許請求の範囲とその均等物によってのみ限定される。
【００４３】
まとめとして以下の事項を開示する。
（１）ルーチンをインスツルメントするステップであって、インスツルメントしたルーチンがクラスの中に存在するステップと、
クラス・ファイルを変更するステップであって、当該変更が前記インスツルメントしたルーチンを特定しているステップと
を備えた、
クラス・ファイルを変更することによりユーザに固有のインスツルメンテーションを支援する方法。
（２）前記ルーチンをインスツルメントするステップが、前記インスツルメントしたルーチンにトレース・フックを導入するステップを備えている、
上記（１）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（３）前記クラス・ファイルを変更するステップが、さらに、
前記クラスの中の静的イニシャライザを更新してフックを出力するステップであって、前記フックが前記インスツルメントしたルーチンを特定しているステップ
を備えている、
上記（１）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（４）ルーチンをインスツルメントするステップであって、インスツルメントしたルーチンがクラスの中に存在するステップが、さらに、
前記インスツルメントしたルーチンにトレース・フックを導入するステップであって、前記トレース・フックが前記インスツルメントしたルーチンを識別コードによって特定しており、前記インスツルメントしたルーチンの識別コードを含むレコードに前記トレース・フックを書き込むステップ
を備えている、
上記（１）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（５）前記クラス・ファイルを変更するステップが、さらに、
前記クラスの中の静的イニシャライザを更新してフックを出力するステップであって、前記インスツルメントしたルーチンを前記フックがルーチン名およびインスツルメンテーション・コードによって特定しているステップ
を備えている、
上記（４）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（６）前記ルーチンをインスツルメントするステップが、さらに、
前記ルーチンを含むクラスを編集するステップであって、編集コマンドがコマンド構文、クラス識別子構文、およびファイル編集構文を備えているステップ
を備えている、
上記（１）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（７）クラス・ファイルをオープンするステップと、
静的イニシャライザを実行するステップであって、前記静的イニシャライザがルーチン識別マッピング情報を含んでいるステップと、
前記ルーチン識別マッピング情報を含むレコードを書き込むステップと
を備えた、
クラス・ファイルを変更することによりユーザに固有のインスツルメンテーションを支援する方法。
（８）前記静的イニシャライザが、第１のルーチン・マッピング情報を含む第１の静的イニシャライザであり、前記レコードが第１のレコードであり、
さらに、
第２の静的イニシャライザを実行するステップであって、前記第２の静的イニシャライザが第２のルーチン識別マッピング情報を含んでいるステップと、
前記第２のルーチン識別マッピング情報を含む第２のレコードを書き込むステップと
を備えた、
上記（７）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（９）前記第１のレコードおよび前記第２のレコードがトレース・ストリームの中に含まれている、
上記（８）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（１０）ルーチンがＪａｖａメソッドである、
上記（７）に記載の、クラス・ファイルを変更する方法。
（１１）さらに、
前記第１のトレース・レコードと前記第２のトレース・レコードとをまとめるステップと、
前記トレース・ストリームを後処理するステップであって、プロファイル情報レポートを生成するステップと、
前記第１のトレース・レコードおよび前記第２のトレース・レコードと前記プロファイル情報レポートとをマージするステップであって、前記プロファイル情報レポートの中のルーチンがルーチン名によって識別されているステップと
を備えた、
上記（９）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（１２）クラスの中のインスツルメントすべきルーチンをルーチン名によって特定するステップと、
前記クラスの中の前記ルーチンをインスツルメントするステップと、
前記クラスのクラス・ファイルを変更して、前記クラスがルーチン・インスツルメンテーションと前記インスツルメントしたルーチン用のルーチン識別子との間のマッピング情報を含むようにするステップと
を備えた、
クラス・ファイルを変更することによりユーザに固有のインスツルメンテーションを支援する方法。
（１３）前記ルーチン識別子が前記ルーチン名を含んでおり、
前記ルーチン・インスツルメンテーションが前記ルーチンのメジャー・コードおよびマイナー・コードを含んでいる、
上記（１２）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（１４）さらに、
前記クラス・ファイルをオープンするステップと、
レコードを書き込むステップであって、前記レコードがルーチン・インスツルメンテーションと前記インスツルメントしたルーチン用のルーチン識別子との間のマッピング情報を備えているステップと
前記ルーチンを実行するステップと、
トレース・レコードを書き込むステップであって、前記トレース・レコードが前記ルーチンの前記実行の一側面を記述するものであるステップと
を備えた、
上記（１２）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（１５）さらに、
前記レコードおよび前記トレース・レコードを後処理するステップと、
レポートを生成するステップであって、前記レポートが前記ルーチンを前記ルーチン識別子によって特定しているステップと
を備えた、
上記（１４）に記載の、ユーザに固有のインスツルメンテーションを支援する方法。
（１６）クラスの中のインスツルメントすべきルーチンをルーチン名によって特定する特定手段と、
前記クラスの中の前記ルーチンをインスツルメントするインスツルメント手段と、
クラス・ファイルを変更して、前記クラス・ファイルがルーチン・インスツルメンテーションと前記インスツルメントしたルーチン用のルーチン識別子との間のマッピング情報を含むようにする変更手段と
を備えた、
クラス・ファイルを変更することによりユーザに固有のインスツルメンテーションを支援するシステム。
（１７）前記ルーチン識別子が前記ルーチン名を含んでおり、
前記ルーチン・インスツルメンテーションが前記ルーチンのメジャー・コードおよびマイナー・コードを含んでいる、
上記（１６）に記載の、ユーザに固有のインスツルメンテーションを支援するシステム。
（１８）さらに、
前記クラス・ファイルをオープンするオープン手段と、
レコードを書き込む書き込み手段であって、前記レコードがルーチン・インスツルメンテーションと前記インスツルメントしたルーチン用のルーチン識別子との間のマッピング情報を含んでいる書き込み手段と、
前記ルーチンを実行する実行手段と、
トレース・レコードを書き込む書き込み手段であって、前記トレース・レコードが前記ルーチンの前記実行の一側面を記述している書き込み手段と
を備えた、
上記（１６）に記載の、ユーザに固有のインスツルメンテーションを支援するシステム。
（１９）さらに、
前記レコードおよび前記トレース・レコードを後処理する後処理手段と、
レポートを生成する生成手段であって、前記レポートが前記ルーチンを前記ルーチン識別子によって特定している生成手段と
を備えた、
上記（１８）に記載の、ユーザに固有のインスツルメンテーションを支援するシステム。
（２０）クラスの中のインスツルメントすべきルーチンをルーチン名によって特定する命令手段と、
前記クラスの中の前記ルーチンをインスツルメントする命令手段と、
クラス・ファイルを変更して、前記クラスがルーチン・インスツルメンテーションと前記インスツルメントしたルーチン用のルーチン識別子との間のマッピング情報を含むようにする命令手段と
を備えた、
クラス・ファイルを変更することによりユーザに固有のインスツルメンテーションを支援するコンピューター・プログラム製品。
（２１）前記ルーチン識別子が前記ルーチン名を含んでおり、
前記ルーチン・インスツルメンテーションが前記ルーチンのメジャー・コードおよびマイナー・コードを含んでいる、
上記（２０）に記載の、ユーザに固有のインスツルメンテーションを支援するコンピューター・プログラム製品。
【図面の簡単な説明】
【図１】  （ａ）は本発明に従い、サーバとして実現することのできるデータ処理システムを示すブロック図であり、（ｂ）は本発明を実現することのできるデータ処理システムを示すブロック図である。
【図２】  メソッド名を使って後処理レポートを生成するプロセスを示すフローチャートを示す図である。
【図３】  本発明の好適な実施形態に従い、インスツルメンテーションを関連付ける分離したファイルを必要とすることなく、アプリケーション・クラスをインスツルメントするプロセスを示すフローチャートを示す図である。
【図４】  本発明の好適な実施形態に従い、コードを実行し、インスツルメンテーション用の分離した関連付けファイルの必要性をなくしたフックを出力するプロセスを示すフローチャートを示す図である。
【図５】  本発明の好適な実施形態によるトレース・レコード・ファイルを示す図である。
【図６】  本発明の好適な実施形態に従い、トレース・レコードだけから、メソッド名を含む後処理プロファイル情報レポートを生成する方法を示すフローチャートを示す図である。
【符号の説明】
１００…データ処理システム、１０２…プロセッサ、１０４…プロセッサ、１０６…システム・バス、１０８…メモリ・コントローラ／キャッシュ、１０９…ローカル・メモリ、１１０…Ｉ／Ｏバス・ブリッジ、１１２…Ｉ／Ｏバス、１１４…ＰＣＩバス・ブリッジ、１１６…ＰＣＩローカル・バス、１１８…モデム、１２０…ネットワーク・アダプタ、１２２…ＰＣＩバス・ブリッジ、１２４…ＰＣＩバス・ブリッジ、１２６…ＰＣＩバス、１２８…ＰＣＩバス、１３０…グラフィックス・アダプタ、１３２…ハードディスク駆動装置、１５０…データ処理システム、１５２…プロセッサ、１５４…メインメモリ、１５６…ＰＣＩローカル・バス、１５８…ＰＣＩブリッジ、１６０…ＬＡＮアダプタ、１６２…ＳＣＳＩホスト・バス・アダプタ、１６４…拡張バス・インタフェース、１６６…オーディオ・アダプタ、１６８…グラフィックス・アダプタ、１６９…オーディオ／ビデオ（ＡＶ）アダプタ、１７０…キーボード／マウス・アダプタ、１７２…モデム、１７４…補助メモリ、１７６…ハードディスク駆動装置、１７８…テープ駆動装置、１８０…ＣＤ−ＲＯＭ駆動装置、５００…トレース・レコード・ファイル。
【図１】
0004204768.tif 000002
【図２】
0004204768.tif 000003
【図３】
0004204768.tif 000004
【図４】
0004204768.tif 000005
【図５】
0004204768.tif 000006
【図６】
0004204768.tif 000007