JP2008186378A - 例外に対処するためのプログラム - Google Patents

例外に対処するためのプログラム Download PDF

Info

Publication number
JP2008186378A
JP2008186378A JP2007021358A JP2007021358A JP2008186378A JP 2008186378 A JP2008186378 A JP 2008186378A JP 2007021358 A JP2007021358 A JP 2007021358A JP 2007021358 A JP2007021358 A JP 2007021358A JP 2008186378 A JP2008186378 A JP 2008186378A
Authority
JP
Japan
Prior art keywords
data
exception
stack
java
class
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
JP2007021358A
Other languages
English (en)
Inventor
Ishin To
偉新 屠
Eiren Kyo
永聯 姜
Gyoka Kan
暁華 管
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
IPRIDE CO Ltd
Original Assignee
IPRIDE CO Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by IPRIDE CO Ltd filed Critical IPRIDE CO Ltd
Priority to JP2007021358A priority Critical patent/JP2008186378A/ja
Publication of JP2008186378A publication Critical patent/JP2008186378A/ja
Withdrawn legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

【課題】本発明の目的は、例外の監視と処理を容易におこなうためのプログラムを提供することにある。
【解決手段】本発明のプログラム10は、例外監視機能14、ダンプ機能16、およびダンプファイル44の表示機能18を有する。例外監視機能14によってダンプをおこなうか否かの選択をおこない、ダンプ機能16によってダンプファイル44の内容の選択をおこない、表示する機能18によってダンプファイル44をわかりやすいように表示する。
【選択図】 図1

Description

本発明は、アプリケーション(application software)でデータを処理したときに起きる例外(exception)に対処するためのプログラムに関するものである。
オブジェクト指向のプログラミング言語としてJava(登録商標、以下省略)が周知である。従来のコンピュータシステムにおけるアプリケーション開発環境は、図7に示すように、階層構造となっている。Java VM(virtual machine)が、オペレーティング・システムとアプリケーションの間に入る。Javaのアプリケーションはプラットフォーム(platform)に依存しないバイトコード(byte code)で提供されている。Java VMは、アプリケーションをプラットフォームに固有のネイティブコード(native code)に変換する。
アプリケーション開発環境には、複数のモジュール化されたJavaプログラムを含む機能セットが用意される。機能セットの中にはJ2SE(Java 2 Standard Edition)やJ2EE(Java 2 Enterprise Edition)と呼ばれるものがある。アプリケーションは、自身の有するクラス(class)でデータを処理する以外に、機能セットのクラスを使用する場合もある。また、アプリケーションはフレームワーク(framework)を使用する場合もあり、汎用および専用のフレームワークがある。アプリケーションが機能セットのクラスにデータを転送する場合、図8のように、アプリケーションから、専用フレームワーク、汎用フレームワーク、機能セットの順番にリレー形式で転送される場合がある。これは、あるオブジェクトのメソッド(method)の引数などが他のクラスやオブジェクト(object)である場合、その引数となっているオブジェクトやクラスを呼び出す(call)ためである。
図8に示すように、機能セットは複数のクラスが含まれる。例えば、J2SEであれば約4000のクラス、J2EEであれば約2000のクラスがある。アプリケーションによってフレームワークの数も増える場合がある。アプリケーションの開発で意識しながら使用するフレームワークが数個であったとしても、そのフレームワークが他の機能セットやフレームワークを使用する場合もある。したがって、アプリケーションの開発時に、アプリケーションが使用する機能セットおよびフレームワークの全てのクラスを把握するのは困難である。アプリケーションにバグが含まれる危険性が高まる。アプリケーションにバグが含まれると、アプリケーション実行時に例外が発生し、アプリケーションは異常終了する。場合によってはコンピュータシステム自体がシステムダウンしてしまう。
例外が発生するとアプリケーションは異常終了してしまうが、"catch"などを利用して例外処理をしておくと異常終了を防ぐことができる。アプリケーションの開発時に発生した例外の解析をおこない、例外処理をおこなう。例外を解析するためにスタック・トレースやログをダンプ(dump)し、それを利用する。
スタック・トレースなどは、例外発生の箇所および発生までの処理の流れの情報を有する。しかし、スタック・トレースの情報を基に、例外発生時の環境と同じ環境で例外が発生することを確認するため、非常に手間がかかる。スタック・トレースには、例外を引き起こしたデータと例外発生までのデータの流れの情報はない。複数の例外処理をおこなった場合、間違った例外処理があると、スタック・トレースで情報が得られない場合もある。
そこで、例外発生時にデータの流れを把握するために、各メソッドに引数のログが追加される。しかし、あるメソッドが他のメソッドを呼び出すとログのデータ量が大きくなる。ログのデータ量が大きくなると、システムのCPUやIOに大きなオーバーヘッドが発生する。システムに負荷がかかりすぎて、実際に使用するのが難しい。自ら構築したアプリケーションの部分以外ではログを取ることができない場合がある。引数だけではデータの流れを全て把握するのが難しい。
例外処理により監視対象の例外を指定するシステムがある。しかし、コンピュータ・システムの再起動が必要であり、速やかに例外の追加や変更を行うことができない。
非特許文献1に、例外対策が記載されている。コンピュータシステムがシステムダウンしてしまった場合、その再現をおこなったりしながら、どこに例外があるかの検討を行う。更に、ログを活用しながら例外を突き止め、例外処理をおこなう必要がある。しかし、上述したように、ログの量が多くなると例外の解析も苦労する。例外処理の経験を積んでいないと例外処理がはかどらない場合も多い。
Java Press Vol.46 pp.168-181 (株)技術評論社 平成18年2月15日発行
本発明の目的は、例外の監視と処理を容易におこなうためのプログラムを提供することにある。
本発明のプログラムは、Java VM、機能セット、フレームワーク、アプリケーションを記憶する記憶手段を有するコンピュータシステムにおいて、機能セット、フレームワーク、アプリケーションのいずれかでデータを処理するときに発生する例外に対処するためのプログラムである。本発明のプログラムは、例外に対処するために、例外の監視機能、例外発生時のダンプ機能、およびダンプファイルの表示機能を有する。
例外を監視するために、Java VMの起動時に、全ての例外のスーパークラスのコンストラクタに例外監視手段を呼び出す機能を埋め込む手段、少なくとも例外を監視するクラスまたはスーパークラスを記述したコンフィグファイル、前記コンストラクタが動作したときに前記呼び出す機能によって呼び出される前記例外監視手段であり、コンピュータシステムのスタックに格納されたメソッドのクラスまたはスーパークラスがコンフィグファイルに記述されたクラスまたはスーパークラスに含まれるか否かをチェックする例外監視手段、前記チェックによって、コンピュータシステムのスタックに格納されたメソッドを有するクラスまたはスーパークラスがコンフィグファイルに記述されたクラスまたはスーパークラスに含まれた場合、Java VMのヒープからオブジェクトを取得し、該オブジェクトをダンプする手段、としてコンピュータシステムを機能させる。
コンピュータシステムの起動後に、Java VMを起動させる。Java VMによって、ヒープにThrowableも一旦格納される。ヒープにThrowableを格納するとき、上記埋め込む手段がThrowableのコンストラクタに例外監視手段を呼び出す機能を埋め込む。例外が発生する場合、アプリケーションの動作により、Java VMがThrowableをスタックに格納する。例外が発生すると、Throwableが全ての例外のスーパークラスになっているため、Throwableのコンストラクタが実行され、例外監視手段を起動させる。例外監視手段が、例外発生時のスタックに格納された全てのメソッドのクラスまたはスーパークラスがコンフィグファイルに記述されているかをチェックする。チェックでクラスまたはスーパークラスがコンフィグファイルに記述されたいる場合、ダンプする手段が、ヒープからオブジェクトを取得し、オブジェクトをダンプする。
前記ダンプする手段は、例外発生時に、スタックに格納されたメソッドのデータを取得する手段と、ダンプの対象となるオブジェクトに関するデータのオブジェクト名を記述したオブジェクト・プールと、オブジェクトごとにダンプ時に必要なフィールドを記述したテンプレートと、スタックから取得したデータがオブジェクトである場合に、オブジェクト・プールに記述されたオブジェクトであるか否かをチェックする手段と、スタックから取得したデータがオブジェクトであり、該オブジェクトがオブジェクト・プールに記述されていない場合、該オブジェクトのテンプレートの有無をチェックし、あればテンプレートを取得する手段と、前記オブジェクトのテンプレートを取得した場合、コンピュータシステムのヒープから該当するオブジェクトのテンプレートに記述されていないフィールドを削除しながら該オブジェクトを取得する手段と、不要なフィールドを削除しながら取得したオブジェクトのダンプファイルを生成する手段と、を含む。
データを取得する手段が、スタックに格納されたメソッドから例外発生時のデータを取得する。取得したデータがオブジェクトである場合、オブジェクト・プールにあるか否かをチェックする。取得したデータがオブジェクトでなければ、以降の処理はおこなわない。オブジェクト・プールにはダンプの必要のないオブジェクトの情報がある。チェックによってオブジェクトがあれば、以降の処理はおこなわない。取得したオブジェクトのテンプレートを参照する。テンプレートがあれば、テンプレートに記載された必要なフィールドのみをヒープに格納されたオブジェクトから取得する。取得したオブジェクトからダンプファイルを生成する。
コンピュータシステムのモニターにダンプファイルを表示するために、前記ダンプファイルに含まれる例外発生時のメソッドのデータを表示する手段と、前記メソッドのデータがオブジェクトである場合、ダンプファイルの該オブジェクトのデータを表示する手段と、を含むスタックビューアを有する。
データを取得する手段が、スタックに格納されたメソッドから例外発生時のデータを取得する。取得したデータがオブジェクトである場合、オブジェクト・プールにあるか否かをチェックする。取得したデータがオブジェクトでなければ、以降の処理はおこなわない。
本発明によると、ダンプ機能を動作させる前に、ダンプをおこなうか否かの選択をおこなっている。全ての例外発生時にダンプをおこなうことはない。コンピュータシステムへの負荷が低減される。不必要にダンプがおこなわれないので、所望の例外解析のみをおこなうことができる。
本発明は、必要なフィールドのみをダンプできるようになっている。不要なオーバーヘッドを削除することができ、ダンプ時にコンピュータシステムへの負荷が低減される。また、ダンプファイルのデータ量も少なくすることができるため、例外の解析も容易になる。
本発明は、例外解析をおこないやすくするために、ダンプファイルから所望の項目を取得してモニターに表示する。表示されたメソッドをマウスなどのポインターで選択することにより、そのメソッドに関連したアプリケーション、フレームワーク、機能セットのJavaソースまたはバイトコード、オブジェクト、およびローカル変数を表示するため、単にダンプファイルを表示するのと比べて例外解析がおこないやすくなっている。
本発明に係るプログラムについて図面を用いて説明する。プログラムは、Javaのアプリケーション開発時の例外処理のためのものである。
図1に示すJavaのアプリケーション開発環境は、CPUなどのハードウェハは省略されている。本発明のプログラム10を使用するコンピュータシステム12として、サーバーが挙げられる。図1では、ハードディスクやメモリなどの記憶手段に記憶されたプログラムを示している。Java VM106、機能セット108、フレームワーク114、アプリケーション104については、従来技術と同じであるので説明を省略する。
本発明のプログラム10は、例外監視機能14、ダンプ機能16、およびダンプファイル44の表示機能18を有する。例外監視機能14によってダンプをおこなうか否かの選択をおこない、ダンプ機能16によってダンプファイル44の内容の選択をおこない、表示する機能18によってダンプファイル44をわかりやすいように表示する。まずは例外監視機能14について説明する。
本発明のプログラム10は、図2に示すように、Java VMによってヒープ(heap)に全ての例外のスーパークラスがロードされるとき、そのスーパークラスのコンストラクタ(constructor)に例外監視手段26を呼び出す機能を埋め込む手段22、少なくとも例外を監視するクラスまたはスーパークラスを記述したコンフィグファイル24、コンストラクタが動作したときに前記呼び出す機能によって呼び出される例外監視手段26であり、コンピュータシステム12のスタック(stack)20に格納されたメソッドのクラスまたはスーパークラスがコンフィグファイル24に記述されたクラスまたはスーパークラスに含まれるか否かをチェックする例外監視手段26、チェックによって、コンピュータシステム12のスタック20に格納されたメソッドを有するクラスまたはスーパークラスがコンフィグファイル24に記述されたクラスまたはスーパークラスに含まれた場合、Java VMのヒープからオブジェクトを取得し、オブジェクトをダンプする手段28、としてコンピュータシステム12を機能させる。
上記の埋め込む手段22は、Java VM106が起動し、ヒープに全てのメソッドやオブジェクトをロードするときに、Throwableに例外監視手段を呼び出す機能を埋め込む。Throwableは全ての例外のスーパークラスであり、どの例外発生時にも動作するものである。実際に例外が発生するのはサブクラスである。例外監視手段26を呼び出す機能は、BCI(byte code instructions)で提供される。例外発生時にBCIが実行される。Java VM106が起動するのはコンピュータシステム12の起動後である。アプリケーションが実行されると、Java VM106によって必要なメソッドがヒープからスタック20にロードされる。例外が発生する場合、Throwableのコンストラクタはスタックに格納される。
本発明は、例外を監視するクラスなどを記述したコンフィグファイル24を設けている。プログラマーが監視を行いたい例外をコンフィグファイル24に記述する。全ての例外を監視することにはならず、コンピュータシステム12に負担をかけることはない。
例外監視手段26は、例外が発生するまでは動作しない。したがって、コンピュータシステム12への負荷を少なくしている。例外発生時にスタック20に格納されているメソッドのクラスまたはスーパークラスがコンフィグファイル24に記述されていなければ、例外監視手段26は動作を終了する。以降の処理は実行されず、不必要なダンプファイル44を生成することはない。なお、クラスはメソッドとフィールド(field)をまとめたオブジェクトを生成するための型であり、メソッドはスタック20と呼ばれる記憶領域に格納される。メソッドは、Java VM106によってスタック20への格納と削除がおこなわれる。
ダンプする手段28は、ヒープから取得したオブジェクトからダンプファイル44を生成するものである。取得されるオブジェクトは、例外発生時にスタック20に格納されていたメソッドに関連するものである。例えば、メソッドの引数、ローカル変数、thisオブジェクトなどがオブジェクトとなる場合、そのオブジェクトがヒープから取得される。言い換えると、メソッドがオブジェクトを使用する場合、そのオブジェクトがヒープから取得される。ダンプファイル44は例外処理をおこなうために使用される。ヒープはオブジェクトを格納する記憶領域であり、Java VM106によって、オブジェクトの格納と削除がおこなわれる。thisオブジェクトは引数や変数にthisを使用したオブジェクトを指す。スタック20とヒープは、Java VMによって管理される記憶領域である。
本発明のプログラム10の動作について説明する。(1)コンピュータシステム12が起動後、Java VM106が起動される。Java VM106によって、ヒープにThrowableも格納される。ヒープにThrowableを格納するとき、上記の埋め込む手段22がThrowableのコンストラクタに例外監視手段26を呼び出す機能を埋め込む。この例外監視手段22を呼び出す機能はBCIで提供される。アプリケーションが実行されると、Java VM106によってスタック20にメソッドがロードされる。例外が発生する場合、Throwableのコンストラクタはスタックに格納される。
(2)例外が発生すると、Throwableが全ての例外のスーパークラスになっているため、Throwableのコンストラクタが実行される。コンストラクタが実行されることにより、上記(1)で埋め込んだBCIが起動し、例外監視手段26を起動させる。
(3)例外監視手段26が、例外発生時のスタック20に格納された全てのメソッドのクラスまたはスーパークラスがコンフィグファイル24に記述されているかをチェックする。無ければ例外の監視を終了し、以降の処理はおこなわない。
(4)上記(3)のチェックでクラスまたはスーパークラスがコンフィグファイル24に記述されている場合、ダンプする手段28が、ヒープからオブジェクトを取得し、このオブジェクトをダンプする。ヒープから取得するオブジェクトは、スタック20から取得されたデータに関するものである。例えば、スタックから取得されたメソッドの引数、ローカル変数、thisオブジェクトなどがオブジェクトとなる場合、そのオブジェクトがヒープから取得される。
本発明は、上述したように、例外発生時に所望のオブジェクトのみがダンプされるので、従来に比べてダンプするデータ量が減る。ダンプする時間も短縮され、コンピュータシステム12への負荷が低減される。例えば、従来であれば10分近くかかっていたダンプが、数秒で終了する場合もある。所望のオブジェクトのみがダンプされるため、例外の解析も容易になり、例外処理の間違いも減る。
アプリケーション104によってはデータの転送経路が多くなったり、複雑になったりすることがある。全ての転送経路のメソッドに対してオブジェクトを取得し、ダンプすることは、コンピュータシステム12への負荷が大きくなる場合がある。したがって、所望の経路で発生する例外に対してダンプができるようにしても良い。メソッドが他のメソッドをコールする経路が複数ある場合に、所望の経路の例外を監視することができる。この場合、上述したプログラム10に、以下の構成を付加する。
コンフィグファイル24に監視する例外の発生経路の記述を加える。例外監視手段26は、例外発生時に、スタック20に格納されたメソッドのシグネチャおよびクラスパスがコンフィグファイル24に記述された発生経路に含まれるか否かをチェックする。ダンプする手段28は、チェックによって、スタック20に格納されたメソッドのシグネチャまたはクラスパスがコンフィグファイル24に記述された発生経路に含まれた場合、コンピュータシステム12のヒープからオブジェクトを取得し、そのオブジェクトをダンプする。シグネチャは、引数のタイプ(クラス名)と戻り値のタイプ(クラス名)を定義するものである。
上記の構成により、監視したい経路の例外をダンプし、他の経路で例外が発生してもダンプはおこなわれなくなる。例えば、図3に示すように、第1および第2経路を有する場合、第1経路のみを監視することができる。同じ場所で例外が発生しても、データの処理が第2経路であればダンプされない。必要な経路のデータのみをダンプすることができ、コンピュータシステム12の負荷を押さえることができる。
なお、コンフィグファイル24の記述は、実施例1または実施例2のいずれかの内容であっても良いし、両方であっても良い。両方である場合、実施例1および実施例2で説明した記載がコンフィグファイル24に記載されていた場合に、ヒープからオブジェクトを取得してダンプをおこなう。
コンフィグファイル24の記述を柔軟に変更できればコンピュータシステム12の運用が楽になる。そのために、コンフィグファイル24の記述が、Java VM106の起動後に追加または変更されるようにする。コンフィグファイル24を実行ファイルである例外監視手段26から分離したテキストファイルにし、例外監視手段26が常に動作していても、Java VM106の起動後のコンフィグファイル24の変更が可能となる。
実施例1から3に示したように、本発明は従来と比較してダンプファイル44のデータ量を少なくすることができる構成となっている。また、柔軟にダンプする内容を変更できる構成になっている。ダンプする内容も所望のデータのみをダンプすることができ、例外処理の負担を減らすことができる。コンピュータシステム12の運用が容易となっている。
次に、ダンプ機能16、すなわち実施例1で示したダンプする手段28について説明する。ダンプする手段28は、図4に示すように、スタック20に格納されたメソッドから例外発生時のデータを取得する手段30と、ダンプの対象となるオブジェクトに関するデータを記述したオブジェクト・プール32と、オブジェクトごとにダンプ時に必要なフィールドを記述したテンプレート34と、スタック20から取得したデータがオブジェクトである場合に、オブジェクト・プール32に記述されたオブジェクトであるか否かをチェックする手段36と、スタック20から取得したデータがオブジェクトであり、そのオブジェクトがオブジェクト・プール32に記述されている場合、オブジェクトのテンプレート34の有無をチェックし、あればテンプレート34を取得する手段38と、オブジェクトのテンプレート34を取得した場合、ヒープ40から該当するオブジェクトのテンプレート34に記述されていないフィールドを削除しながらオブジェクトを取得する手段42と、不要なフィールドを削除しながら取得したオブジェクトのダンプファイル44を生成する手段46と、を含む。
スタック20の例外発生時のデータとしては、メソッドの名前、メソッドのシグネチャ、引数のデータ、ローカル変数のデータ、thisオブジェクトのデータ、実行ラインなどである。引数のデータは、タイプ(クラス名)、名前、値もしくはオブジェクトIDを含む。ローカル変数のデータは、タイプ(クラス名)、名前、値もしくはオブジェクトIDを含む。thisオブジェクトのデータは、クラス名およびオブジェクトIDを含む。
オブジェクト・プール32に格納されるオブジェクトに関するデータのは、少なくともオブジェクト名が必要であるが、他のデータを含んでも良い。例えば、オブジェクトのID、オブジェクトのタイプ(クラス名)、インスタンス(instance)となるオブジェクトのID、フィールドの情報などである。フィールドの情報としては、クラス名、名前、値もしくはオブジェクトのIDなどである。
チェックする手段36は、上述した例外発生時のデータ、例えば引数などがオブジェクトとなっている場合、オブジェクト・プール32を参照する。このデータが、オブジェクト・プール32に無ければ以降の処理はおこなわず、あればテンプレート34を使用したダンプをおこなう場合がある。言い換えると、例外発生時にスタック20から取得したデータがオブジェクトでないと、ダンプはおこなわれない。また、所望のオブジェクトでなければ、ダンプをおこなわない。
テンプレートを取得する手段38は、ダンプをおこなうオブジェクトのテンプレート34を取得する。テンプレート34には、ダンプに必要な情報が記述されている。この情報としては、ダンプをおこなうオブジェクトのフィールドが含まれる。テンプレート34は、Java VM106が起動後であっても変更可能なように、テキストファイルで作成し、他の実行ファイルとは分離するようにする。
オブジェクトを取得する手段42は、テンプレート34を使用して不必要なフィールドを削除しながらヒープ40にロードされたオブジェクトのデータを取得する。テンプレートによってオブジェクトにフィルターをかけることとなっている。したがって、取得するオブジェクトのデータ量が減少され、コンピュータシステム12への負荷が低減される。不必要なフィールドのデータがダンプされないので例外の解析も楽になる。オブジェクトのデータとしては、オブジェクトのID、タイプ(クラス名)、インスタンスとなるオブジェクトのID、フィールドのデータである。この中で、フィルターがかけられるのがフィールドである。不必要なフィールドはダンプの対象とはならない。フィールドのデータとしては、タイプ(クラス名)、名前、値もしくはオブジェクトのIDが含まれる。なお、テンプレート34を取得する手段とオブジェクトを取得する手段は、一体であっても良い。
実施例4における本発明のプログラム10の動作を説明する。(1)上記のデータを取得する手段30が、スタック20に格納されたメソッドから例外発生時のデータを取得する。取得するデータは、上述したようなデータである。ローカル変数などは、オブジェクトである場合がある。
(2)取得したデータがオブジェクトである場合、オブジェクト・プール32にあるか否かをチェックする。取得したデータがオブジェクトでなければ、以降の処理はおこなわない。オブジェクト・プール32にはダンプをおこなうオブジェクトの情報がある。チェックによってオブジェクトが無ければ、以降の処理はおこなわない。したがって、取得したデータがオブジェクトであって、オブジェクト・プール32に情報がある場合、以降の処理をおこなう。不要なダンプをおこなわず、コンピュータシステム12に負荷をかけない。
(3)取得したデータがオブジェクトであって、オブジェクト・プール32に情報がある場合、テンプレート34を参照する。テンプレート34はダンプに必要なデータが含まれており、下記(4)で取得するオブジェクトにフィルターをかけるものである。
(4)テンプレート34があれば、テンプレート34に記載された必要なフィールドのみをヒープ40に格納されたオブジェクトから取得する。オブジェクトは、スタック20から取得したデータに対応したものである。不要なフィールドを削除しながらオブジェクトを取得するため、オブジェクトのデータ量が低減される。
ヒープ40から取得したオブジェクトのデータが、オブジェクトである場合がある。すなわち、あるオブジェクトが他のオブジェクトを継承している場合である。そこで、ヒープ40からデータを取得した後、そのデータに対して(2)から(4)の工程を行う。(2)から(4)の工程は、1度の場合もあれば複数回繰り返される場合もある。
(5)ヒープ40から取得したオブジェクトのデータからダンプファイル44を生成する。すなわち、取得したオブジェクトをダンプする。(2)から(4)の作業を繰り返しおこなう場合があるが、そのような場合は、ヒープ40から取得したデータの全てをダンプするようにする。
以上のように、本発明は不要なダンプをおこなわなかったり、ダンプファイル44のデータ量を低減することができる。したがって、コンピュータシステム12への負荷が低減される。また、例外の解析の苦労も低減される。
オブジェクト・プール32に記述されるのは、ダンプされるオブジェクトに関するものであるが、その逆であっても良い。ダンプをおこなわないオブジェクトについて、オブジェクト・プール32を作成しても良い。チェックする手段36の動作は逆になる。
オブジェクトの全てについてテンプレート34を作成する必要はない。例えば、あるオブジェクトの全てのフィールドをダンプしたい場合である。したがって、オブジェクトのテンプレートがない場合、オブジェクトを取得する手段42が、ヒープ40からフィールドの削除をおこなわずにオブジェクトを取得しするように構成する。また、ダンプファイル44を生成する手段46は、フィールドの削除をおこなわずに取得したオブジェクトのダンプフィル44を生成する。
フィールドの削除をおこなうオブジェクトのみに対してテンプレート34を作成すればよい。テンプレート34のデータ量を減らすことができ、テンプレート34の作成も簡単になる。
ダンプファイル44に含まれるのがオブジェクトだけではなくスタック・トレースに関しても必要となる場合がある。その場合のために、ダンプファイル44を生成する手段は、スタックに格納されたメソッドから取得した例外発生時のデータも含めてダンプファイル44を生成するようにする。
実施例4から6で示したように、本発明は、ダンプについてもコンピュータシステム12への負荷を低減させ、例外の解析を容易にするように構成されている。
例外の解析をおこなうためにダンプファイル44を実際にコンピュータシステム12のモニターに表示させることが必要である。例外の解析をしやすくするために、ダンプファイル44の項目を分けて表示するのが好ましい。本発明では、図5に示すようにスタックビューア48、ソースビューア50、オブジェクトビューア52、およびローカル変数ビューア54とを含むように構成する。コンピュータシステム12はGUI(graphical user interface)に対応したものが好ましい。
スタックビューア48は、ダンプファイル44に含まれる例外発生時のメソッドのデータを表示する手段と、メソッドのデータがオブジェクトである場合、ダンプファイル44にあるそのオブジェクトのデータを表示する手段と、を含む。ここで、ダンプファイル44は実施例4などで取得したものである。
ダンプファイル44に含まれるメソッドのデータは、例外発生時にスタック20に格納されていたメソッドに関するデータである。具体的には、メソッドのデータには、メソッドの名前、メソッドのシグネチャ、引数のデータ、ローカル変数のデータ、thisオブジェクトのデータ、実行ラインなどである。引数のデータは、タイプ(クラス名)、名前、値もしくはオブジェクトIDを含む。ローカル変数のデータは、タイプ(クラス名)、名前、値もしくはオブジェクトIDを含む。thisオブジェクトのデータは、クラス名およびオブジェクトIDを含む。ダンプの対象となるメソッドが複数になれば、メソッドごとにデータが存在する。
メソッドのデータ、すなわちメソッドの引数などがオブジェクトである場合、該当するオブジェクトのデータもあわせて表示する。表示されるオブジェクトのデータは、ダンプファイル44のためにヒープ40から取得されたものである。オブジェクトのデータとしては、オブジェクトのID、タイプ(クラス名)、インスタンスとなるオブジェクトのID、フィールドのデータである。この中で、フィルターがかけられるのがフィールドである。不必要なフィールドはダンプの対象とはならない。フィールドのデータとしては、タイプ(クラス名)、名前、値もしくはオブジェクトのIDが含まれる。
本発明は、例外発生時のスタック20に格納されていたメソッドおよびそのメソッドの引数などのオブジェクトを表示する。実施例4などでダンプファイル44のデータ量を削減しており、モニターに表示されるデータ量も少なくなる。例外発生時のメソッドおよび関連するオブジェクトを表示することができ、例外の解析もしやすくなる。
例外発生時には複数のメソッドがスタック20に格納されており、複数のメソッドがモニターに表示される。そこで、例外解析を手助けするために、所望のメソッドとそれに関連するデータがモニターに表示されるのが好ましい。そこで本発明は、図5に示すように、スタックビューア48以外に、ソースビューア50、オブジェクトビューア52、およびローカル変数ビューア54を備える。これらは、スタックビューア48に表示されたメソッド名がコンピュータシステム12のポインタで選択された場合に動作するものである。図6に示すように、1つのウィンドウ56を複数に分割して、それぞれのデータが表示されるようにする。図6では、オブジェクトビューアとローカル変数ビューアとはキーボードのキー操作によって切り替わるようになっている。ローカル変数ビューアを独立して表示させるようにしても良い。属性ビューアは、マウスなどのポインタで選択されているメソッドのオブジェクトIDなどを示すものである。
ソースビューア50は、選択されたメソッド名に対応するメソッドのデータをスタックビューア48から受け取り、受け取ったメソッドのデータに対応するアプリケーション104、フレームワーク114、機能セット108を取得し、表示する。表示されるアプリケーション104は、Javaソース58かバイトコード60の形式である。アプリケーション104はバイトコード60の形式で市場に提供されるが、開発時はJavaソース58の形式であるため、プログラム10が2つの形式に対応するようにする。
オブジェクトビューア52は、選択されたメソッド名に対応するthisオブジェクトのデータをスタックビューア48から受け取り、受け取ったthisオブジェクトのデータに対応するオブジェクトのデータをダンプファイル44から取得し、表示する。
ローカル変数ビューア54は、選択されたメソッド名に対応するthisオブジェクトのデータおよびメソッドのシグネチャをスタックビューア48から受け取り、受け取ったthisオブジェクトのデータおよびメソッドのシグネチャに対応するメソッドからローカル変数のデータを取得し、表示する。
上述のように、所望のメソッドをマウスなどのポインタで選択することによって、それに関連したデータを表示することができる。例外解析の時間短縮と間違いの防止などの効果がある。
上述したように、アプリケーション104はJavaソース58またはバイトコード60である。ソースビューア50は、thisオブジェクトのデータに対応するJavaソース58を取得し、Javaソース58がなければthisオブジェクトのデータとメソッドのシグネチャに対応するバイトコード60を取得するようにする。
実行ラインのデータに基づいて取得したJavaソース58またはバイトコード60の該当実行ラインを他の実行ラインとは区別するようにモニターで表示する。その区別は、該当実行ラインに色を付けたりマークをしたりすることが含まれる。ポインタでメソッド名が選択されると、アプリケーション104のどの部分が例外に関わる箇所であるかがわかるようになる。
モニターにダンプファイル44を表示させるときのプログラムの動作について説明する。(1)ダンプファイル44にあるメソッドのデータから、メソッド名、引数、ローカル変数をスタックビューア48により表示する。
(2)表示した引数、ローカル変数がオブジェクトである場合、該当オブジェクトIDを使って、ダンプファイル44からオブジェクトのデータを取得し、スタックビューア48により表示する。ここまでで、メソッドおよびそれに関連するオブジェクトが表示され、例外解析をおこなう最低限のデータが表示されたこととなる。表示されたメソッド名がポインタなどで選択された場合、以下の動作をおこなう。
(3)スタックビューア48は、選択されたメソッドのthisオブジェクトのID、メソッドのシグネチャおよび実行ラインのデータをソースビューア50に送る。また、スタックビューア48は、thisオブジェクトのIDをオブジェクトビューア52に送る。さらに、スタックビューア48は、thisオブジェクトのID、メソッドのシグネチャをローカル変数ビューア54に送る。
(4)ソースビューア50は、クラス名に基づいて、Javaソース58を取得して表示する。Javaソース58がない場合、クラス名とメソッドのシグネチャに基づいてバイトコード60を取得して表示する。また、実行ラインの情報に基づいて、該当ラインを色分けする。
(5)オブジェクトビューア52は、thisオブジェクトのIDを使用して、ダンプファイル44から該当オブジェクトの情報を取得して表示する。該当オブジェクトのインスタンスがあれば、それもダンプファイル44から取得して表示する。該当オブジェクトのフィールドがオブジェクトであれば、それもダンプファイル44から取得して表示する。
(6)ローカル変数ビューア54は、該当メソッドのバイトコード60からローカル変数の情報(ID、名前、タイプ)を取得して表示する。
以上のように、ダンプファイル44を項目ごとに表示することができ、例外の解析をおこない易くなっている。実施例6までの構成でダンプファイル44のデータ量を低減していれば、更に例外の解析がし易くなる。
GUIを使用する場合、ダンプファイル44はモニターのウィンドウに表示される。スタックビューア48、ソースビューア50、オブジェクトビューア52、およびローカル変数ビューア54は、図6のように1つのウィンドウ56で表示をおこなっても良いし、それぞれ別個のウィンドウで表示をおこなっても良い。
以上、本発明について種々の実施例を示して説明したが、上記実施例に限定されるものではない。上記の実施例を周知の技術と組み合わせても良い。例えば、実施例1から3では例外の監視機能を説明したが、その後、実施例4以降の構成を使用せず、スタック20に格納されたメソッドおよびそれに関連するヒープ40のオブジェクトを全てダンプするようにしても良い。また、実施例4から6についても同様で、例外が発生すると実施例1から3をおこなわずに、実施例4から始まる構成であっても良い。さらに、実施例7から9のみの構成であってもよく、従来のコンピュータシステム100で作成されたダンプファイルについて、実施例7から9の構成を適用するようにする。
本発明はJavaに関するプログラムとして説明したが、同様の構成・動作の他のプログラミング言語に本発明は適用可能である。
その他、本発明は、その主旨を逸脱しない範囲で当業者の知識に基づき種々の改良、修正、変更を加えた態様で実施できるものである。
本発明のプログラムの構成を示す図である。 本発明のプログラムの例外監視機能を示す図である。 監視する経路を示す図である。 本発明のプログラムのダンプ機能を示す図である。 本発明のプログラムのダンプファイルの表示機能を示す図である。 複数のビューアが1つのウィンドウで表示される様子を示す図である。 従来のアプリケーションの開発環境を示す図である。 従来のデータの流れを示す図である。
符号の説明
10:プログラム
12、100:コンピュータシステム
14:例外監視機能
16:ダンプ機能
18:表示機能
20:スタック
22:埋め込む手段
24:コンフィグファイル
26:例外監視手段
28:ダンプ手段
30:データを取得する手段
32:オブジェクト・プール
34:テンプレート
36:チェックする手段
38:テンプレートを取得する手段
40:ヒープ
42:オブジェクトを取得する手段
44:ダンプファイル
46:ダンプファイルの生成手段
48:スタックビューア
50:ソースビューア
52:オブジェクトビューア
54:ローカル変数ビューア
56:ウィンドウ
58:Javaソース
60:バイトコード
102:オペレーティングシステム
104:アプリケーション
106:Java VM
108機能セット
110:J2SE
112:J2EE
114:フレームワーク
116:汎用フレームワーク
118:専用フレームワーク
120:データ

Claims (9)

  1. Java VM、機能セット、フレームワーク、アプリケーションを記憶する記憶手段を有するコンピュータシステムにおいて、機能セット、フレームワーク、アプリケーションのいずれかでデータを処理するときに発生する例外に対処するためのプログラムであって、
    コンピュータシステムを、
    前記Java VMによって全ての例外のスーパークラスがJava VMのヒープにロードされるときに、該スーパークラスのコンストラクタに例外監視手段を呼び出す機能を埋め込む手段、
    少なくとも例外を監視するクラスまたはスーパークラスを記述したコンフィグファイル、
    前記コンストラクタがスタックにロードされ後、該コンストラクタが動作したときに前記呼び出す機能によって呼び出される前記例外監視手段であり、Java VMのスタックに格納されたメソッドのクラスまたはスーパークラスがコンフィグファイルに記述されたクラスまたはスーパークラスに含まれるか否かをチェックする例外監視手段、
    前記チェックによって、スタックに格納されたメソッドを有するクラスまたはスーパークラスがコンフィグファイルに記述されたクラスまたはスーパークラスに含まれた場合、Java VMのヒープからオブジェクトを取得し、該オブジェクトをダンプする手段、
    として機能させるプログラム。
  2. 監視する例外の発生経路の記述としてメソッドのシグネチャおよびクラスパスを前記コンフィグファイルに含み、
    前記例外監視手段が、スタックに格納されたメソッドのシグネチャおよびクラスパスが前記コンフィグファイルに記述された発生経路に含まれるか否かをチェックし、
    前記チェックによって、スタックに格納されたメソッドのシグネチャおよびクラスパスが前記コンフィグファイルに記述された発生経路に含まれた場合、前記ダンプする手段が、ヒープからオブジェクトを取得し、該オブジェクトをダンプする、
    請求項1のプログラム。
  3. 前記コンフィグファイルの記述が前記Java VMの起動後に追加または変更できるように、該コンフィグファイルをテキストファイルで構成し、実行ファイルである例外監視手段とは分離する請求項1または2のプログラム。
  4. 前記ダンプする手段が、
    例外発生時に、スタックに格納されたメソッドのデータを取得する手段と、
    ダンプの対象とするオブジェクトに関するデータを記述したオブジェクト・プールと、
    オブジェクトごとにダンプ時に必要なフィールドを記述したテンプレートと、
    スタックから取得したデータがオブジェクトである場合に、オブジェクト・プールに記述されたオブジェクトであるか否かをチェックする手段と、
    スタックから取得したデータがオブジェクトであり、該オブジェクトがオブジェクト・プールに記述されている場合、該オブジェクトのテンプレートの有無をチェックし、あればテンプレートを取得する手段と、
    前記オブジェクトのテンプレートを取得した場合、Java VMのヒープから該当するオブジェクトのテンプレートに記述されていないフィールドを削除しながら該オブジェクトを取得する手段と、
    不要なフィールドを削除しながら取得したオブジェクトのダンプファイルを生成する手段と、
    を含む請求項1乃至3のいずれかのプログラム。
  5. 前記オブジェクトのテンプレートがない場合、前記オブジェクトを取得する手段が、前記ヒープからフィールドの削除をおこなわずにオブジェクトを取得し、前記ダンプファイルを生成する手段が、取得したオブジェクトのダンプフィルを生成する請求項4のプログラム。
  6. 前記ダンプファイルを生成する手段が、前記スタックに格納されたメソッドから取得した例外発生時のデータも含めてダンプファイルを生成する請求項4または5のプログラム。
  7. コンピュータシステムのモニターにダンプファイルを表示するために、
    前記ダンプファイルに含まれる例外発生時のメソッドのデータを表示する手段と、
    前記メソッドのデータがオブジェクトである場合、ダンプファイルの該オブジェクトのデータを表示する手段と、
    を含むスタックビューアを有する請求項6のプログラム。
  8. 前記メソッドのデータには、メソッドごとにメソッド名、thisオブジェクトのデータ、メソッドのシグネチャおよび実行ラインのデータが含まれ、前記モニターに表示されたメソッド名がコンピュータシステムのポインタで選択された場合、
    選択されたメソッド名に対応するメソッドのデータを前記スタックビューアから受け取り、受け取った該メソッドのデータに対応する前記アプリケーションを取得し、表示するソースビューアと、
    選択されたメソッド名に対応するthisオブジェクトのデータを前記スタックビューアから受け取り、受け取ったthisオブジェクトのデータに対応するオブジェクトのデータを前記ダンプファイルから取得し、表示するオブジェクトビューアと、
    選択されたメソッド名に対応するthisオブジェクトのデータおよびメソッドのシグネチャを前記スタックビューアから受け取り、受け取ったthisオブジェクトのデータおよびメソッドのシグネチャに対応するメソッドからローカル変数のデータを取得し、表示するローカル変数ビューアと、
    を含む請求項7のプログラム。
  9. 前記アプリケーション、機能セット、フレームワークがJavaソースまたはバイトコードであり、前記ソースビューアが、前記thisオブジェクトのデータに対応するJavaソースを取得し、Javaソースがなければthisオブジェクトのデータとメソッドのシグネチャに対応するバイトコードを取得し、前記実行ラインのデータに基づいて取得したJavaソースまたはバイトコードの該当実行ラインを他の実行ラインとは区別するようにモニターで表示する請求項8のプログラム。
JP2007021358A 2007-01-31 2007-01-31 例外に対処するためのプログラム Withdrawn JP2008186378A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007021358A JP2008186378A (ja) 2007-01-31 2007-01-31 例外に対処するためのプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007021358A JP2008186378A (ja) 2007-01-31 2007-01-31 例外に対処するためのプログラム

Publications (1)

Publication Number Publication Date
JP2008186378A true JP2008186378A (ja) 2008-08-14

Family

ID=39729351

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007021358A Withdrawn JP2008186378A (ja) 2007-01-31 2007-01-31 例外に対処するためのプログラム

Country Status (1)

Country Link
JP (1) JP2008186378A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011107813A (ja) * 2009-11-13 2011-06-02 Nippon Telegr & Teleph Corp <Ntt> コアファイル取得装置、コアファイル取得方法及びコアファイル取得プログラム
WO2012137239A1 (ja) * 2011-04-04 2012-10-11 株式会社日立製作所 計算機システム
JP2017054453A (ja) * 2015-09-11 2017-03-16 富士通株式会社 解析プログラム、解析方法および解析装置
KR101828156B1 (ko) * 2016-06-23 2018-02-12 주식회사 와탭랩스 트랜잭션 모니터링 시스템 및 그 동작방법

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011107813A (ja) * 2009-11-13 2011-06-02 Nippon Telegr & Teleph Corp <Ntt> コアファイル取得装置、コアファイル取得方法及びコアファイル取得プログラム
WO2012137239A1 (ja) * 2011-04-04 2012-10-11 株式会社日立製作所 計算機システム
JP2017054453A (ja) * 2015-09-11 2017-03-16 富士通株式会社 解析プログラム、解析方法および解析装置
KR101828156B1 (ko) * 2016-06-23 2018-02-12 주식회사 와탭랩스 트랜잭션 모니터링 시스템 및 그 동작방법

Similar Documents

Publication Publication Date Title
JP4950454B2 (ja) テスト自動化のスタック階層化
US9223681B2 (en) Automated debug trace specification
US7908521B2 (en) Process reflection
US8423969B2 (en) Inheritance breakpoints for use in debugging object-oriented computer programs
US8095917B2 (en) Debugger for virtual intermediate language operations
US6698016B1 (en) Method for injecting code into another process
US8516175B2 (en) Graphical development tool for compensation actions and compensation scope in a process flow environment
US8797338B2 (en) Platform agnostic screen capture tool
US8495590B2 (en) User-specific software debugging
US10545852B2 (en) Diagnostics of state transitions
CN106055368B (zh) 应用更新方法和装置
US9442717B2 (en) Techniques for automatically identifying input files used to generate output files in a software build process
US20080127055A1 (en) Application proxy
JP2003186708A (ja) アクセス権矛盾検出装置および解析ルール作成装置
US7721250B2 (en) System and method for interactive and integrated software development process and phases
US8863093B1 (en) Load-time instrumentation of virtual machine program code
US20180129494A1 (en) Detect application defects by correlating contracts in application dependencies
JP2008186378A (ja) 例外に対処するためのプログラム
Macias et al. Webjshrink: a web service for debloating java bytecode
US20050114847A1 (en) Method, apparatus and computer program for automatically determining compile-time module dependencies
US7447947B2 (en) System and method for economizing trace operations
CN111367796A (zh) 应用程序调试方法及装置
JP4983027B2 (ja) チェックプログラム及びチェック方法
CN109426601B (zh) 一种对程序进行无状态检测的方法和装置
JP2014038467A (ja) 一貫性破壊検出装置、一貫性破壊検出プログラム、及び一貫性破壊検出方法

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20100406