JP6119535B2 - トレース方法、処理プログラム、および情報処理装置 - Google Patents

トレース方法、処理プログラム、および情報処理装置 Download PDF

Info

Publication number
JP6119535B2
JP6119535B2 JP2013203365A JP2013203365A JP6119535B2 JP 6119535 B2 JP6119535 B2 JP 6119535B2 JP 2013203365 A JP2013203365 A JP 2013203365A JP 2013203365 A JP2013203365 A JP 2013203365A JP 6119535 B2 JP6119535 B2 JP 6119535B2
Authority
JP
Japan
Prior art keywords
instruction
trace
function
execution
executed
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.)
Active
Application number
JP2013203365A
Other languages
English (en)
Other versions
JP2015069437A (ja
Inventor
隆 中川
隆 中川
保利 鈴木
保利 鈴木
山本 博之
博之 山本
一英 今枝
一英 今枝
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.)
Fujitsu Ltd
Original Assignee
Fujitsu 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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2013203365A priority Critical patent/JP6119535B2/ja
Priority to US14/483,750 priority patent/US9612837B2/en
Publication of JP2015069437A publication Critical patent/JP2015069437A/ja
Application granted granted Critical
Publication of JP6119535B2 publication Critical patent/JP6119535B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明は、プログラム間の呼び出し制御を行うトレース方法、処理プログラ、および情報処理装置に関する。
近年、OS(Operating System)の機能強化・拡張に伴い、OSの規模が肥大化し、OSにおいて生じる障害は複雑化している。OSの障害の調査手法の一つにトレース技術がある。トレース技術では、プログラム中の特定のコードを実行する時点での、コンピュータの状態に関する情報を採取する技術である。トレース技術では、例えば特定のコードを実行するときのレジスタの内容などの情報が採取される。トレース技術は特に原因解明の困難な複雑化した障害に対して用いられ、今後さらに発展し複雑化していくOSの障害調査にはトレース技術を進展させることが重要である。
障害調査に有用な技術としては、例えばプログラムの同一の場所で例外が発生した場合であっても、プロセス毎に例外処理を変えることを可能とするデバッグ方法がある。
特開2006−268298号公報
トレース処理において、OSで用意されたAPI(Application Program Interface)などのプログラムを呼び出して処理を実行することができれば、トレース処理の自由度が高まる。例えばトレース処理中にストレージ装置内のファイル操作用のAPIを呼び出すことができれば、トレースで採取した情報をストレージ装置に退避させることができる。なお、OSで用意されたAPIなどのプログラムで障害が発生する場合がある。その場合、APIなどのプログラムをトレース対象として、トレース処理を実施することとなる。
しかし、従来のトレース技術では、トレース処理中に呼び出されるAPIなどのプログラムをトレース対象とすると、トレース処理内でそのプログラムが再帰的に呼び出されてしまい、処理が無限ループに陥る。そのため、トレース処理中で呼び出されるプログラムをトレース対象とすることができない。
1つの側面では、本件は、トレース処理を実行することによる処理のループの発生を抑止することを目的とする。
1つの案では、プログラムの実行中に、トレースコードに基づいてトレース処理を実行するための処理プログラムであって、コンピュータに以下の処理を実行させる処理プログラムが提供される。当該プログラムを実行するコンピュータは、プログラムに定義された関数内のトレース位置に記述された第1の命令を、トレースコードの実行を指示する第2の命令に書き換えると共に、第1の命令を記憶手段に格納する。またコンピュータは、関数実行中のトレース位置の実行時に、第2の命令に基づいてトレースコードを実行する。トレースコード内に関数を呼び出す第3の命令が含まれる場合、コンピュータは、第3の命令の実行時には、関数内のトレース位置の第2の命令を、記憶手段に格納した第1の命令に置き換えて、関数を実行する。
1態様によれば、トレース処理を実行することによる処理のループの発生が抑止される。
第1の実施の形態に係る情報処理装置の一例を示す図である。 本実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。 トレース機能の一例を示すブロック図である。 トレースの処理の概要を示す図である。 ハンドラにおいてトレースポイントを含む関数を呼び出さない場合の命令の一例を示す図である。 ハンドラにおいてトレースポイントを含む関数を呼び出すことによるループ発生例を示す図である。 第2の実施の形態におけるハンドラからのトレース対象のプログラムの呼び出し例を示す図である。 トレース設定ファイルの一例を示す図である。 トレース設定処理の手順の一例を示すフローチャートである。 トレース管理テーブルの一例を示す図である。 トレース管理テーブル作成処理の手順を示すフローチャートである。 トレース設定ファイル読み込み処理の手順の一例を示すフローチャートである。 IAT書き換え処理の手順の一例を示すフローチャートである。 APIリストの一例を示す図である。 トラップ例外処理の手順の一例を示すフローチャートである。 トレースデータ採取処理の手順の一例を示すフローチャートである。 先頭以外の箇所をトレースポイントとした場合のループ発生例を示す図である。 第3の実施の形態におけるハンドラからのトレース対象の関数の呼び出し例を示す図である。 第3の実施の形態におけるトレース設定ファイルの一例を示す図である。 第3の実施の形態におけるトレース設定処理の手順の一例を示すフローチャートである。 第3の実施の形態におけるトラップ例外処理の手順の一例を示すフローチャートである。 TID管理テーブルの一例を示す図である。 スレッド判別処理の手順の一例を示すフローチャートである。 第3の実施の形態におけるトレースデータ採取処理の手順の一例を示すフローチャートである。 第4の実施の形態におけるトレース管理テーブルの一例を示す図である。 第4の実施の形態におけるトレース設定ファイル読み込み処理の手順の一例を示すフローチャートである。 トラップ例外処理の手順の一例を示すフローチャートである。 トレースアドレス判別処理の手順の一例を示すフローチャートである。
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る情報処理装置の一例を示す図である。第1の実施の形態に係る情報処理装置10は、プログラム1の実行中に、トレースコード2に基づいてトレース処理を実行する。トレース処理は、例えば、プログラム1実行中の所定の時点でのメモリやレジスタの内容を取得する処理である。情報処理装置10は、トレース処理を実現するために、書き換え手段11、記憶手段12、および実行手段13を有する。情報処理装置10は、例えばプロセッサやメモリを有するコンピュータである。
書き換え手段11は、プログラム1に定義された関数1a内のトレース位置に記述された第1の命令4を、トレースコード2の実行を指示する第2の命令5に書き換える(ステップS1)。例えばトレースコード2が例外処理を実行するハンドラ内に記述されたコードの場合、第2の命令5は例外命令である。命令の書き換えは、メモリ上で行われる。例えばプログラム1が展開されたメモリ内の第1の命令4が格納された記憶領域に、第2の命令5が書き込まれる。これにより、プログラム1内にトレースコードをフック(処理を追加すること)することができる。
トレースコード2には、プログラム1における第1の命令4の実行時に採取すべき情報の採取手順が記述されている。ここでトレースコード2において高度な処理を行うために、プログラム1内の関数1aの処理が有効な場合がある。その場合、トレースコード2内に関数1aを呼び出す第3の命令6が記述される。
また書き換え手段11は、第2の命令5に書き換えられた第1の命令4を、記憶手段12に格納する(ステップS2)。例えば書き換え手段11は、第1の命令4に続けて、プログラム1におけるトレース位置の次の命令へのジャンプを指示する第4の命令7を記述したスタブ3を生成する。そして書き換え手段11は、スタブ3を記憶手段12に格納する。
記憶手段12は、第1の命令4を記憶する。例えば記憶手段12は、第1の命令4を含むスタブ3を記憶する。
実行手段13は、関数1a実行中のトレース位置の実行時に、第2の命令5に基づいてトレースコード2を実行する(ステップS3)。例えば第2の命令5が例外命令であれば、実行手段13は、例外ハンドラとして定義されているトレースコード2を呼び出し、呼び出したトレースコード2を実行する。
実行手段13は、トレースコード2内に関数1aを呼び出す第3の命令6が含まれる場合、第3の命令6の実行時には、関数1a内のトレース位置の第2の命令5を、記憶手段12に格納した第1の命令4に置き換えて、関数1aを実行する。
例えば実行手段13は、第3の命令6に基づいて、プログラム1内の関数1aを呼び出して、関数1aを実行する(ステップS4)。そして実行手段13は、関数1aの実行中に第2の命令5の実行順になると、第2の命令5に示されているトレースコード2の実行に代えて、スタブ3を実行する(ステップS5)。
スタブ3には、第1の命令4が記述されている。そのため、スタブ3を実行することにより、第2の命令5の実行に代えて、第1の命令4が実行されることとなる。第1の命令4の実行後、実行手段13がスタブ3に記述されている第4の命令7を実行することにより、関数1aにおけるトレース位置の次の命令に処理が進められる(ステップS6)。
その後、実行手段13により関数1aのトレース位置の次の命令から順に処理が実行される。関数1aの実行が終了すると、第3の命令6に基づくサブルーチンの処理が終了したこととなり、トレースコード2の第3の命令6の次の命令に処理が進められる(ステップS7)。実行手段13は、トレースコード2の実行が終了すると、次にスタブ3を実行する(ステップS8)。トレースコード2の後にスタブ3を実行することにより、第2の命令5によって書き換えられた第1の命令4が実行される。スタブ3の実行が終了すると、関数1a内のトレース位置の次の命令に処理が進められる(ステップS9)。
このようにして、プログラム1内の関数1aの実行中に挿入するトレースコード2において関数1aの呼び出しが可能となる。すなわち、トレースコード2においてプログラムを呼び出しても、処理のループが発生しない。その結果、トレースコード2に課される制約が抑止され、トレースコード2で実行する処理の自由度が高くなる。
例えばプログラム実行中の障害解析を行う場合、デバッグ対象のプログラムは様々である。障害解析に関する処理をトレースコード2で記述しておき、プログラム1内の関数1aの実行中に障害が発生したときに、その関数1a内の位置をトレース位置に指定して障害解析を行う場合がある。このとき第1の実施の形態に示すようなループの発生を抑止する処理を実施しないと、トレースコード2中で呼び出す関数1aについては、障害の解析ができなくなってしまう。コンピュータの障害解析において、解析ができないプログラムは少ない方がよく、そのためには、障害解析の処理が記述されたトレースコード2において、他のプログラムの呼び出しを行わないようにすることとなる。ところが、障害解析で使用できるプログラムに制限があると、高度な障害解析が難しくなってしまう。特にOSで提供される処理(例えばファイルアクセス)を用いるには、その処理に対応するAPIなどの関数の呼び出しを行うことになる。解析処理においてそのようなAPIの呼び出しができなければ、OSの機能を利用した高度な障害解析が困難となる。
他方、第1の実施の形態に示す処理を実施することで、障害解析の手順を記述したトレースコード2中で、APIなどの各種関数の呼び出しが可能となる。その結果、高度な障害解析が可能となる。
しかも、関数1a内のトレース位置に、トレースコード2をフックするようにすることで、トレースコード2を関数1aと同じスレッドで実行することができる。同じスレッドで実行させることで、トレースコード2の実行開始前後でコンテキストスイッチを行わずに済む。コンテキストスイッチを行わないことで、トレース位置での関数1aの実行状態を変化させずに済み、正しい情報のトレースが可能となる。
さらに、第1の命令4の第2の命令5への書き換えを、メモリ上で行うことで、プログラム1の実行ファイルの内容を編集せずに済む。その結果、再コンパイルなしに、トレース処理を行うことができる。
なお、図1に示す書き換え手段11と実行手段13とは、例えば情報処理装置10が有するプロセッサにより実現することができる。また、記憶手段12は、例えば情報処理装置10が有するメモリにより実現することができる。
また、図1に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、OSで用意されたAPIの実行開始時におけるコンピュータの状態を示す情報をトレース(データ採取)するものである。APIには、OSの機能を利用するための関数などのプログラムが含まれており、アプリケーションプログラムなどを実行中にAPIを呼び出すことで、OSの機能を利用することができる。
図2は、本実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してメモリ102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU(Central Processing Unit)、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)である。プロセッサ101の機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
メモリ102は、コンピュータ100の主記憶装置として使用される。メモリ102には、プロセッサ101に実行させるOSのプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、プロセッサ101による処理に必要な各種データが格納される。メモリ102としては、例えばRAM(Random Access Memory)などの揮発性の半導体記憶装置が使用される。
バス109に接続されている周辺機器としては、HDD(Hard Disk Drive)103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
HDD103は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103は、コンピュータ100の補助記憶装置として使用される。HDD103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの不揮発性の半導体記憶装置を使用することもできる。
グラフィック処理装置104には、モニタ21が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ21の画面に表示させる。モニタ21としては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード22とマウス23とが接続されている。入力インタフェース105は、キーボード22やマウス23から送られてくる信号をプロセッサ101に送信する。なお、マウス23は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク24に記録されたデータの読み取りを行う。光ディスク24は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク24には、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、コンピュータ100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置25やメモリリーダライタ26を接続することができる。メモリ装置25は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ26は、メモリカード27へのデータの書き込み、またはメモリカード27からのデータの読み出しを行う装置である。メモリカード27は、カード型の記録媒体である。
ネットワークインタフェース108は、ネットワーク20に接続されている。ネットワークインタフェース108は、ネットワーク20を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
以上のようなハードウェア構成によって、第2の実施の形態の処理機能を実現することができる。なお、第1の実施の形態に示した情報処理装置10も、図2に示したコンピュータ100と同様のハードウェアにより実現することができる。
コンピュータ100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。コンピュータ100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ100に実行させるプログラムをHDD103に格納しておくことができる。プロセッサ101は、HDD103内のプログラムの少なくとも一部をメモリ102にロードし、プログラムを実行する。またコンピュータ100に実行させるプログラムを、光ディスク24、メモリ装置25、メモリカード27などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、HDD103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
図3は、トレース機能の一例を示すブロック図である。図3には、コンピュータ100が有する機能のうち、トレースによる情報採取に関係する機能を抜き出したものである。コンピュータ100は、プログラム記憶部110、コマンド部120、ドライバ部130、およびプール領域140を有する。なお、コンピュータ100は、図3に示した機能以外にも、OSにより実現される機能を有している。
プログラム記憶部110は、トレース対象のプログラムを記憶する。例えばプログラム記憶部110は、メモリ102内の記憶領域である。
コマンド部120は、ユーザから、トレース指示のコマンドの入力を受け付ける。そしてコマンド部120は、トレース要求をドライバ部130に送信する。またコマンド部120は、ドライバ部130からトレース結果を取得し、トレース結果を含むログファイルを出力する。なおコマンド部120は、OSのユーザモードで動作する。
ドライバ部130は、コマンド部120からのトレース要求に応じて、プログラム記憶部110に格納されたトレース対象のプログラムのトレースを行う。ドライバ部130は、トレースにより取得した情報を、プール領域140に格納する。またドライバ部130は、トレースに用いるスタブも、プール領域140に格納する。またドライバ部130は、トレースが完了すると、トレース結果をコマンド部120に送信する。なおドライバ部130は、OSのカーネルモードで動作する。
プール領域140は、トレースデータやスタブの記憶領域である。例えばプール領域140は、メモリ102内の記憶領域である。
なお、コマンド部120は、例えば「trace.exe」というファイル名の実行形式のファイルをコンピュータ100が実行することで実現する機能である。またドライバ部130は、例えば「TraceDriver.sys」というファイル名の実行形式のファイルをコンピュータ100が実行することで実現する機能である。
このような機能によりトレースが実行される。
図4は、トレースの処理の概要を示す図である。ユーザは、キーボード22などの入力デバイスを操作し、トレースの実行を指示するコマンド31を入力する。コマンド31では、例えばトレース対象のプログラム111が指定される。またコマンド31では、トレースの実行条件が定義されたトレース設定ファイル32が指定される。
入力されたコマンド31は、ユーザモードで動作するコマンド部120で受け取られる。コマンド部120は、例えばコマンド31で指定されたトレース設定ファイル32を参照し、トレースの実行条件を認識する。そしてコマンド部120は、トレースの実行条件を含むトレース要求を出力する。
トレース要求は、OSのI/Oマネージャ151を介して、カーネルモードで動作するドライバ部130に入力される。ドライバ部130は、トレース要求に従って、トレース処理を実行する。トレース処理は、トレース要求取得時に実行するトレース設定処理と、トレースポイントにおける例外発生時に実行するトレースデータ収集処理とに大別される。図4では、トレース設定処理を実線の矢印で示し、トレースデータ収集処理を破線の矢印で示している。
トレース設定処理では、ドライバ部130は、トレース対象のプログラム111のトレースポイントとなる位置の命令を、割り込み命令111aに書き換える。またドライバ部130は、IDT(Interrupt Descriptor Table)における例外割り込み用のハンドラのアドレスを、ドライバ部130が有するハンドラ131のアドレスに書き換える。さらにドライバ部130は、プログラム111の書き換えによって上書きされた命令を実行するスタブ141を生成し、プール領域140に格納する。
その後、コンピュータ100においてプログラム111の実行が開始され、実行位置がトレースポイントに達すると、割り込み命令111aが実行される。割り込み命令111aが実行されると、OSによってIDT152が参照され、その割り込み命令111aに対応する例外割り込み用のハンドラ131のアドレスが取得される。そしてハンドラ131の実行が開始される。ハンドラ131は、トレースデータを収集し、収集したトレースデータ142をプール領域140に格納する。トレースデータの収集が完了すると、ハンドラ131は、スタブ141を起動する。するとコンピュータ100においてスタブ141が実行される。スタブ141の実行後、コンピュータ100は、プログラム111内の割り込み命令111aより後の命令を実行する。
ドライバ部130は、トレースデータ142をI/Oマネージャ151経由でコマンド部120に送信する。するとコマンド部120は、トレースデータ142を含むログファイル33を生成する。ログファイル33は、例えばHDD103に格納される。
このような手順でプログラム実行中の所定のトレースポイントにおけるコンピュータの状態を示す情報(レジスタの値など)が収集される。どのような情報を収集するかは、ハンドラ131に定義されている。トレースポイントとしては、例えばプログラム111内に定義されたAPIなどの関数に含まれる命令を指定することができる。ここで、ハンドラ131において、トレースポイントとして指定された命令を含む関数を呼び出すか否かにより、トレースの手順が異なる。
図5は、ハンドラにおいてトレースポイントを含む関数を呼び出さない場合の命令の一例を示す図である。図5の例では、プログラム40内に「FunctionA」という関数40−1が定義されている。そして関数40−1の実行開始時にトレースを実行するものとする。この場合、関数40−1の先頭の命令41が、メモリ102内で例外命令42に書き換えられる。元の命令41は、メモリ102のアドレス「fffff800`014e6610」から「4883ec10」と記述されている。この命令41をニーモニックで表すと「sub rsp,10h」となる。書き換え後の例外命令42は、メモリ102のアドレス「fffff800`014e6610」から「cc」と記述されている。この例外命令42をニーモニックで表すと「int 3」となる。
例外命令42は、書き換え元の命令41よりも命令長が短い。そのため、命令41が格納されたメモリ102内の領域の一部が例外命令42で上書きされ、他の領域には不完全な命令43が残される。そこで、元の命令41を実行するためのスタブ141aが生成される。スタブ141aには、例外命令42によって上書きされた元の命令41と同じ内容の命令44が含まれている。またスタブ141aの最後には、元のプログラム40において、書き換えられた命令41の次に実行することになっていた命令46へのジャンプ命令45が記述されている。
命令書き換え後のプログラム40a内の関数40a−1が実行されると、まず例外命令42が実行される。例外命令42が実行されることで、例外処理に対応するハンドラ131aが起動される。そしてハンドラ131aが実行されることによって、データが採取される。ハンドラ131aの実行が終了すると、スタブ141aが実行される。すると、スタブ141a内に記述された、書き換え元の命令41と同じ内容の命令44が実行される。次に、プログラム40a内の命令46へのジャンプ命令45が実行される。その後、プログラム40aの命令46以降の各命令が実行される。
このようにして、プログラム40をトレース対象として、プログラム40の開始時点での状態をトレースすることができる。ただし、図5の例では、ハンドラ131a内に、トレースポイントを含む関数40a−1の呼出命令が含まれていない。ハンドラ131a内に、関数40a−1の呼出命令が含まれている場合、図5と同様の処理を行うと、処理のループが発生する。
図6は、ハンドラにおいてトレースポイントを含む関数を呼び出すことによるループ発生例を示す図である。図6の例では、トレース処理の内容が記述されたハンドラ131b内に、トレースポイントを有する関数40a−1を呼び出す命令51が含まれている。この場合、トレース実施中に関数40a−1が実行されると、まず例外命令42が実行され、ハンドラ131bが呼び出される。呼び出されたハンドラ131b内の命令が先頭から実行される。そして命令51が実行されることで、関数40a−1が呼び出され、先頭の例外命令42が実行される。すると、再度例外処理が発生し、ハンドラ131bが呼び出される。
このように、トレース対象のプログラムをハンドラ131b内で呼び出している場合、ループ処理が繰り返される。処理が何度もループしていると、再帰的な割り込みの繰り返しにより、処理の呼び出しを管理するスタックがオーバーフローする。その結果、トレース処理がエラー終了する。
第2の実施の形態では、ハンドラ131b内でトレース対象の関数40a−1を呼び出す場合の呼び出し先をスタブ141aに変更することで、図6に示すようなループの発生を回避する。ハンドラ131b内での呼び出し先の変更は、例えばIAT(Import Address Table)の内容を変更することで実現できる。IATは、外部ファイルで定義されたAPIの先頭アドレスが記述されたデータテーブルである。
図7は、第2の実施の形態におけるハンドラからのトレース対象のプログラムの呼び出し例を示す図である。ドライバ部130は、データセクション132、コードセクション133,IAT134などを有している。データセクション132は、ドライバ部130の処理の実行に使用するデータが格納される。コードセクション133は、ドライバ部130が実行する処理内容を示すプログラムコードが格納される。なおハンドラ131bも、コードセクション133に含まれる。IAT134には、ドライバ部130が処理の実行に使用するAPIの名称に対応付けて、そのAPIを定義する外部ファイルの先頭アドレスが設定されている。
関数40a−1をトレース対象としてトレースを実施する場合において、ハンドラ131b内に関数40a−1の呼び出し命令(call命令)があると、ドライバ部130は、自身が有するIATの書き換えを行う。例えばドライバ部130は、関数40a−1の名前「FunctionA」の先頭アドレス「fffff800`014e6610」を、スタブ141aの先頭アドレスに変更する。
その後、関数40a−1が実行されると、例外命令42によりハンドラ131bが呼び出される。そしてハンドラ131bに基づいて、データが収集される。ハンドラ131bにおける関数40a−1呼び出しの命令51が実行されると、IAT134が参照され、命令51で示されるAPIの名称に対応付けられたアドレスのプログラムが呼び出される。該当アドレスは、予めスタブ141aの先頭アドレスに変更されているため、スタブ141aが呼び出され、実行される。
スタブ141aを実行することで、例外命令42で上書きされた命令41と同じ内容の命令44が実行され、関数40a−1の命令46に処理が遷移する。その後、関数40a−1の命令46以降の処理が実行される。関数40a−1が最後まで実行されると、呼出元のハンドラ131bに処理が遷移する。
ハンドラ131bからの呼び出しによる関数40a−1の処理が終了すると、ハンドラ131bの残りの処理が実行される。ハンドラ131bの処理が完了すると、スタブ141a内の命令44が実行される。次に、ジャンプ命令45により、関数40a−1の命令46にジャンプする。その後、関数40a−1の命令46以降の処理が実行される。
次に、トレース設定処理について詳細に説明する。トレース設定処理は、トレース設定ファイル32に基づいて行われる。
図8は、トレース設定ファイルの一例を示す図である。トレース設定ファイル32には、例えばデータバッファサイズやトレースポイントが指定される。図8の例では、[SETTING]の欄に、採取したデータを格納するデータバッファのサイズが設定されている。また[TRACEPOINT]の欄に、トレースポイントが指定されている。トレースポイントは、例えばトレース対象のプログラムの名称(シンボル名)で指定される。トレースポイントがシンボル名のみで示された場合、そのシンボル名に対応するプログラムの先頭の位置がトレースポイントとなる。また、トレースポイントをメモリ内でのアドレスで指定することもできる。
次に、トレース設定処理の手順について説明する。
図9は、トレース設定処理の手順の一例を示すフローチャートである。
[ステップS101]ドライバ部130は、トレース管理テーブルを作成する。トレース管理テーブルは、トレースポイントにおける命令と、その命令を実行するためのスタブアドレスとを管理するデータテーブルである。トレース管理テーブル作成処理の詳細は後述する(図11参照)。
[ステップS102]ドライバ部130は、IATの書き換えを行う。IAT書き換え処理の詳細は後述する(図13参照)。なお書き換えられたIATの内容は、トレース処理を伴う情報解析が終了したときに、元に戻される。
[ステップS103]ドライバ部130は、ハンドラを置き換える。例えばドライバ部130は、例外処理が発生したときに、トレース処理を行うハンドラ131bが実行されるように、OSの設定内容を更新する。
[ステップS104]ドライバ部130は、トレースポイントとなっているアドレスに記述されている命令を、例外命令に置き換える。
このような手順でトレースの実行環境が整えられる。トレースポイントは、トレース管理テーブルに示される。
図10は、トレース管理テーブルの一例を示す図である。トレース管理テーブル60には、トレースアドレス、元の命令、およびスタブアドレスの欄が設けられている。トレースアドレスの欄には、トレースポイントとなる命令が格納されたメモリ102のアドレス(トレースアドレス)が設定される。元の命令の欄には、例外命令に書き換える前に、トレースアドレスに述されていた命令が設定される。スタブアドレスの欄には、元の命令を実行するためのスタブの先頭アドレスが設定される。
次にトレース管理テーブル作成処理について詳細に説明する。
図11は、トレース管理テーブル作成処理の手順を示すフローチャートである。
[ステップS111]ドライバ部130は、トレース設定ファイル読み込み処理を行う。トレース設定ファイル読み込み処理により、トレース管理テーブル60のトレースアドレスの欄に、トレースポイントのアドレスが設定される。この処理の詳細は後述する(図12参照)。ここで、トレース管理テーブル60に設定されたトレースポイントの数をmとする(mは1以上の整数)。
[ステップS112]ドライバ部130は、変数iに0を設定する。
[ステップS113]ドライバ部130は、iの値がトレースポイント数mと同じか否かを判断する。iの値がトレースポイント数mと同じ場合、トレース管理テーブル作成処理が終了する。iの値がトレースポイント数mと異なる場合、処理がステップS114に進められる。
[ステップS114]ドライバ部130は、トレース管理テーブル60のi番目のレコードのトレースポイントに記述されている命令を、そのレコードの元の命令の欄に格納する。
[ステップS115]ドライバ部130は、スタブの格納領域をメモリ102内に作成する。
[ステップS116]ドライバ部130は、スタブの格納領域の先頭のアドレスを、トレース管理テーブル60のi番目のレコードのスタブアドレスの欄に格納する。
[ステップS117]ドライバ部130は、iの値に1を加算し、処理をステップS113に進める。
次にトレース設定ファイル読み込み処理の手順について説明する。
図12は、トレース設定ファイル読み込み処理の手順の一例を示すフローチャートである。
[ステップS121]ドライバ部130は、トレース設定ファイル32の[SETTING]の欄から、データサイズを読み取る。ドライバ部130は、読み取ったデータサイズ分の記憶領域を、トレースデータ142(図4参照)の格納領域としてメモリ102内に確保する。
[ステップS122]ドライバ部130は、変数iに0を設定する。
[ステップS123]ドライバ部130は、iの値がトレースポイント数mと同じか否かを判断する。iの値がトレースポイント数mと同じ場合、トレース管理テーブル作成処理が終了する。iの値がトレースポイント数mと異なる場合、処理がステップS124に進められる。
[ステップS124]ドライバ部130は、トレース設定ファイル32の[TRACEPOINT]の欄に設定されている全m個のトレースポイントそれぞれの定義行から、i番目のトレースポイントの定義情報を読み取る。
[ステップS125]ドライバ部130は、トレースポイントがシンボル名で定義されているか否かを判断する。トレースポイントがシンボル名で定義されていれば、処理がステップS126に進められる。トレースポイントがアドレスで定義されていれば、処理がステップS127に進められる。
[ステップS126]ドライバ部130は、シンボル名をアドレスに変換する。例えばドライバ部130は、OSに用意されたAPIを用いて、シンボル名に対応するプログラム(関数などのAPIを含む)の先頭アドレスを、OSから取得する。そしてドライバ部130は、取得したアドレスを、i番目のトレースポイントのトレースアドレスと認識する。
[ステップS127]ドライバ部130は、i番目のトレースポイントのトレースアドレスを、トレース管理テーブル60に登録する。
[ステップS128]ドライバ部130は、iの値に1を加算し、処理をステップS123に進める。
図11、図12に示した処理により、トレース管理テーブル60が作成される。トレース管理テーブル60が作成されると、IATの書き換えが行われる。
図13は、IAT書き換え処理の手順の一例を示すフローチャートである。
[ステップS131]ドライバ部130は、ドライバ部130の処理内容を記述した実行形式のファイル(TraceDriver.sys)のロードアドレス(メモリに読み込まれたファイルの先頭アドレス)を、OSから取得する。
[ステップS132]ドライバ部130は、ドライバ部130の処理内容を記述した実行形式のファイルを解析し、IAT134が格納された領域のアドレスを取得する。
[ステップS133]ドライバ部130は、IAT134に基づいて、ハンドラ内で使用されているAPIのリスト(APIリスト)を作成する。例えばドライバ部130は、ハンドラ内で使用されているAPIの名前をアドレスに変換し、アドレス順にソートする。
図14は、APIリストの一例を示す図である。APIリスト62には、API名とアドレスとの欄が設けられている。API名には、ハンドラ131b内で使用されるAPIの名称が設定される。アドレスの欄には、対応するAPIなどの関数が格納された領域のアドレスが設定される。API名とアドレスとの組は、IATから取得できる。API名とアドレスとの組からなる各レコードは、例えばアドレスが昇順となるようにソートされている。ここでAPIリスト62に登録されたAPI数をn(nは1以上の整数)とする。
図13の説明に戻る。
[ステップS134]ドライバ部130は、変数iに0を設定する。
[ステップS135]ドライバ部130は、iの値がAPI数nと同じか否かを判断する。iの値がAPI数nと同じ場合、IAT書き換え処理が終了する。iの値がAPI数nと異なる場合、処理がステップS136に進められる。
[ステップS136]ドライバ部130は、APIリスト62のi番目のAPIがトレース対象か否かを判断する。例えばi番目のAPIのアドレスと同じアドレスが、トレース管理テーブル60のトレースアドレスの欄に登録されている場合、i番目のAPIがトレース対象であると判断される。i番目のAPIがトレース対象の場合、処理がステップS137に進められる。i番目のAPIがトレース対象ではない場合、処理がステップS138に進められる。
[ステップS137]ドライバ部130は、APIリスト62のi番目のAPIに対応するIAT内のエントリを、そのAPIに対応するスタブのアドレスに変換する。例えばドライバ部130は、APIリスト62のi番目のAPIのアドレスとトレースアドレスとするレコードを、トレース管理テーブル60から取得する。次にドライバ部130は、取得したレコードからスタブアドレスを抽出する。そしてドライバ部130は、APIリスト62のi番目のAPIに対応するIAT内のエントリのアドレスと、抽出したスタブアドレスに書き換える。
[ステップS138]ドライバ部130は、iの値に1を加算し、処理をステップS135に進める。
このようにしてIATの書き換えが行われる。その後、図9に示すように、ハンドラの置き換えとトレースポイントの命令の置き換えが行われ、トレース設定が完了する。トレース設定が完了した後に、トレース対象のAPIが呼び出されると、例外命令が実行される。その結果、トラップ例外処理が開始される。
図15は、トラップ例外処理の手順の一例を示すフローチャートである。
[ステップS141]ドライバ部130は、トレースアドレスで発生した例外か否かを判断する。例えばドライバ部130は、トレース管理テーブル60を参照し、例外を発生させた例外命令のアドレスが、トレースアドレスとして登録されている場合、トレースアドレスで発生した例外であると判断する。トレースアドレスで発生した例外の場合、処理がステップS143に進められる。トレースアドレス以外で発生した例外の場合、処理がステップS142に進められる。
[ステップS142]ドライバ部130は、トレースアドレス以外で発生した例外であれば、ステップS103(図9参照)による置き換え前の例外ハンドラを呼び出す。すると、呼び出された例外ハンドラが実行され、トレース処理を伴わない例外処理が行われる。その後、トラップ例外処理が終了する。
[ステップS143]ドライバ部130は、ハンドラ131bに基づいて、トレースデータの採取処理を行う。この処理の詳細は後述する(図16参照)。
[ステップS144]ドライバ部130は、トレース対象の関数に対応するスタブを実行する。例えばハンドラ131bの最後の命令として、スタブ141aの先頭へのジャンプ命令が記載されている。ドライバ部130は、その命令を実行することで、処理対象をスタブ141aに遷移させ、スタブ141aに記述された命令を実行する。
[ステップS145]ドライバ部130は、例外発生元に処理を戻す。これにより、例外発生元のプログラムを実行しているスレッドにより、例外発生アドレスの次の命令以降の処理が実行される。
次に、トレースデータ採取処理について詳細に説明する。
図16は、トレースデータ採取処理の手順の一例を示すフローチャートである。
[ステップS151]ドライバ部130は、ハンドラ131bを呼び出し、ハンドラ131b内の次に実行する命令を解釈する。
[ステップS152]ドライバ部130は、実行対象の命令が、例外発生元の関数(API)の呼び出し命令か否かを判断する。該当関数の呼び出し命令の場合、処理がステップS154に進められる。該当関数の呼び出し命令でなければ、処理がステップS153に進められる。
[ステップS153]ドライバ部130は、ハンドラ131bの次に実行する命令が、例外発生元のAPIの呼び出し命令でなければ、その命令を実行する。その後、処理がステップS157に進められる。
[ステップS154]ドライバ部130は、ハンドラ131bの次に実行する命令が、例外発生元のAPIの呼び出し命令であれば、該当関数に対応するスタブを実行する。例えばドライバ部130は、IAT134を参照し、例外発生元の関数に対応付けて設定されたスタブアドレスを取得する。そしてドライバ部130は、取得したスタブアドレスに格納されているスタブ内の命令を実行する。そのスタブには、例外発生元の関数において、例外命令に置き換えられた命令、および例外発生元の関数における例外命令の次の命令へのジャンプ命令が記述されている。従って、ドライバ部130がスタブを実行することにより、例外命令に置き換えられた命令が実行され、例外発生元の関数における例外命令の次の命令へのジャンプ命令が実行される。
[ステップS155]ドライバ部130は、例外発生元の関数における例外発生アドレスの次の命令以降の処理を実行する。
[ステップS156]ドライバ部130は、例外発生元の関数の処理が最後まで終了すると、処理がハンドラ131bに戻す。
[ステップS157]ドライバ部130は、ハンドラ131bの処理が終了したか否かを判断する。未処理の命令があれば、処理がステップS151に進められる。ハンドラ131bの処理が終了していれば、トレースデータ採取処理が終了する。
以上のようにして、トレースデータを収集するハンドラ131b内で、トレースポイントとなっているAPIなどの関数を呼び出しても、処理のループを発生させずに済む。そのため、ハンドラ131b内でOSのAPIなどの各種の関数を利用することができる。その結果、自由度の高いトレースデータの収集処理が可能となる。例えばトレース用のハンドラ131b内でファイルアクセスのAPIを呼び出せるようになることで、メモリ102内に保存したトレースデータを、適宜、HDD103などの他の記録媒体に書き出すことが可能となる。その結果、収集可能なトレースデータのデータ量が、プール領域140の容量に依存しなくなり、大量のトレースデータの収集が可能となる。
しかも第2の実施の形態では、IAT134を予め書き換えるだけで、ハンドラ131b内での関数40a−1の呼び出し命令実行時に、スタブ141aを実行させることができ、簡単な手順により例外命令42で上書きされた命令44を実行することができる。従って、トレース処理時の処理効率を低下させずに済む。
さらに、トレースコードが記載されたハンドラを、プログラムへフックすることで実行するため、同じトレースポイントを含む関数を実行するスレッドと同じスレッドでハンドラを実行できる。その結果、ハンドラ実行時にコンテキストスイッチが発生せず、レジスタやメモリの内容を、関数実行状態のまま維持できる。その結果、関数実行時の状態を正しくトレースできる。
さらに、トレースポイントの命令を書き換える際に、メモリ上で書き換えを行うため、プログラムの実行ファイルには手を加えずに済む。そのためプログラムの再コンパイルをせずにトレース処理を行うことができる。
またトレース対象の関数として、例えばOSで用意されたAPIのようなカーネルで動作する関数を指定できるため、カーネルで動作する関数についても、実行状態をトレースすることができる。
〔第3の実施の形態〕
次に第3の実施の形態について説明する。第3の実施の形態では、APIなどの関数中の任意の箇所をトレースポイントとすることを可能とするものである。以下、第3の実施の形態における、第2の実施の形態と相違する部分について説明する。
図17は、先頭以外の箇所をトレースポイントとした場合のループ発生例を示す図である。図17の例では、図5に示した関数40−1の先頭から2番目の命令をトレースポイントとしている。この場合、関数40−1の2行目の命令が、例外命令42に書き換えられる。命令書き換え後のプログラム40b内の関数40b−1が実行されると、例外命令42によりハンドラ131bが呼び出される。ハンドラ131b内には、関数40b−1を呼び出す命令51が含まれている。この場合、命令51が実行されると関数40b−1が呼び出され、再度、例外命令42が実行される。その結果、処理のループが発生する。
なお、ハンドラ131bはプログラム40bにフックする形式で実行されており、図17に示すような処理は、1つのスレッドで実行される。すなわち、関数40b−1が繰り返し呼び出され、例外命令42が何度も実行されても、その例外命令42を実行するスレッドのスレッドID(TID)は同じである。そこで第3の実施の形態では、ドライバ部130は、例外処理のハンドラ131bを呼び出したスレッドのTIDに基づいて、同じスレッドからの呼び出し回数をカウントする。そしてドライバ部130は、特定のスレッドからのハンドラの呼び出し回数に応じた処理を行うことで、ループの発生を抑止する。
図18は、第3の実施の形態におけるハンドラからのトレース対象の関数の呼び出し例を示す図である。関数40b−1の実行が開始され、実行箇所が例外命令42に達すると、例外が発生し、ハンドラ131cが呼び出される。
ハンドラ131cの先頭にはTIDのチェック命令71が記述されている。TIDのチェック命令71の実行により、ハンドラ131cを呼び出したスレッド(プログラム40bを実行しているスレッド)のTIDが取得される。そして取得したTIDがメモリ102に記憶される。さらに、以前に同じTIDを取得しているかどうかが判定される。
1度目の呼び出しでは、同じTIDを以前に取得していないと判定される。この場合、ハンドラ131c内のTIDのチェック命令71以降の命令が実行される。そして関数40b−1を呼び出す命令51の実行により、関数40b−1が呼び出される。
関数40b−1が呼び出されると、関数40b−1が先頭から実行される。そして例外命令42に達すると、再度、例外が発生し、ハンドラ131cが呼び出される。ハンドラ131cが呼び出されると、まずTIDのチェック命令71が実行される。TIDのチェック命令71の実行により、呼出元のスレッドのTIDに基づいて、関数40b−1からの2度目の呼び出しであると判断される。2度目の呼び出しの場合、ハンドラ131cに示されたデータ採取処理に代えて、スタブ141bが呼び出される。
スタブ141bには、例外命令42により書き換えられた命令72と、例外命令42の次の命令へのジャンプ命令73とが記述されている。従って、スタブ141bが実行されることにより、命令72が実行された後、関数40b−1の例外命令42の次の命令に処理がジャンプする。そして、関数40b−1のジャンプ先の命令以降の処理が実行される。
関数40b−1の処理が最後まで終了すると、関数40b−1の呼び出し元(ハンドラ131cの命令51)に処理が戻される。そしてハンドラ131c内の命令51以降の処理が実行され、データ採取が行われる。ハンドラ131cの処理が終了すると、スタブ141b内の命令72が実行される。その後、ジャンプ命令73により、関数40b−1の例外命令42の次の命令に処理がジャンプする。そして、関数40b−1のジャンプ先の命令以降の処理が実行される。
このように、TIDを管理することで、同一スレッドからのハンドラ131cの呼び出し回数が判別可能となる。そして、2度目の呼び出しではハンドラ131c内のデータ採取処理を省略することで、ループの発生が抑止される。
なお、第3の実施の形態では、トレース設定ファイルにおいて、関数40b−1の先頭以外の部分を、トレースポイントとして指定できる。
図19は、第3の実施の形態におけるトレース設定ファイルの一例を示す図である。トレース設定ファイル32aでは、トレース対象の関数の名称と、その関数中でのトレースポイントの先頭からのオフセット(シンボル名+オフセット)により、トレースポイントを指定可能となっている。この場合、トレース対象の関数中の、先頭からオフセットで指定された位置が、トレースポイントとなる。
次に、トレース設定処理について説明する。
図20は、第3の実施の形態におけるトレース設定処理の手順の一例を示すフローチャートである。第3の実施の形態では、トレース管理テーブル作成処理(ステップS201)、例外ハンドラの置き換え処理(ステップS202)、およびトレースポイントの命令の例外命令への置き換え処理(ステップS203)が、ドライバ部130によって行われる。ステップS201〜S203の各処理の詳細は、それぞれ、図9に示した第2の実施の形態におけるトレース設定処理のステップS101,S103,S104と同様である。すなわち、第3の実施の形態におけるトレース設定処理は、第2の実施の形態のトレース設定処理から、IATの書き換え処理(ステップS102)を除いた処理となる。
次に、例外処理発生時に実行されるトラップ例外処理の手順について説明する。
図21は、第3の実施の形態におけるトラップ例外処理の手順の一例を示すフローチャートである。
[ステップS211]ドライバ部130は、トレースアドレスで発生した例外か否かを判断する。トレースアドレスで発生した例外の場合、処理がステップS213に進められる。トレースアドレス以外で発生した例外の場合、処理がステップS212に進められる。
[ステップS212]ドライバ部130は、トレースアドレス以外で発生した例外であれば、ステップS202(図20参照)による置き換え前の例外ハンドラを呼び出す。すると、呼び出された例外ハンドラが実行され、トレース処理を伴わない例外処理が行われる。その後、トラップ例外処理が終了する。
[ステップS213]ドライバ部130は、スレッド判別処理を行う。スレッド判別処理では、例外発生元のスレッドが、ハンドラ131cの実行により再帰的に呼び出されたスレッドか否かの判定が行われる。スレッド判別処理の詳細は後述する(図23参照)。
なおドライバ部130は、スレッド判別処理の過程で、TID管理テーブルを作成する。TID管理テーブルは、例外を発生させたスレッドのTIDを管理するデータテーブルである。
図22は、TID管理テーブルの一例を示す図である。図22の例では、TID管理テーブル63には、トレースアドレスとTIDとの欄が設けられている。トレースアドレスの欄には、トレースアドレスが設定される。TIDの欄には、対応するトレースアドレスで例外を発生させた1以上のスレッドのTIDが設定される。例えば、異なるスレッドそれぞれにおいて、トレース対象のAPIが個別に呼び出されることがある。このような場合には、1つのトレースアドレスに、複数のTIDが対応付けられる。
以下、図21の説明に戻る。
[ステップS214]ドライバ部130は、ステップS213により、再帰的に呼ばれたスレッドであると判定されたか否かを判断する。再帰的に呼ばれたスレッドであると判定された場合、処理がステップS217に進められる。再帰的に呼ばれたスレッドではないと判定された場合、処理がステップS215に進められる。
[ステップS215]ドライバ部130は、再帰的に呼ばれたスレッドでなければ、トレースデータ採取処理を行う。トレースデータ採取処理の詳細は後述する(図24参照)。
[ステップS216]ドライバ部130は、TID管理テーブル内の、例外発生元のトレースアドレスに対応付けられているTIDのリストの中から、例外発生元となっているトレース対象の関数を実行しているスレッドのTIDを削除する。
[ステップS217]ドライバ部130は、トレース対象の関数に対応するスタブを実行する。
[ステップS218]ドライバ部130は、例外発生元に処理を戻す。これにより、例外発生元の関数を実行しているスレッドにより、例外発生アドレスの次の命令以降の処理が実行される。
次に、スレッド判別処理について詳細に説明する。
図23は、スレッド判別処理の手順の一例を示すフローチャートである。
[ステップS221]ドライバ部130は、TID管理テーブル63から、例外発生元のトレースアドレスを検索する。
[ステップS222]ドライバ部130は、例外発生元のトレースアドレスがTID管理テーブル63に登録されているか否かを判断する。トレースアドレスが登録されている場合、処理がステップS224に進められる。トレースアドレスが登録されていない場合、処理がステップS223に進められる。
[ステップS223]ドライバ部130は、TID管理テーブル63へ、例外発生元のトレースアドレスを登録する。その後、処理がステップS226に進められる。
[ステップS224]ドライバ部130は、TID管理テーブル63に、例外発生元のトレースアドレスに対応付けて、今回の例外を発生させたスレッドのTIDが登録されているか否かを判断する。該当するTIDが登録されていれば、処理がステップS225に進められる。該当するTIDが登録されていなければ、処理がステップS226に進められる。
[ステップS225]ドライバ部130は、例外を発生させたスレッドのTIDが、例外発生元のトレースアドレスに対応付けて登録されていれば、例外を発生させたスレッドは、再帰的に呼び出されたスレッドであると判別する。その後、スレッド判別処理が終了する。
[ステップS226]ドライバ部130は、例外を発生させたスレッドのTIDが、例外発生元のトレースアドレス対応付けて登録されていない場合、TID管理テーブル63へ、例外発生元のトレースアドレスに対応付けて、例外を発生させたスレッドのTIDを登録する。
[ステップS227]ドライバ部130は、例外を発生させたスレッドは、再帰的に呼び出されたスレッドではないと判別する。その後、スレッド判別処理が終了する。
次に、第3の実施の形態におけるトレースデータ採取処理の手順について説明する。
図24は、第3の実施の形態におけるトレースデータ採取処理の手順の一例を示すフローチャートである。
[ステップS231]ドライバ部130は、ハンドラ131cを呼び出し、ハンドラ131b内の命令を次に実行する命令を解釈する。
[ステップS232]ドライバ部130は、実行対象の命令が、例外発生元の関数(API)の呼び出し命令か否かを判断する。該当関数の呼び出し命令の場合、処理がステップS234に進められる。該当関数の呼び出し命令でなければ、処理がステップS233に進められる。
[ステップS233]ドライバ部130は、ハンドラ131cの次に実行する命令が、例外発生元のAPIの呼び出し命令でなければ、その命令を実行する。その後、処理がステップS241に進められる。
[ステップS234]ドライバ部130は、ハンドラ131cの次に実行する命令が、例外発生元のAPIの呼び出し命令であれば、呼び出し命令に従って、例外発生元の関数を再帰的に呼び出す。
[ステップS235]ドライバ部130は、呼び出した関数内の命令を先頭から順に解釈する。
[ステップS236]ドライバ部130は、例外発生元の関数内の次に実行する命令が、例外命令か否かを判断する。例外命令であれば、処理がステップS237に進められる。例外命令でなければ、処理がステップS238に進められる。
[ステップS237]ドライバ部130は、実行する処理が例外命令であれば、例外を発生させる。これにより、図21に示したトラップ例外処理が実行される。その後、処理がステップS239に進められる。
[ステップS238]ドライバ部130は、次に実行する命令が例外命令でなければ、その命令を実行する。
[ステップS239]ドライバ部130は、例外発生元の関数(API)の処理が終了したか否かを判断する。処理が終了した場合、処理がステップS240に進められる。処理が終了していなければ、処理がステップS235に進められ、例外発生元の関数中の次に実行する命令が解釈される。
[ステップS240]ドライバ部130は、例外発生元の関数の処理が終了すると、処理をハンドラ131cに戻し、例外発生元の関数の呼び出し命令の次の命令を、次の実行対象の命令とする。
[ステップS241]ドライバ部130は、ハンドラ131cの処理が終了したか否かを判断する。未処理の命令があれば、処理がステップS231に進められる。ハンドラ131cの処理が終了していれば、トレースデータ採取処理が終了する。
このようにして、トレース対象のAPIなどの関数の先頭以外がトレースポイントであっても、データのトレース処理を記述したハンドラ内に、トレース対象の関数の呼び出し命令を含めることが可能となる。従って、柔軟性の高いトレースデータの採取処理が可能となる。
なお第3の実施の形態では、トレースポイントがトレース対象の関数の先頭以外の場合の例を示しているが、トレースポイントがトレース対象の関数の先頭であっても、同様の処理でデータのトレースが可能である。
〔第4の実施の形態〕
次に、第4の実施の形態について説明する。第4の実施の形態は、第2の実施の形態と第3の実施の形態とを組み合わせたものである。第4の実施の形態では、トレース対象のプログラムである複数の関数にトレースポイントをセットし、各関数内に設定するトレースポイントが1箇所である場合に、トレースポイントが関数の先頭か否かに応じて、トレースデータ採取処理を切り替える。例えば第4の実施の形態では、トレースポイントがトレース対象の関数の先頭であれば、図7に示した第2の実施の形態の処理によりトレースデータを採取する。また第4の実施の形態では、トレースポイントがトレース対象の関数の先頭以外であれば、図18に示した第3の実施の形態の処理によりトレースデータを採取する。
第4の実施の形態では、トレースポイントが、トレース対象の関数の先頭か否かを、トレース管理テーブルを用いて管理する。
図25は、第4の実施の形態におけるトレース管理テーブルの一例を示す図である。第4の実施の形態におけるトレース管理テーブル64には、トレースアドレス、元の命令、スタブアドレス、およびフラグの欄が設けられている。トレースアドレス、元の命令、およびスタブアドレスの欄には、図10に示した第2の実施の形態のトレース管理テーブル60における同名の欄と同種の情報が設定される。
フラグの欄には、トレースアドレスで示されるトレースポイントが、トレース対象の関数の先頭かを示すフラグが設定される。例えば、トレースポイントがトレース対象の関数の先頭であれば、フラグの欄に「TRUE」と設定される。またトレースポイントがトレース対象の関数の先頭でなければ、フラグの欄に「FALSE」と設定される。
第4の実施の形態におけるトレース設定処理は、図9に示した第2の実施の形態のトレース設定処理と同様の手順で行われる。ただしトレース管理テーブル作成処理内のトレース設定ファイル読み込み処理(ステップS101)が、第2の実施の形態と異なる。またIATの書き換え処理(ステップS102)が適用されるのは、トレースポイントがトレース対象の関数(API)の先頭の場合である。なお第4の実施の形態では、図19に示した第3の実施の形態のトレース設定ファイル32aと同様に、トレースポイントを、シンボル名+オフセットで指定可能である。
図26は、第4の実施の形態におけるトレース設定ファイル読み込み処理の手順の一例を示すフローチャートである。なお図26に示した処理のうち、ステップS301〜S307,S312の処理は、それぞれ図12に示したステップS121〜S128の処理と同様である。以下、第2の実施の形態と異なる処理(ステップS308〜S311)について説明する。
[ステップS308]ドライバ部130は、トレース管理テーブル64に登録したトレースアドレスを、「API名+オフセット」の形式に変換する。API名は、例えばトレース対象の関数を示すシンボル名である。アドレスから「API名+オフセット」への変換は、例えばOSに用意されたAPIなどを利用して行うことができる。
[ステップS309]ドライバ部130は、オフセットが0か否かを判断する。例えばトレースポイントがトレース対象の関数の先頭の場合、オフセットが0となる。オフセットが0であれば、処理がステップS311に進められる。オフセットが0でなければ、処理がステップS310に進められる。
[ステップS310]ドライバ部130は、オフセットが0でなければ、トレース管理テーブル64における、ステップS304で読み取ったトレースポイントに対応するフラグを、「FALSE」にセットする。すなわち、トレースポイントが、トレース対象の関数の先頭ではないことが、フラグに設定される。その後、処理がステップS312に進められる。
[ステップS311]ドライバ部130は、オフセットが0であれば、トレース管理テーブル64における、ステップS304で読み取ったトレースポイントに対応するフラグを、「TRUE」にセットする。すなわち、トレースポイントが、トレース対象の関数の先頭であることが、フラグに設定される。その後、処理がステップS312に進められる。
このようにして、トレースポイントが関数の先頭か否かを示すフラグを含むトレース管理テーブル64が作成される。そしてトラップ例外が発生すると、トレース管理テーブル64に基づいて、レースポイントが関数の先頭か否かが判断される。そして判断結果に応じた手順でトレースデータの採取が行われる。以下、第4の実施の形態におけるトラップ例外処理について詳細に説明する。
図27は、トラップ例外処理の手順の一例を示すフローチャートである。なお図27に示した処理のうち、ステップS321,S322,S326〜S331の処理は、それぞれ図21に示したステップS211〜S218の処理と同様である。以下図27に示す処理のうち、第2または第3の実施の形態と相違する処理(ステップS323〜S325)について説明する。
[ステップS323]ドライバ部130は、トレースアドレス判別処理を行う。トレースアドレス判別処理では、例外発生元のトレースアドレスが、トレース対象の関数の先頭か否か判別される。なおトレースアドレス判別処理の詳細は後述する(図28参照)。
[ステップS324]ドライバ部130は、トレースアドレスがトレース対象の関数の先頭か否かを判断する。トレースアドレスがトレース対象の関数の先頭であれば、処理がステップS325に進められる。またトレースアドレスがトレース対象関数の先頭でなければ、処理がステップS326に進められ、第3の実施の形態と同様の手順でトレースデータの採取が行われる。
[ステップS325]ドライバ部130は、第2の実施の形態と同様の手順で、トレースデータを採取する。この処理の詳細は、図16に示した処理と同様である。その後、処理がステップS330に進められる。
次に、トレースアドレス判別処理について詳細に説明する。
図28は、トレースアドレス判別処理の手順の一例を示すフローチャートである。
[ステップS341]ドライバ部130は、トレース管理テーブル64から、現在実行している例外処理の発生元のトレースアドレスに対応するフラグを取得する。
[ステップS342]ドライバ部130は、取得したフラグが「TRUE」か否かを判断する。フラグが「TRUE」であれば、処理がステップS343に進められる。フラグが「FALSE」であれば、処理がステップS344に進められる。
[ステップS343]ドライバ部130は、フラグが「TRUE」の場合、トレースポイントがトレース対象の関数の先頭であると判定し、トレースアドレス判別処理を終了する。
[ステップS344]ドライバ部130は、フラグが「FALSE」の場合、トレースポイントがトレース対象の関数の先頭ではないと判定し、トレースアドレス判別処理を終了する。
このようにして、トレースポイントがトレース対象の関数の先頭かどうかにより、データ採取の手法を変更することができる。ここで、トレースポイントがトレース対象の関数の先頭であれば、スレッドのTIDを管理せずに済み、簡便な処理でデータを採取でき、負荷が少なくて済む。従って、第4の実施の形態によれば、トレースポイントが関数の先頭でない場合でもデータの採取を可能としながらも、第3の実施の形態よりも少ない処理負荷でデータのトレースを行うことができる。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。
1 プログラム
1a 関数
2 トレースコード
3 スタブ
4 第1の命令
5 第2の命令
6 第3の命令
7 第4の命令
10 情報処理装置
11 書き換え手段
12 記憶手段
13 実行手段

Claims (8)

  1. プログラムの実行中に、トレースコードに基づいてトレース処理を実行するための処理プログラムであって、
    コンピュータに、
    前記プログラムに定義された関数内のトレース位置に記述された第1の命令を、前記トレースコードの実行を指示する第2の命令に書き換えると共に、前記第1の命令を記憶手段に格納し、
    前記関数実行中の前記トレース位置の実行時に、前記第2の命令に基づいて前記トレースコードを実行し、
    前記トレースコード内に前記関数を呼び出す第3の命令が含まれる場合、前記第3の命令の実行時には、前記関数内の前記トレース位置の前記第2の命令を、前記記憶手段に格納した前記第1の命令に置き換えて、前記関数を実行する、
    処理を実行させることを特徴とする処理プログラム。
  2. 前記トレース位置が前記関数の先頭である場合、
    前記第1の命令を格納する際には、前記第1の命令に続けて、前記関数における前記トレース位置の次の命令へのジャンプを指示する第4の命令を、前記記憶手段に格納し、
    前記トレースコード実行中の前記第3の命令の実行時には、前記記憶手段に格納された前記第1の命令と第4の命令とを順に実行する、
    ことを特徴とする請求項1記載の処理プログラム。
  3. 前記トレース位置が前記関数の先頭である場合、前記第1の命令を格納する際には、前記第3の命令の呼び出し先となる関数のアドレスを示す情報を、前記第1の命令のアドレスに変更する、
    ことを特徴とする請求項2記載の処理プログラム。
  4. 前記第1の命令を格納する際には、前記第1の命令に続けて、前記関数におけるトレース位置の次の命令へのジャンプを指示する第4の命令を、前記記憶手段に格納し、
    前記トレースコードの実行中の前記第3の命令の実行時には、前記第3の命令に基づいて前記関数の先頭から実行を開始し、前記関数の実行位置が前記トレース位置になると、前記記憶手段に格納された前記第1の命令と第4の命令とを順に実行する、
    ことを特徴とする請求項1記載の処理プログラム。
  5. 前記関数の実行位置が前記トレース位置となり、前記トレースコードの実行を開始したときに、前記プログラムを実行している処理単位の識別情報を前記記憶手段に格納し、
    前記関数の実行位置が前記トレース位置となったときに、前記プログラムを実行している処理単位の識別情報が既に保存されている場合、前記トレースコードの実行に代えて、前記記憶手段に格納された前記第1の命令と第4の命令とを順に実行することを特徴とする請求項4記載の処理プログラム。
  6. 前記第1の命令を保存する際には、前記第1の命令に続けて、前記関数における前記トレース位置の次の命令へのジャンプを指示する第4の命令を、前記記憶手段12に格納し、
    前記トレースコードの実行を開始する際に、前記トレース位置が前記関数の先頭か否かを判断し、
    前記トレース位置が前記関数の先頭の場合、前記トレースコード実行中の前記第3の命令の実行時には、前記記憶手段に格納された前記第1の命令と第4の命令とを順に実行する、
    前記トレース位置が前記関数の先頭ではない場合、前記トレースコードの実行中の前記第3の命令の実行時には、前記第3の命令に基づいて前記関数の先頭から実行を開始し、前記関数の実行位置が前記トレース位置になると、前記記憶手段に格納された前記第1の命令と第4の命令とを順に実行する、
    ことを特徴とする請求項1記載の処理プログラム。
  7. プログラムの実行中に、トレースコードに基づいてトレース処理を実行するトレース方法であって、
    コンピュータが、
    前記プログラムに定義された関数内のトレース位置に記述された第1の命令を、前記トレースコードの実行を指示する第2の命令に書き換えると共に、前記第1の命令を記憶手段に格納し、
    前記関数実行中の前記トレース位置の実行時に、前記第2の命令に基づいて前記トレースコードを実行し、
    前記トレースコード内に前記関数を呼び出す第3の命令が含まれる場合、前記第3の命令の実行時には、前記関数内の前記トレース位置の前記第2の命令を、前記記憶手段に格納した前記第1の命令に置き換えて、前記関数を実行する、
    トレース方法。
  8. プログラムの実行中に、トレースコードに基づいてトレース処理を実行する情報処理装置であって、
    前記プログラムに定義された関数内のトレース位置に記述された第1の命令を、トレースコードの実行を指示する第2の命令に書き換えると共に、前記第1の命令を記憶手段に格納する書き換え手段と、
    前記関数実行中の前記トレース位置の実行時に、前記第2の命令に基づいて前記トレースコードを実行し、前記トレースコード内に前記関数を呼び出す第3の命令が含まれる場合、前記第3の命令の実行時には、前記関数内の前記トレース位置の前記第2の命令を、前記記憶手段に格納した前記第1の命令に置き換えて、前記関数を実行する実行手段と、
    を有する情報処理装置。
JP2013203365A 2013-09-30 2013-09-30 トレース方法、処理プログラム、および情報処理装置 Active JP6119535B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2013203365A JP6119535B2 (ja) 2013-09-30 2013-09-30 トレース方法、処理プログラム、および情報処理装置
US14/483,750 US9612837B2 (en) 2013-09-30 2014-09-11 Trace method and information processing apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013203365A JP6119535B2 (ja) 2013-09-30 2013-09-30 トレース方法、処理プログラム、および情報処理装置

Publications (2)

Publication Number Publication Date
JP2015069437A JP2015069437A (ja) 2015-04-13
JP6119535B2 true JP6119535B2 (ja) 2017-04-26

Family

ID=52741342

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013203365A Active JP6119535B2 (ja) 2013-09-30 2013-09-30 トレース方法、処理プログラム、および情報処理装置

Country Status (2)

Country Link
US (1) US9612837B2 (ja)
JP (1) JP6119535B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9619214B2 (en) 2014-08-13 2017-04-11 International Business Machines Corporation Compiler optimizations for vector instructions
US10169014B2 (en) 2014-12-19 2019-01-01 International Business Machines Corporation Compiler method for generating instructions for vector operations in a multi-endian instruction set
US9588746B2 (en) 2014-12-19 2017-03-07 International Business Machines Corporation Compiler method for generating instructions for vector operations on a multi-endian processor
US9880821B2 (en) 2015-08-17 2018-01-30 International Business Machines Corporation Compiler optimizations for vector operations that are reformatting-resistant
US9594668B1 (en) * 2015-09-04 2017-03-14 International Business Machines Corporation Debugger display of vector register contents after compiler optimizations for vector instructions
CN111736838A (zh) * 2019-03-25 2020-10-02 华为技术有限公司 一种跨语言编译方法及设备
US11501046B2 (en) * 2020-03-24 2022-11-15 International Business Machines Corporation Pre-silicon chip model of extracted workload inner loop instruction traces
CN113448815B (zh) * 2020-03-26 2022-10-18 华为技术有限公司 一种采集追踪trace调用链的方法和电子设备
CN115242778B (zh) * 2022-07-21 2023-06-27 中电金信软件有限公司 一种文件传输方法、装置、电子设备及可读存储介质

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6182244B1 (en) * 1997-09-10 2001-01-30 International Business Machines Corporation System and method for automatically initiating a tracing facility and dynamically changing the levels of tracing currently active
JP2001147837A (ja) * 1999-11-18 2001-05-29 Fujitsu Ltd プログラムトレース装置及び記憶媒体
JP2005301382A (ja) * 2004-04-07 2005-10-27 Kyocera Mita Corp ファームウェア診断装置
JP2006268298A (ja) 2005-03-23 2006-10-05 Nec Corp デバッグ方法及びデバッグ装置
KR101581001B1 (ko) 2009-03-30 2015-12-30 삼성전자주식회사 프로그램의 동적 분석 방법 및 그 장치

Also Published As

Publication number Publication date
US20150095626A1 (en) 2015-04-02
US9612837B2 (en) 2017-04-04
JP2015069437A (ja) 2015-04-13

Similar Documents

Publication Publication Date Title
JP6119535B2 (ja) トレース方法、処理プログラム、および情報処理装置
US9459989B2 (en) Method and apparatus for reverse debugging source code using causal analysis
TWI566090B (zh) Debugging firmware / software to produce tracking systems and methods, recording media and computer program products
KR102184436B1 (ko) 저스트 마이 코드를 이용하는 자바스크립트 디버깅 기법
US20150006961A1 (en) Capturing trace information using annotated trace output
JP6342070B2 (ja) ジョブ管理装置及びジョブ管理方法及びジョブ管理プログラム
CN112732300A (zh) 一种数据包更新方法、装置、电子设备及可读存储介质
US20140281727A1 (en) Grouping and analysis of data access hazard reports
US20180046563A1 (en) Exception prediction before an actual exception during debugging
US9880925B1 (en) Collecting structured program code output
US8782626B2 (en) Search suggestions for static code analysis
JP2008305019A (ja) シミュレーション装置及びシミュレーション方法及びプログラム
JP2017129970A (ja) 管理装置,管理方法および管理プログラム
CN111258875A (zh) 界面测试方法及系统、电子设备、存储介质
CN114780409A (zh) 基于程序运行进程的断点设置方法、电子设备和存储介质
CN111309583B (zh) 界面过度绘制检测方法、装置、介质及计算设备
WO2016120989A1 (ja) 管理計算機及びルールの試験方法
JP6688433B2 (ja) 計算機システム
JP2009064125A (ja) サーバ装置、そのプログラム
JP5319643B2 (ja) ソフトウェアプロダクトライン開発支援装置およびその方法
JP6079868B2 (ja) エラー分析方法、情報処理装置およびエラー分析プログラム
JP2020087087A (ja) 修正候補特定プログラム
CN112286804B (zh) 系统的调试方法、装置、设备和介质
CN110674622A (zh) 可视化图表生成方法、系统、存储介质及电子设备
JP7401751B2 (ja) 情報処理プログラム、情報処理方法及び情報処理システム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160606

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20170217

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20170228

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170313

R150 Certificate of patent or registration of utility model

Ref document number: 6119535

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150