(57)【要約】記載するのは、トレース対象プログラムの挙動を再生する間に実行制御を補助する技術についてである。クロスレベル・マッピングが、ソース・コード、中間表現、およびトレースにおけるネーティブ命令を相関付ける。トレースは、ランタイム管理プログラムによって実行されたネーティブ・コード命令の記録を含む。トレースは、ランタイムの実行インスタンスを全く含まない。トレース位置をソース・コード式またはステートメントと整列させるように、更に、ガベージ・コレクションおよび開発者には感心がなさそうな他のコードをスキップオーバーするように、ブレークポイントを設定する。ライブ・デバギング環境は、トレースに基づく逆実行をサポートするように適応化される。デバッガーにおける実行コントローラーまたは他のツールは、ブレークポイント範囲、クロスレベル・マッピング、順方向ステップアウト・サポート、および他の項目を利用して、トレースの再生実行を制御することができる。周知のコンパイラーまたは周知のランタイムの態様は、ネーティブ・コードを生成するというそれらの確立された目的とは対照的に、前に生成されたネーティブ・コードを再生する革新的な実行制御に合わせて、再利用することができる。【選択図】図８
2021523444.tif 000002
【特許請求の範囲】
【請求項１】
トレース再生実行制御システムであって、
プロセッサーと、
前記プロセッサーと動作可能に通信するメモリーと、
プログラムの実行中に、ランタイムおよびカーネルと併せて記録されたトレースであって、前記トレースが、前記プログラムの少なくとも１つのスレッドにおいて実行したネーティブ・コード命令によるアクティビティの記録を含むトレース・エントリーを含む、トレースと、
前記プログラムの少なくとも一部のソース・コードと、
前記ソース・コードと、当該ソース・コードの中間表現との間でマッピングするソース−中間マッピングと、
前記中間表現と前記トレースとの間でマッピングする中間−ネーティブ・マッピングと、
ソフトウェア・ツールにおける実行コントローラーであって、前記プロセッサーによる実行時に、リクエストに応答して前記トレースの再生実行を制御するように構成され、前記ソース−中間マッピングおよび前記中間−ネーティブ・マッピングによって、前記ソース・コードが前記トレース・エントリーと相関付けられる、実行コントローラーと、
を備える、トレース再生実行制御システム。
【請求項２】
請求項１記載のトレース再生実行制御システムにおいて、前記実行コントローラーが、少なくとも以下の動作、
逆方向実行ステップイン動作、
逆方向実行ステップアウト動作、および
逆方向実行ステップオーバー動作、
を求めるリクエストを、トレース・ネーティブ・コード命令の対応する実行に変換するように構成される、トレース再生実行制御システム。
【請求項３】
請求項１記載のトレース再生実行制御システムにおいて、前記システムが、前記ソース・コードにおいて、前記再生実行の間にネーティブ・コード命令にコンパイルされなかった部分にステップインするように構成される、トレース再生実行制御システム。
【請求項４】
請求項１記載のトレース再生実行制御システムにおいて、前記中間表現が、前記ソース・コードにおいて使用される少なくとも２つの識別子をデーター型と相関付けるシンボル表、前記ソース・コードの少なくとも一部から導き出された抽象構文ツリー、または前記ソース・コードの少なくとも一部の中間言語への変換の内少なくとも１つを含む、トレース再生実行制御システム。
【請求項５】
請求項１記載のトレース再生実行制御システムにおいて、前記トレースが、前記ランタイムの実行インスタンスを全く含まず、前記システムが、前記ランタイムに特定である任意のコードを実行するために、前記トレース内にコールするように構成されない、トレース再生実行制御システム。
【請求項６】
請求項１記載のトレース再生実行制御システムであって、更に、前記ランタイムのコール可能なインスタンスを有する前記プログラムのライブ・プロセスを備え、前記トレースが、前記ライブ・プロセスから記録され、前記システムが前記トレースの実行を再生するように構成される、トレース再生実行制御システム。
【請求項７】
請求項１記載のトレース再生実行制御システムにおいて、前記システムが、前記トレースの一部分の再生実行をスキップオーバーするように構成され、前記実行コントローラーが、前記再生実行を、前記トレースの第１実行時点から前記トレースの第２実行時点に移動させ、前記システムが、前記第１位置から前記第２位置までの継続実行によって実行されたはずのトレース・ネーティブ・コード命令を実行しない、トレース再生実行制御システム。
【請求項８】
トレース再生実行制御方法であって、
トレース対象マネージド・プログラム、即ち、ランタイムへのコールと併せて実行されるように構成され、更にトレースされるように構成されたプログラムを識別するステップと、
トレース再生実行制御リクエストを受けるステップであって、前記トレース再生実行制御リクエストが、コンピューティング・システム上で実行するソフトウェア・ツールにおいて受け取られる、ステップと、
前記トレース再生実行制御リクエストに基づいて、前記トレース対象マネージド・プログラムのソース・コードと前記ソース・コードの中間表現との間で自動的にマッピングし、前記中間表現とトレースとの間で自動的にマッピングするステップであって、前記トレースが、少なくとも１つのプロセッサーによるアクティビティの記録を含み、前記アクティビティが、前記トレース対象マネージド・プログラムが実行されるに連れてトレースされ、前記トレースが、前記ランタイムの実行インスタンスを全く含まない、ステップと、
前記トレース再生実行制御リクエストに対応するトレース・ネーティブ・コード命令を実行し、これによって前記トレースの一部分を再生するステップと、
を含む、トレース再生実行制御方法。
【請求項９】
請求項８記載のトレース再生実行制御方法において、前記トレース再生実行制御リクエストが、ルーチンからステップアウトする逆方向実行ステップアウト動作を識別し、前記方法が、前記ルーチンへのコールのリターン・アドレスの位置の直前にある位置を有するトレース・ネーティブ・コード命令上にブレークポイントを設定するステップを含み、位置Ａがトレースにおいて位置Ｂの直前にあるのは、トレースの順方向実行中にＢに先だってＡに遭遇し、ＡとＢとの間に多くとも５つのトレース・ネーティブ・コード命令しかないときである、トレース再生実行制御方法。
【請求項１０】
請求項８記載のトレース再生実行制御方法において、前記ソース・コードが、ステートメントおよび式を含み、前記方法が、前記ソース・コードにおける所与のステートメントまたは所与の式に前記方法によってマッピングされた全てのトレース・ネーティブ・コード命令のグループのエッジ上にあるトレース・ネーティブ・コード命令上に、ブレークポイントを設定するステップを含み、トレースにおける命令グループＧの中の命令ＸがＧのエッジ上にあるのは、Ｘが、トレースの順方向実行の間に遭遇したＧの最初の命令である、Ｘが、トレースの順方向実行の間に遭遇したＧの最後の命令である、Ｘが、トレースの逆方向実行の間に遭遇したＧの最初の命令である、またはＸが、トレースの逆方向実行の間に遭遇したＧの最後の命令であるという条件の内少なくとも１つをＸが満たすときである、トレース再生実行制御方法。
【請求項１１】
請求項８記載のトレース再生実行制御方法において、前記トレース再生実行制御リクエストが、ユーザー・コード・ルーチンにステップインする順方向実行ステップイン動作を識別し、前記ユーザー・コード・ルーチンの再生実行が、ランタイム・ルーチンへの少なくとも１つのコールの再生実行を含み、前記ランタイム・ルーチンへの前記コールが、前記ソース・コードにおいて対応するコール・ステートメントもコール式も有さず、前記方法が、  
動的にコンパイルされたコードを受け取るように設計されたメモリー範囲全体を指定するブレークポイント範囲を設定するステップ、または
前記ランタイム・ルーチンへの前記コール上でステップオーバー動作を実行するためにブレークポイントを設定するステップ、
の内少なくとも１つを含む、トレース再生実行制御方法。
【請求項１２】
請求項８記載のトレース再生実行制御方法において、前記トレース再生実行制御リクエストが、以下の動作、
ブレークポイントに到達するまで、前記トレース全体にわたる順方向連続トレース再生実行、
ブレークポイント範囲内の位置に到達するまで、前記トレース全体にわたる順方向連続トレース再生実行、
ブレークポイントに到達するまで、前記トレース全体にわたる逆方向連続トレース再生実行、
ブレークポイント範囲内の位置に到達するまで、前記トレース全体にわたる逆方向連続トレース再生実行、
逆方向実行ステップイン動作、
逆方向実行ステップアウト動作、
逆方向実行ステップオーバー動作、
順方向実行ステップイン動作、
順方向実行ステップアウト動作、
順方向実行ステップオーバー動作、
の内少なくとも１つを要求する、トレース再生実行制御方法。
【請求項１３】
請求項８記載のトレース再生実行制御方法において、前記トレース対象マネージド・プログラムの実行中に、プロセッサーは一度に多くともＮ箇所のアドレスしか監視できないというハードウェア・ブレークポイント制約によって、ブレークポイントの最大数が制限されており、前記方法が、更に、前記トレースの再生実行中にＮ個よりも多いブレークポイントを設定し、これによって前記ハードウェア・ブレークポイント制約を超過するステップを含む、トレース再生実行制御方法。
【請求項１４】
データーおよび命令が構成されたコンピューター読み取り可能記憶媒体であって、メモリーと動作可能に通信するプロセッサーによる実行時に、トレース再生実行制御方法を実行し、前記トレース再生実行制御方法が、
トレース再生実行制御リクエストを受けるステップであって、前記トレース再生実行制御リクエストが、コンピューティング・システム上で実行するソフトウェア・ツールにおいて受け取られる、ステップと、
前記トレース再生実行制御リクエストに基づいて、前記トレース対象マネージド・プログラムのソース・コードと前記ソース・コードの中間表現との間でマッピングし、前記中間表現とトレースとの間でマッピングするステップであって、前記トレースが、前記トレース対象マネージド・プログラムが実行されるに連れてトレースされたネーティブ・コード命令の記録を含み、前記トレースが、前記ランタイムの実行インスタンスを全く含まない、ステップと、
前記トレース再生実行制御リクエストに対応するトレース・ネーティブ・コード命令を実行する、またはトレース・ネーティブ・コード命令上にブレークポイントを設定し、これによって前記トレースの再生を制御するステップと、
を含む、コンピューター読み取り可能記憶媒体。
【請求項１５】
請求項１４記載のコンピューター読み取り可能記憶媒体において、前記方法が、以下の実行制御アクティビティ、
前記トレースにおいて機械レベル情報を使用して高レベルでランタイムの実行を制御するアクティビティであって、高レベルで制御するとは、ソース・コードにおいて識別子またはステートメントまたは式を指定するユーザーの選択に基づいて制御することを意味し、機械レベル情報が、プロセッサー・アーキテクチャに特定である情報を意味する、アクティビティ、
前記トレース対象マネージド・プログラムのプロセスの順方向実行および逆方向実行の双方をデバッグするアクティビティ、
少なくとも部分的に広いブレークポイント範囲を設定することによって、前記ソース・コードに示されるコールにステップインするアクティビティであって、ブレークポイント範囲が広いのは、前記トレースにおいて少なくとも１０００の連続アドレスまたは命令を包含するときである、アクティビティ、
前記トレース対象(traced)が、ルーチンの少なくとも２つのバージョンのネーティブ・コードを含むとき、前記ルーチンのネーティブ・コードの特定バージョンにマッピングするアクティビティ、または、
前記ライブ・プロセスをデバッグする間に、前記トレース対象マネージド・プログラムのライブ・プロセスからのトレース・データーを記録し、次いで前記記録したトレース・データーの少なくとも一部を使用して、前記ライブ・プロセス上で逆実行デバッギングを実行するアクティビティ、
の内少なくとも３つを含む、コンピューター読み取り可能記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]  コンピューター・ソフトウェアは複雑であることが多い。この複雑さの一部は、プログラムが実行するように設計された作業の性格から由来するものもある。例えば、何時間にもまたはもっと長い時間期間にわたって大多数の実世界の項目または進行中のトランザクションを追跡する、他の複雑なソフトウェアとアクティビティを調整する、複雑なハードウェアを制御する等があげられる。ソフトウェアの殆どあらゆる実世界の使用において、複雑さが発生するのは、多くの詳細が導入され、初期状態では英語または他の自然言語で遙かに不正確に記述される実世界作業をどのように実行するか、コンピューター・ハードウェアに命令するために、多くの詳細を正しく管理しなければならないからである。即ち、高レベル記述から、コンピューター・システムによって実行可能な低レベル実装への変換は、複雑さを混入するのが不可避である。自然言語よりも正確なプログラミング言語のソース・コードでさえも、未だ比較的高レベルであり、したがって曖昧であり、種々の理解および実装に隙がある。ソース・コードは、計算ハードウェアによって直接実行することができる低レベル命令に変換され、この変換の間に多くの詳細が導入され、選択が行われる。
【０００２】
[0002]  複雑さのために、プログラミング・エラー、別名、「バグ」の可能性が頻繁に認められる事態が生じる。バグの原因を特定し、プログラムを修正してバグの影響を修復(remediate)または除去しようとするプロセスを、「デバッギング」(debugging)と呼ぶ。デバッギングを補助する特殊ソフトウェア・ツールを「デバッガー」(debugger)と呼ぶ。デバッグされるプログラムを「デバッギー」(debuggee)と呼ぶ。
【０００３】
[0003]  デバッギングは最も容易なのは、おそらく、開発者が、全て自由自在に、ゆっくりとまたは最大速度でデバッギーを実行することができるとき、あるいはデバッギーの実行を一時停止することできるときであり、デバッギーの実行における任意の時点におけるデバッギーの全ての状態情報を試験することができる。これは、「ライブ・プロセス・デバッギング」(live process debugging)として知られている。しかしながら、このようなデバッギーに対する最大限のアクセスは、得られないことが多い。例えば、デバッギーが製品ソフトウェアであり、業務委託契約(service agreements)に違反せずに、あるいは関係者の名声、安全性、または財政に危害を加えることなく、ライブでデバッグすることができない場合もある。ライブ・プロセス・デバッギーが一度に数秒間一時停止され、その間に、開発者が変数値を試験し、どの関数がどのパラメータ値によってコールされたか確かめるためにチェックし、ソース・コードを見直し、バグについて可能な説明を検討し、バグを特定し、修復し、または排除するのに役立ち得る検査を考案するとき、容認できない危害が発生するおそれがある。
【０００４】
[0004]  したがって、デバッギーを実行しながら状態情報を記録しておき、後に試験するときに、デバッギーの実行を実質的に一時停止しなくても済むようにする場合もある。このような記録を作成すると、デバッギーの実行が遅くなるが、この記録は、ライブ・デバッギングができるように、製品性能目標を損なうことなく、役に立つ情報を提供することができる。実例をあげると、特定の時点においてデバッガーに関連があるメモリー値の一部または全部をディスクにコピーするメモリー・ダンプを作成するのに十分なだけ、デバッギーを一時停止することができる。デバッギーの実行の態様の一部を、実行トレースに記録することもできる。デバッガーの中には、このようなトレースの使用をサポートし、デバッギーをライブ・プロセスにするのではなく、トレースしたデバッギーの実行を再生するものがある。あるデバッガーを用いると、デバッギーの実行を順方向または逆方向に再生することができ、このようにして「タイム・トラベル」(time travel)、「逆」(reverse)、または「履歴的」(historic)デバッギングを可能にする。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
[0005]  しかしながら、実行トレースに含まれる情報は、ライブ・プロセス・デバッギングの間に時々得られるよりも少ないと考えられるため、そして実行トレースは低レベルで状態情報を記録するため、デバッガーまたは他のソフトウェア・ツールが再生実行を制御しようとするとき、即ち、記録されたトレースに基づく実行を制御しようとするとき、技術的な課題が発生する。実装(implementation)によっては、実行制御動作は、開発者には馴染みがありライブ・デバッギング中に使用されることが多く、トレースに基づく再生中に試されると精度が落ちるおそれがあり、または全く利用できないおそれもある。
【０００６】
[0006]  したがって、進歩によって低レベル実行トレースを使用して高レベル実行制御を効率的にそして精度高く実装することができれば、デバッガーあるいは他の再生ツールまたはロギング・ツールによって、開発者または自動性能監視ツールに利用可能な情報を充実させるのに資することができよう。つまり、このような進歩は、コンピューター・システム挙動の正確な理解を促進することによって、そしてコンピューター・システムのバグの軽減または根絶を増進させることによって、コンピューター・システムの機能を改善するのに役立つであろう。
【課題を解決するための手段】
【０００７】
[0007]  本明細書において説明する技術(technology)の中には、トレースに基づくデバッギングにおける実行制御の精度を高めるための、プログラムのソース・コードにおける位置と、プログラムの実行のトレースにおける対応する位置との間におけるマッピングの技術的アクティビティ(technical activity)を対象とするものがある。ある教示は、ソース・コードの表現(expression)またはステートメントと整列する位置において１つ以上のブレークポイントを設定する特定のブレークポイント設定手順を対象とする。トレースに基づく逆実行をサポートするためにライブ・デバッギング環境を適応化する技術的メカニズムについて説明する。本明細書では、デバッギーの実行を、実行トレースに基づいて順方向または逆方向あるいは両方向に再生するという課題に応じた、特定の技術的ツールおよび技法について説明する。本明細書における教示に関する他の技術的活動も、当業者には明白になるであろう。
【０００８】
[0008]  本明細書において説明する実施形態の中には、トレース再生実行制御機能(capabilities)を使用または提供し、プロセッサーと、メモリーと、プログラムの実行中に記録されるトレースとを使用するものがある。プログラムは、ランタイム、プログラム・ソース・コード、ソース・コードとその中間表現とトレースとの間のマッピング、およびデバッガーまたは他のツールにおける実行コントローラーを使用する。ランタイムは、トレース対象プログラムが実行しトレースが捕捉された(captured)ときに、動的コンパイルまたはメモリー・ガベージ・コレクション・サービスを提供したサポート・コードを含む。トレースは、プログラムによって実行されたネーティブ・コード命令の記録を含むことができる。トレースは、デバッギーが実行されていた間にプログラムの実行中にアクセスされたデーターの記録を含むことができる。トレースは、１つ以上のメモリー・ダンプまたはスナップショットを含むことができる。トレースは、１つ以上のファイルあるいは不揮発性または揮発性メモリーの複数の部分(portions)に格納することができる。実行コントローラーは、ツールからのリクエスト(request)に応答して、トレースの再生実行を制御するように構成される。再生中、グループ化したネーティブ命令をそれらの対応するそれぞれのソース・コード品目(source code item)と整列させるのに役立つように設定されたブレークポイントを使用して、ソース−中間マッピングおよび中間−ネーティブ・マッピングによって、ソース・コードを、トレース・ネーティブ・コード命令または他のトレース・エントリーと相関付ける。
【０００９】
[0009]  本明細書において説明する実施形態の中には、コンピューター実装トレース再生実行制御を使用または実行するものがある。トレース対象マネージド・プログラム(managed program)を識別する。マネージド・プログラムは、「ランタイム・マネージド」プログラムとも呼ばれ、ランタイムへのコールと併せて実行するように構成されたプログラムのことである。トレース対象マネージド・プログラムとは、トレースされた、またはトレースされるように構成されたものである。トレース再生実行制御リクエストを、ソフトウェア・ツールにおいて受ける。このトレース再生実行制御リクエストに基づいて、トレース対象マネージド・プログラムのソース・コードとこのソース・コードの中間表現との間のマッピングを続いて行い、中間表現とトレースとの間の他のマッピングを続いて行う。トレースは、ランタイムのいずれの実行インスタンスも含まない。トレースの再生は、例えば、トレース再生実行制御リクエストに対応する方向および量で、トレースされたアクティビティをエミュレートすることによって（例えば、１ステップ前に進み、またはそれをステップオーバーすることによってルーチン全体を繰り返す）、またはトレース位置上にブレークポイントを設定することによって、または双方を行うことによって、制御することができる。
【００１０】
[0010]  以上の例は単なる例示に過ぎない。この摘要は、特許請求する主題の主要な特徴や必須の特徴を特定することを意図するのではなく、特許請求する主題の範囲を限定するために使用されることを意図するのでもない。逆に、この摘要は、詳細な説明において以下で更に説明する技術的概念を、簡略化した形態で紹介するために設けられている。技術革新(innovation)は特許請求の範囲によって定められ、この摘要が特許請求の範囲と矛盾する場合、特許請求の範囲が優先するのは当然である。
【００１１】
[0011]  更に具体的な説明を、添付図面を参照しながら、行う。これらの図面は、選択された態様を例示するに過ぎず、したがって適用範囲または範囲を完全に決定するのではない。破線は、ある項目が随意であることを示すが、請求項において記載される項目、または当業者によって請求項を具体化するためには非随意(non-optional)と見なされる項目はいずれも、その請求項の実施形態において何らかの形態で存在するというように理解されるものとする。
【図面の簡単な説明】
【００１２】
【図１】図１は、コンピューター・システムを示し、更に構成記憶媒体(configured storage medium)も示すブロック図である。
【図２】図２は、ライブ・プロセス・デバッギングの態様を示すブロック図である。
【図３】図３は、１つの特定時点において作られたメモリーのコピーに基づくデバッギングの態様を示すブロック図である。
【図４】図４は、主リクエストおよびデバッガーと再生アダプターとの間のレスポンスを含む、トレースに基づくデバッギングのためのアーキテクチャ例の態様を示すブロック図である。
【図５】図５は、デバッギング中に参照することができる、またはトレースにおいて参照することができる様々な種類のメモリー・セルを示すブロック図である。
【図６】図６は、実行トレースからの情報をシークする(seek)、または実行トレースの再生中に実行制御を統制する(exert)ことができる機械レベルのリクエストを示すブロック図である。
【図７】図７は、機械レベルのリクエストに対するレスポンスを示すブロック図である。
【図８】図８は、トレース再生実行制御システムの一例を示すブロック図である。
【図９】図９は、いくつかのトレース再生実行制御動作を示すブロック図である。
【図１０】図１０は、スレッド・トレース・データーのある態様を示すブロック図である。
【図１１】図１１は、１つ以上の中間表現のある態様を示すブロック図である。
【図１２】図１２は、逆実行デバッギングをサポートするトレースを使用するように適応化されたライブ・プロセス・デバッギング環境のある態様を示すブロック図である。
【図１３】図１３は、トレース再生実行制御方法の一例を示すフローチャートである。
【図１４】図１４は、あるトレース再生実行制御方法を更に示すフローチャートである。
【発明を実施するための形態】
【００１３】
[0026]  全体像
[0027]  生産クラウド環境におけるデバッギングは、重大な技術的課題を提起する。例えば、オンライン・ショッピング・カートに対する特定のリクエストＲが機能していない(working)と仮定する。開発者は、他のリクエスト全ての処理を遅らせることなく、そしてリクエストＲの処理における遅れ(slowdown)を最小限に抑えつつ、リクエストＲの処理をデバッグできるようにするには、どのようにすればよいであろうか？バグを発見するためには、開発者は、コード内部で何が発生しているかについての情報、例えば、リクエストＲの処理中に１つ以上の対象地点における変数の値を確認する方法を使用する。
【００１４】
[0028]  本明細書において論じるトレースに基づくデバッギングの技術革新は、従来の手法では未解決のまま放置されている技術的課題を克服するのに役立つ。実例をあげると、多くの従来のデバッガーおよびデバッギング方法は、開発者が変数値についての情報を得るために、ホールト・ブレークポイントを設定させる。ホールト・ブレークポイントとは、開発者が処理における所与のポイントにおいてメモリー・コンテンツを試験し、観察されるものについて可能な説明を検討するための時間を有するように、実行を停止する命令である。しかし、生産環境においては、ホールト・ブレークポイントは、多数のリクエストの処理を停止させる、またはリクエストを全体的に失敗させる（例えば、タイムアウト）、または実行が異なる実行パスを通る原因となる可能性があり、これらはいずれも望ましくない。１つのスレッドのみを停止させるだけであっても、不適切に(undesirably)リクエストが放棄され、予想できなかった副作用が生じてデバッギングを阻害する、または性能が低下する、あるいは双方のおそれがある。
【００１５】
[0029]  周知の(familiar)デバッギング手法の中には、コードにおける特定のポイントにおいて特定の変数の値を印刷するために印刷ステートメントを追加することを伴うもの、または、例えば、ある変数の値を検査して、それがそのコードのそのポイントにあることを開発者が予期するものであるか否か確認するために、他のコードを追加することを伴うものがある。しかし、これらの手法は、コードのコンパイルし直しおよびデプロイし直しを必要とするのはもっともであり、生産環境では、特に、コンパイルし直しおよびデプロイし直しが、１つのバグを発見し修復するための繰り返しデバッギング・プロセスの一部として、複数回行われなければならない場合には、好ましくない。
【００１６】
[0030]  開発者は、リクエストに関連するメモリーの一部または全部のコピーを作るために、実行時にリクエスト処理コードに動作を注入することができる。このコピーは、「スナップショット」３０４（コピー・オン・ライトによってメモリー割り当てページを元のプロセスと共有するプロセスのメモリー内コピー）または「ダンプ」ファイル３０２（プロセスのシリアル化コピー）、あるいは双方を含むことができる。従来のデバッガーの中には、ダンプ・ファイルまたはスナップショットを読み取ることができ、しかるべきメタデーターが与えられると、メモリー・コンテンツを、バイナリーから情報構造に変換された変数値を示すフォーマットで表示する(present)ことができるものがある。この情報構造は、変数名を含み、変数のそれぞれのデーター型に基づいて、変数値を表示する。しかし、メモリーをファイルにダンプするには長時間を要し、このために、単にリクエストＲだけでなく、シナリオ例における全てのリクエストの処理が遅れることになる。スナップショットを取り込むことはダンプ・ファイルを作成するよりも遙かに速いが、バグを暴露するメモリー・スナップショットを取り込むためには、処理において有用なポイントを捜す試行を開発者に多数回行わせるおそれがあり、しかもスナップショットはＲＡＭ内の空間を消費する。ダンプ・ファイルまたはスナップショットに捕捉される実行時間外の他の時点におけるメモリーのビューを得るためには、他のメモリー・コピーを作成することができる。
【００１７】
[0031]  ライブ・プロセスから任意の時点におけるメモリーのビューを得るためには、ライブ・プロセスを使用する。多くの最新のコンピューティング・システムでは、図２の例に示すように、ライブ・プロセス２０２は、オペレーティング・システム１２０に頼ることに加えて、ランタイム２０４を含む。ランタイム２０４は、ガベージ・コレクションまたは動的コード・コンパイル（即ち、ＪＩＴコンパイルまたは中間言語コードのコンパイル）、あるいは双方を付与する(provide)。ガベージ・コレクションは、オブジェクト到達性分析(object reachability analysis)、オブジェクト参照回数(object reference counting)、または他の戦略を利用することができる。構成の中には、インタプリタ・ランタイム(interpreted runtime)２０４を含むものがあり、本明細書における教示を、インタプリターのビューをネーティブ・トレース上に重ね合わせ、インタプリター自体の内部においてブレークポイントを使用することによって、インタプリタ・ランタイムに対して実行制御を行うために応用できることは、当業者には認められよう(acknowledge)。加えて、あるランタイム（例えば、Ｊａｖａ（登録商標）ランタイム）は、それらのＩＬ表現（Ｊａｖａ用語ではこれを「バイトコード」と呼ぶ）を常にＪＩＴコンパイルしない。むしろ、ランタイムは、頻繁に使用されない関数については、バイトコードを解釈する(interpret)ことを選択することができる。このような場合、実行制御は、ランタイム・コード自体の実行制御を行うことができ、ネーティブ・コードを内部ランタイム・データー構造に、ＩＬに、ソース・コードにマッピングすることができる。ネーティブ・コード／内部ランタイム・データー構造／ＩＬマッピングは、中間−ネーティブ・マッピング８１２の例と見なすことができ、ＩＬ／ソース・コード・マッピングは、ソース−中間マッピング８１０の例と見なすことができる。
【００１８】
[0032]  ランタイムを欠くプロセスは、ホールト・ブレークポイントの挿入によりデバッガーによって直接制御することができるが、このプロセスとは異なり、ランタイムに依存するプロセスは、デバッガー２００によって直接制御することはできない。何故なら、これらのランタイムは、メモリー位置、メモリー・コンテンツ、および命令ポインターというような、デバッガーの詳細２０６から、事実上隠れるからである。デバッギング中にメモリー内に何が入っているか開発者に示すために、デバッガーはランタイムにメッセージ２１４を送り、現在のメモリー値を求める。ランタイムは、回答メッセージ２１６において値をデバッガーに送り、デバッガーは、何らかのユーザー・インターフェース２１０に、それが回答メッセージにおいて受け取った値を表示する。
【００１９】
[0033]  従来の手法の欠点の特定例として、中間言語（ＩＬ）を実行する仮想機械として実装されるランタイム２０４について検討する。従前からのネーティブ・コード・デバッガーを使用して、このＩＬを容易にデバッグすることはできない。何故なら、このデバッガーは、ＩＬコードをデバッグするために動作するよりはむしろ、仮想機械／ランタイムをデバッグするために動作するからである。
【００２０】
[0034]  また、ランタイムはライブ・デバッギーの実行も制御する。ＩＬまたはＩＬにコンパイルする言語のための従前からのデバッギーは、デバッガーとランタイムとの間の通信チャネルをデバッギー内部に設定することによって、動作する(work)。デバッギーにおけるランタイムは、デバッギング体験を提供するために要求される作業(work)の大部分を行う。一例では、メソッドＦｏｏのオフセット２８において中間言語（ＩＬ）命令にブレークポイントを設定するためには、ランタイムにメッセージを送り、Ｆｏｏのオフセット２８にブレークポイントを設定するように、それに求める。次いで、ランタイム内のスレッドがそのメッセージを受け取り、Ｆｏｏ  ＩＬ  オフセット２８を、メモリー・アドレス０ｘ４５６７１２３５１２３９５に常駐する機械命令に変換し、次いでその位置にブレークポイント命令を書き込む。同様に、ステップ(step)、ステップイン(step-in)、ステップアウト(step-out)、およびステップオーバー(step-over) というような周知の実行制御動作を行うために、デバッガーはランタイムにメッセージ２１４を送り、その動作を要求し、ランタイム２０４はその動作を行い、回答メッセージ２１６において更新ステータスをデバッガーに送り、デバッガーは何らかのユーザー・インターフェース２１０に、回答メッセージにおいて指示された結果を表示する。
【００２１】
[0035]  ユーザー・インターフェース２１０は、デバッギー・プログラム状態のデバッガーの表現をユーザーに、図を用いて表示する。プログラム状態の例をいくつかあげると、スレッドのリスト、各スレッド上で実行するソース・コードの次のライン、スレッド毎のコールスタック、コールスタックの各フレームにおける１組の変数、これらの変数の値等があげられる。ユーザー・インターフェースは、ルーチンのローカル・データー、監視対象変数(watched variables)およびそれらの値、ソース・コード、式エバリュエーター(expression evaluator)、およびデバッギー２０２についてのその他の情報を表示するウィンドウを含むことができる。
【００２２】
[0036]  ある実装では、デバッガー２００のランタイム変換部が、一方ではメモリー・セルおよびレジスターのような低レベル概念と、他方ではランタイム抽象化との間で変換する役割を担う。ランタイム抽象化の例には、スレッドのリスト、スレッド毎の１つ以上のコールスタック、および次に実行されるＩＬ命令が含まれる。尚、抽象化のランタイム・レイヤにおけるコールスタックは、抽象化のソース・コード・レベルにおけるコールスタックと必ずしも同一ではないことを注記しておく。例えば、仮想機械のコールスタックは、この仮想機械内で実行されるＩＬコードの仮想コールスタックと必ずしも一致しない。
【００２３】
[0037]  プロセスの実行トレース４１８を作成することは可能である。次いで、ハードウェア１０２のエミュレーションを使用して、トレースを再生することができる。ときには、このトレース対象プロセスは高水準言語２１２で書かれる。このためには、プロセス２０２をランタイム・フレームワーク２０４によって実行する必要がある。トレース・データーは、プログラムが書かれた高水準言語よりはむしろ、低レベルにおけるビュー（例えば、ランタイムまたは実行時にコンパイルされるコード、あるいは双方）を反映するので、トレース自体はデバッグするのが難しい場合がある。トレース技術の中には、開発者１０４が好むプロセスの高レベル・ビューを提供しないものもある。殆どの高レベル・ランタイムは、ランタイム自体が、そのフレームワーク内で実行するプログラムについての情報を提供することを要求する。つまり、従来のデバッギングは、プロセスをランタイム内で実行することを必要とするが、デバッギングが、ライブ・プロセスの代わりにトレースに基づくときには、これは選択肢とならない。
【００２４】
[0038]  他のあらゆるプロセスと同様、ランタイムをトレースすることができる。しかしながら、ランタイム以外のデバッギング・ソフトウェアは、ランタイムをデバッグするよりも一般的である。プロセスをトレースする際、ランタイム自体の一部である、一部のコードまたは全てのコードをトレースすることを含めてもまたは除外してもよい。
【００２５】
[0039]  ランタイム２０４に依存するコードを実行しているライブ・プロセスの実行を制御するために、デバッガーはランタイムにメッセージを送り、「ｓｔｅｐ」または「ｒｕｎ」のような動作を要求し、次いでランタイムは、デバッガーの代わりに、この動作を実行する。
【００２６】
[0040]  デバッガーの代わりに動作を実行するために、ランタイムにメッセージを送るデバッガーの機能は、現在実行中のランタイムを有さないトレース・ファイルとでは動作しない。ダンプ・ファイル３０２およびスナップショット３０４は、ランタイムが利用できないことに関しては、トレースと同様である。ランタイムは、ダンプまたはスナップショットまたはトレースで表すことができるが、実行しておらず、したがって従前の手法に呼び込むことができない。
【００２７】
[0041]  しかしながら、トレース・ファイル４２０をデバッギング環境の一部にすることができる。本明細書において論ずる、トレースに基づくデバッギングの実施形態の中には、デバッガーがトレース・ファイルから実行を再生できるように、デバッギングのパワーを拡張するものがある。開発者によって選択された実行時間における１つ以上の時点において開始し、開発者によって選択された刻み幅で、トレースされた実行全体にわたって順方向または逆方向のいずれかで移動する。１つの手法では、トレースと高水準言語デバッガーとの間に再生レイヤを挿入する。再生レイヤは、ランタイムの実行制御メッセージを理解し、これによって、トレース対象プロセスの高レベル制御が可能になる。
【００２８】
[0042]  ある状況では、開発者が、記録されたトレース４１８を再生するときに、実行再生を制御して、実行時間を順方向にまたは実行時間を逆方向に実行するために、「タイム・トラベル」デバッガーを使用することができ、これによって、以前のようにスナップショットのためだけでなく、ここではコード実行中に記録される実行時間のセグメントの連続再生のために、有用な高レベル（例えば、命名されたおよびデーター型に基づく）変数の提示で、命令ポインター（１つまたは複数）およびメモリーというようなプログラム状態情報を提示するデバッガーの能力を利用することができる。トレース・データーをグループ化し、式およびステートメントというような対応するソース・コード構造と整列させることによって、デバッギングを一層効率的にすることができる。トレースにおいて捕捉されたメモリー値を、トレース・ファイルに記録された低レベル・データーに基づいて、複数のポイントにおいて、高レベル提示で、開発者によって検査することができる。
【００２９】
[0043]  トレースを再生するときにデバッギー状態を制御するために、再生レイヤを利用することができる。このように適応化すると、デバッガー２００は、機械レベル動作として記録されているプロセス・トレースのランタイム（高レベル）ビューを供給する(apply)ことができる。本願に限って言えば、「機械レベル」動作とは、機械特定詳細レベルで指定される動作である。本明細書では、「ネーティブ」(native)および「機械レベル」(machine-level)は、命令またはコード一般に関して、相互交換可能に使用される。
【００３０】
[0044]  本明細書において説明する実施形態は、人によってはより広いコンテキストで見られる(viewed)場合もある。実例をあげると、実行を制御する、実行を記録する、記録された実行を再生するというような概念は、特定の実施形態に関連すると見なされてもよい。しかしながら、だからといって、広いコンテキストの可用性から、本明細書において抽象的概念のために排他的権利を求めているということにはならず、これらは求めていない。逆に、本開示が注目するのは、どのようにして高レベル制御リクエストを機械レベル・トレースと自動的に相関付けるかというような特定の技術的問題、および本明細書において取り組まれる他の問題を完全にまたは部分的に解決する技術的効果を有するように、しかるべく具体化した実施形態である。実行を制御する、実行を記録する、または記録された実行を再生することを伴う他の媒体、システム、および方法は、本開示の範囲外である。したがって、本開示の適正な理解の下では、曖昧さ、単なる抽象(mere abstractness)、技術的特徴の欠如、および付随する証明問題も回避される。
【００３１】
[0045]  技術的特徴
[0046]  本明細書において説明する実施形態の技術的特徴は、当業者には明白であろう。そして広範囲の注意深い読者にも、様々な方法で明白になるであろう。ある実施形態は、コンピューティング技術に根付いている技術的アクティビティに取り組み、コンピューティング・システムのデバッグを補助することによって、これらのシステムの機能を改善することによって、システムの稼働時間、システム精度、および生成される計算結果に関してパワー利用度を高める。実例をあげると、ある実施形態は、実行開始点から再開し所望のポイントまで順方向に移動する代わりに、再生実行が所望のポイントに逆に移動することを可能にすることによって、デバッギングしている間に開発者がバグ説明を突き止めるために費やす時間量を短縮するのに役立つシステムのデバッグ可能性機能(debuggability functionality)を提供する。ある実施形態は、トレース・データーを対応するソース・コード・ステートメントに精度高く整列させることによって、システムのデバッグ可能性を高める。ある実施形態は、一度に１つのアドレスにブレークポイントを設定する代わりに、ブレークポイント・アドレス範囲を設定する機能というような追加のデバッギング機能をシステム内に設ける。
【００３２】
[0047]  ある実施形態は、汎用コンピューター内における典型的な相互作用を超える様態でソフトウェアと相互作用するコンピューティング・ハードウェアのような、技術的コンポーネントを含む。例えば、メモリー割り当て一般、メモリー読み取りおよび書き込み一般、命令実行一般、および何らかの種類のＩ／Ｏのような、通常の相互作用に加えて、本明細書において説明する実施形態は、本明細書において開示するような、逆方向ステップアウト再生動作を実現する。
【００３３】
[0048]  ある実施形態によって提供される技術的効果には、デバッギング時間の一層効率的な使用、追加のトレース・データーを得るための再トレースの削減、およびバグの因果関係の探求のためのデバッガー機能の改善が含まれる。
【００３４】
[0049]  ある実施形態は、技術的適応化を含む。ある実施形態は、ランタイムに合わせて、即ち、周知のデバッガー−ランタイム通信と互換性のあるメッセージ・フォーマットでフォーマットされたリクエストを受け入れ、ライブ・デバッギング中にランタイムによって使用することができるフォーマットでこれらのリクエストに応答する再生レイヤ・アダプターを含む。ある実施形態における再生アダプターは、ライブ・プロセス・デバッギング、ダンプに基づくデバッギング、およびタイム・トラベル・トレースに基づくデバッギング間における相違を隠すインターフェースを提供する。ある実施形態は、ソース・コード、中間表現（１つまたは複数）、およびトレース・データー間のマップを含む。
【００３５】
[0050]  本教示の技術的特性に基づく他の利点も、行われる説明から、当業者には明白となるであろう。
【００３６】
[0051]  頭字語および略語
[0052]  様々な頭字語および略語について、以下に定義する。他のものは、本明細書のどこかで定義されるものか、または当業者によって理解されるために定義が必要ないものとしてよい。
【００３７】
[0053]  ＡＬＵ：算術および論理ユニット
【００３８】
[0054]  ＡＰＩ：アプリケーション・プログラム・インターフェース
【００３９】
[0055]  ＢＩＯＳ：基本入力／出力システム
【００４０】
[0056]  ＣＤ：コンパクト・ディスク
【００４１】
[0057]  ＣＰＵ：中央処理ユニット
【００４２】
[0058]  ＤＡＣ：データー・アクセス・コンポーネント
【００４３】
[0059]  ＤＶＤ：ディジタル・バーサタイル・ディスクまたはディジタル・ビデオ・ディスク
【００４４】
[0060]  ＦＰＧＡ：フィールド・プログラマブル・ゲート・アレイ
【００４５】
[0061]  ＦＰＵ：浮動小数点処理ユニット
【００４６】
[0062]  ＧＰＵ：グラフィカル処理ユニット
【００４７】
[0063]  ＧＵＩ：グラフィカル・ユーザー・インターフェース
【００４８】
[0064]  ＩＤＥ：「対話式開発環境」(interactive development environment)と呼ばれることもある統合開発環境
【００４９】
[0065]  ＩＬ：中間言語
【００５０】
[0066]  ＯＳ：オペレーティング・システム
【００５１】
[0067]  ＲＡＭ：ランダム・アクセス・メモリー
【００５２】
[0068]  ＲＯＭ：リード・オンリー・メモリー
【００５３】
[0069]  他の用語
[0070]  本明細書では、図面に示すような例示的実施形態(exemplary embodiment)を参照し、これらを説明するために、本明細書では、具体的な文言を使用する。しかし、本明細書において例示される特徴の変更(alteration)および更に他の修正(modification)、ならびに本明細書における特定実施形態によって例示される抽象的原理の他の技術的応用も、関連技術（１つまたは複数）に習熟し本開示を入手できるものには想起され、特許請求の範囲内に該当すると見なされて当然である。
【００５４】
[0071]  用語の意味は、本開示において明確化されるので、特許請求の範囲は、これらの明確化に対して注意深く読解されてしかるべきである。具体的な例を示すが、他の例も、使用される用語の意味に当てはまり、更に１つ以上の請求項の範囲に該当するのとしてもよいことは、当業者には理解されよう。用語は、これらが一般的な使用において（特に、技術的でない使用において）、または特定の業界における使用において、あるいは特定の辞書または１組の辞書において有する意味とは、必ずしも同じ意味を有するとは限らない。参照番号は、用語の広さを示すのを補助するために、種々の言い回しにおいて使用されることがある。所与のテキスト片からの参照番号の省略は、必ずしも、図の内容がそのテキストによって論じられていないことを意味する訳ではない。発明者は、彼ら自身の辞書編集に対する彼らの権利を主張し行使する。引用される用語は明示的に定義されているが、用語が、引用符を使用せずに、暗示的に定義されることもある。本明細書の詳細な説明および／または出願申請書(application file)内の他のところで用語が明示的または暗示的に定義されることもある。
【００５５】
[0072]  本明細書において使用する場合、「コンピューター・システム」は、例えば、１つ以上のサーバー、マザーボード、処理ノード、ラップトップ、タブレット、パーソナル・コンピューター（携帯用またはそれ以外）、パーソナル・ディジタル・アシスタント、スマートフォン、スマートウォッチ、スマートバンド、セルまたは移動体フォン、少なくともプロセッサーおよびメモリーを有する他の移動体デバイス、ビデオ・ゲーム・システム、拡張現実システム、ホログラフ投影システム、テレビジョン、ウェアラブル・コンピューティング・システム、もののインターネット・ノード、および／または少なくとも部分的に命令によって制御される１つ以上のプロセッサーを備える他のデバイス（１つまたは複数）を含んでもよい。命令は、メモリーおよび／または特殊回路におけるファームウェアまたは他のソフトウェアの形態であってもよい。
【００５６】
[0073]  「マルチスレッド」(multithreaded)コンピューター・システムとは、複数の実行スレッドをサポートするコンピューター・システムである。「スレッド」という用語は、スケジューリング（そしておそらくは同期）が可能なまたはスケジューリング（そしておそらくは同期）が行われる命令の任意のシーケンスを含むように理解されてしかるべきであり、例えば、「プロセス」または「コルーチン」(coroutine)というような、他の名称で知られているかもしれない。複数のスレッドは、並行して、順番に、または並列実行（例えば、マルチ処理）および順次実行（例えば、タイム・スライスの設定）の組み合わせで実行することができる。
【００５７】
[0074]  「プロセッサー」とは、同時マルチスレッディングの実装(simultaneous multithreading implementation)におけるコアのような、スレッド処理ユニットである。プロセッサーはハードウェアを含む。所与のチップが１つ以上のプロセッサーを保持してもよい(hold)。プロセッサーは、汎用でもよく、またはベクトル処理、グラフィクス処理、信号処理、浮動小数点算術処理、暗号化、Ｉ／Ｏ処理等のような、特定の目的に合わせて個別に作成されてもよい。
【００５８】
[0075]  「カーネル」は、オペレーティング・システム、ハイパーバイザー、仮想機械、ＢＩＯＳコード、および同様のハードウェア・インターフェース・ソフトウェアを含む。
【００５９】
[0076]  「コード」とは、プロセッサー命令、データー（定数、変数、およびデーター構造を含む）、または命令およびデーター双方を意味する。「コード」および「ソフトウェア」は、本明細書では、相互交換可能に使用される。実行可能コード、インタプリタ・コード、およびファームウェアは、いくつかのコード例である。実行するために解釈またはコンパイルされるコードを「ソース・コード」と呼ぶ。
【００６０】
[0077]  「プログラム」は、本明細書では、アプリケーション、カーネル、ドライバー、割り込みハンドラー、ファームウェア、状態機械、ライブラリー、ならびにプログラマー（開発者とも呼ばれる）によって書かれたおよび／または自動的に生成された他のコードを含むように、広義で使用される。
【００６１】
[0078]  「サービス」とは、クラウド・コンピューティング環境または他のネットワーク環境において提供する消費可能なプログラムを意味する。
【００６２】
[0079]  「実行時点」(execution time point)とは、特に、トレースされた実行に関係するときの、処理ユニットまたはスレッドのための特定実行時点を意味する。本明細書において「特定の実行時点」(particular execution time)または「実行時点ｔ」(execution time t)等を引用するときは、実行時点を指す。実行時点は、例えば、タイムコード変数またはタイムコード値として、あるいはトレースまたは実行アクティビティの他の記録における相対的な位置として実装することができる。実行時点ｔａが実行時点ｔｂ「よりも前」または「よりも後ろ」であるとは、これら２箇所の実行時点の相対的な順序付けが決定されることを暗示する。同様に、「若い」(younger)実行時点とは、「古い」(older)実行時点よりも後の実行時点のことである。
【００６３】
[0080]  トレースされるイベントの順序付けについてのトレースにおける情報は、不完全なこともある。つまり、トレースは、イベントＡがイベントＢよりも前であることを確定するため、またはイベントＤがイベントＣよりも遅いことを確定するためには十分な情報を有することができる。しかし、イベントの相対的順序は、トレースに関する限り、部分的にまたは全体的に不確定である場合もある。トレースが、イベントＥがイベントＦの後でないことを示しても、必ずしもＥがＦの前であることを暗示するとは限らない。同様に、トレースが、イベントＫがイベントＪの前ではないことを示し、このトレースが、ＫがＪの後であることも示さない場合もある。また、２つの特定のイベントの互いに対するいかなる順序付けを確定するにも、トレースが十分な情報を欠くこともある。
【００６４】
[0081]  「タイムコード」とは、実行トレースにおける少なくともいくつかのイベントに対して順序付けを強制するために使用することができる、単調に変化する値を意味する。タイムコードは多くの場合単調に増大する値であることが予期されるが、タイムコードは、単調に減少する値として実装されることも可能である。タイムコードのいくつかの例には、命令カウンター、クロック時間（クロック・ティックとしても知られている）、および全体的に人工的な（レジスターや命令に基づかない）単調値が含まれる。トレースに依存して、トレースされるイベントの全てまたは一部がそれぞれの関連するタイムコードを有することもあり、関連するタイムコードを有さないこともある。タイムコードが存在するとき、これらは一意である場合もあり、また、いくつかのタイムコード値が繰り返されるために、これらが単に単調な場合もある。
【００６５】
[0082]  「メモリー・セル」とは、アドレス可能なメモリーの単位を意味する。いくつかの例には、ＲＡＭまたはＲＯＭにおけるバイトまたはワード、プロセッサーのレジスター、キャッシュ・ライン、および他のメモリーのアドレス可能な単位が含まれる。
【００６６】
[0083]  「エミュレーター」は、元のハードウェアと同じ機能を行う「エミュレーション」を実行するが、異なる実装または異なるハードウェア、あるいは双方を使用する。一例にＣＰＵエミュレーターがある。これは、ＣＰＵと同様に動作し、元のＣＰＵハードウェアと同様にコードを実行するために使用することができるが、元のＣＰＵとは異なる実装を有する。例えば、エミュレーターは、完全に異なる物理ハードウェア上で実行することができる。
【００６７】
[0084]  本明細書において使用する場合、「含む」(include) は、特に述べられていなければ、追加のエレメントを許容する（即ち、含む(includes)は備える(comprises)を意味する。
【００６８】
[0085]  「最適化する」(optimize)は、改良することを意味するが、必ずしも完全にではない。例えば、最適化されているプログラムまたはアルゴリズムにおいて、更に改良を行うことが可能な場合もある。
【００６９】
[0086]  「プロセス」(process)は、本明細書では、コンピューティング科学の技術分野における用語として使用されることもあり、その技術的な意味では、例えば、計算リソースのユーザー、即ち、コルーチン、スレッド、タスク、割り込みハンドラー、アプリケーション・プロセス、カーネル・プロセス、手順、およびオブジェクト・メソッドを包含する。また、「プロセス」は、本明細書において、例えば、システムの請求項または製品（構成された記憶媒体）の請求項ではなく、プロセスの請求項を記述するときに、特許法の技術用語としても使用される。同様に、「方法」(method)は、本明細書では、コンピューティング科学の技術分野における技術用語として（一種の「ルーチン」）使用されることがあるが、特許法の技術用語として（「プロセス」）も使用される。尚、当業者であれば、どちらの意味が特定の場合において意図されているか理解でき、更に、所与の特許請求されるプロセスまたは方法（特許法の意味）が、１つ以上のプロセスまたはメソッド（コンピューティング科学の意味）を使用して実装されてもよいことも理解できよう。
【００７０】
[0087]  「自動的に」(automatically)は、自動化なしとは逆に、自動化の使用によることを意味する（例えば、本明細書において論じる特定の動作および技術的効果を求めてソフトウェアによって構成される汎用コンピューティング・ハードウェア）。具体的には、「自動的に」実行されるステップは、紙面上で手によって実行されるのでも、人間の思考において実行されるのでもないが、これらは人間(human person)によって開始され、人間によって対話処理で誘導されてもよい。自動ステップは、このように提供される技術的相互作用がなくては実現されない１つ以上の技術的効果を得るために、機械によって実行される。
【００７１】
[0088]  技術的効果とは技術的実施形態の推定に基づく目的(presumptive purpose)であることは、当業者には理解されよう。例えば、実施形態において計算を伴うという単なる事実、および技術的コンポーネントを使用せずに何らかの計算を実行できる（例えば、紙と鉛筆による、または精神的処理過程としてであっても）という単なる事実は、技術的効果の存在を排除することはなく、実施形態の具体的および技術的特性を変化させることもない。元の実行速度よりも１〜２桁速い再生を可能にするためにトレース・データーを十分に速く検索するというような動作、およびトレースのネーティブ命令をグループ化し命令グループをそれぞれのソース・コード項目と整列させるための計算は、本明細書では、人間の精神的処理過程によってでは得ることができない速度および精度を、それらの固有なディジタル特性に加えて、必要としそして提供するものとして理解されることとする（人間の精神(human mind)は、必要なトレース・データーを引き出すために、トレース・ファイルや他のディジタル・ストレージと直接インターフェースすることはできない）。これは、当業者には良く理解されるが、他者も、この事実を知らされるまたは思い出さされることによって、恩恵が得られることもある。特に明記しない限り、実施形態は、単なる思考実験に対立するものとして、生産環境における規模で、または生産環境のための検査機関において動作することができることを仮定する。
【００７２】
[0089]  同様に、「計算的に」(computationally)は、コンピューティング・デバイス（少なくとも、プロセッサーおよびメモリー）が使用されることを意味し、単なる人間の思考または単なる人間の行動のみによって結果を得ることを除外する。例えば、紙と鉛筆で算術演算を行うことは、本明細書において理解されるような、計算的に算術演算を行うことにはならない。計算結果は、より速く、より広く、より深く、より精度が高く、より一貫性があり、より総合的であり、および／またはそれ以外で人間の遂行能力のみの範囲を超える技術的効果を提供する。「計算的ステップ」(computational step)とは、計算的に実行されるステップである。「自動的に」も「計算的に」も、必ずしも「直ちに」(immediately)を意味する訳ではない。「計算的に」および「自動的に」は、本明細書では相互交換可能に使用される。
【００７３】
[0090]  「積極的に」(proactively)は、ユーザーからの直接的な要求を伴わないことを意味する。実際に、実施形態による積極的なステップが、そのステップの結果がユーザーに提示されるまで、可能であることに、ユーザーが気が付かないことさえもある。特に明記しない限り、本明細書において説明する計算および／または自動ステップはいずれも、積極的に行うことができる。
【００７４】
[0091]  本文書全体を通じて、随意の複数形「（ｓ）」、「（ｅｓ）」、または「（ｉｅｓ）」の使用は、指示された特徴が１つ以上存在することを意味する。例えば、「プロセッサー（１つまたは複数）」(processor(s))は、「１つ以上のプロセッサー」または同等に「少なくとも１つのプロセッサー」を意味する。
【００７５】
[0092]  米国の法律および慣行に限って言えば、本明細書、特許請求の範囲、または他の場所における「ステップ」(step)という単語の使用は、ミーンズ・プラス・ファンクション、ステップ・プラス・ファンクション、または３５米国特許法第１１２条第６項／第１１２（ｆ）条の請求項の解釈を引き合いに出すことを意図するのではない。その主旨の仮定はいずれも、これによって明示的に反証される。
【００７６】
[0093]  米国の法律および慣行に限って言えば、請求項は、これらが「ための手段」(means for)という語句を使用していなければ、ミーンズ・プラス・ファンクションの解釈を引き合いに出すことを意図していない。ミーンズ・プラス・ファンクションの文言として解釈されるように意図された請求項の文言がある場合はいずれも、「ための手段」(means for)という語句を使用することによって、その意図を明示的に記載する。ミーンズ・プラス・ファンクションの解釈が適用されるとき、「ための手段」の使用によるか、および／または請求項の文言の裁判所の法的解釈によるかには関係なく、所与の名詞または所与の動詞について明細書において記載される手段は、その請求項の文言に結び付けられ、更に、図面におけるブロック図の同じブロック内に現れること、同じまたは同様の名称による指定、同じ参照番号による指定(denotation)の内任意のものによって、本明細書では一緒に結び付けられると理解されてしかるべきである。例えば、請求項の限定が「ザック・ウィジェット」(zac widget)を記載し、この請求項の限定がミーンズ・プラス・ファンクションの解釈の対象となる場合、あらゆる図のブロック、段落、あるいは「ザック・ウィジェット」について述べる例、またはザック・ウィジェットに割り当てられたあらゆる参照番号によって一緒に結び付けられる例において本明細書のいずれかのところで識別される全ての構造は、少なくとも、ザック・ウィジェットに対する適用(application for zac widgets)において識別される構造の一部であると見なされ、ザック・ウィジェット構造について１組の均等物を定める助けになる。
【００７７】
[0094]  本文書全体にわたって、特に明記しない限り、プロセスにおけるステップについて言及するときはいつでも、そのステップが直接対象の要素(party of interest)によって実行されても、および／または仲介メカニズムおよび／または仲介エンティティを通じて、その対象の要素によって間接的に実行されてもよく、なおもそのステップの範囲内に該当することを仮定する。即ち、対象の要素によるステップの直接的な実行は、直接的な実行が明示的に述べられた要件でなければ、必須ではない。例えば、整列する、クリアする、コンパイルする、継続する、制御する、デバッグする、エミュレートする、遭遇する、超過する、実行する、得る、グループ化する、識別する、マッピングする、実行する、受け取る、記録する、再生する、要求する、応答する、送る、設定する、指定する、ステップする（および、ステップイン、ステップアウト、ステップオーバーというような変形）、終了する、トレースする（および整列する、整列される、クリアする、クリアされる等）のような、宛先または他の主題(subject)に対する、対象の要素によるアクションを伴うステップは、転送する、コピーする、アップロードする、ダウンロードする、エンコードする、デコードする、圧縮する、解凍する、暗号化する、解読する、認証する、呼び出す等のような、何らかの他の要素(party)による仲介アクションを伴ってもよく、なおも対象の要素によって直接実行されたものと理解されてよい。
【００７８】
[0095]  データーまたは命令に言及するときはいつでも、これらの項目がコンピューター読み取り可能メモリーおよび／またはコンピューター読み取り可能記憶媒体を構成し、これによって、例えば、単純な紙面上の存在、人間の心における存在、単なるエネルギー、またはワイヤ上を伝搬される単なる信号に対立するものとして、それを特定の物品(article)に変換するという共通認識がある。米国における特許保護に限って言えば、メモリーまたは他のコンピューター読み取り可能記憶媒体は、米国特許および商標庁（ＵＳＰＴＯ）のIn re Nuijten事件の解釈の下における特許可能な主題の範囲から外れる、伝搬信号でも搬送波でも単なるエネルギーでもない。米国では信号自体をその適用範囲とする請求項はなく、そうでないことを主張するいずれの請求項の解釈も、文面上不合理である。米国以外において付与された請求項において特に明示的に述べられていないならば、請求項は信号自体をその適用範囲としない。
【００７９】
[0096]  更に、本明細書において明らかに異なる定めがあっても、（ａ）一方でコンピューター読み取り可能記憶媒体およびコンピューター読み取り可能メモリーと、（ｂ）他方で、信号媒体または単なるエネルギーとも呼ばれる伝送媒体との間に、明確な区別があることは理解されよう。伝送媒体は、伝搬信号または搬送波コンピューター読み取り可能媒体または単なるエネルギーである。対照的に、コンピューター読み取り可能媒体およびコンピューター読み取り可能メモリーは、伝搬信号でも、搬送波のコンピューター読み取り可能媒体でもない。請求項において特に明記しない限り、「コンピューター読み取り可能媒体」とは、コンピューター読み取り可能記憶媒体を意味し、伝搬信号自体でも単なるエネルギーでもない。
【００８０】
[0097]  「実施形態」(embodiment)は、本明細書では例である。「実施形態」という用語は、「本発明」と相互交換可能でなない。実施形態は、結果的に得られる態様の組み合わせが、それ自体本明細書において明示的に記載されていなくても、他の実施形態を創作するために自由に態様を共有または借用してもよい（結果が動作可能であることを前提とする）。あらゆる許容される組み合わせを明示的に記載することの要求は、当業者には不要であり、特許明細書は当業者である読者のために書かれることを認める方針に反する。少数の組み合わせ可能な特徴からでさえも得られる可能な組み合わせの数に関する正式な組み合わせの計算および非公式な共通の直観も、多数の態様の組み合わせが、本明細書において記載する態様に対して存在することを示す。したがって、あらゆる組み合わせの明示的な記載を要求することは、特許明細書が簡潔であり、該当する技術分野において読者に知識があることを求める方針に反することである。
【００８１】
[0098]  参照番号のリスト
[0099]  以下のリストは、便利であるように、そして図面の支援のために提示され、複数の項目を参照して技術革新を説明する明細書の本文の一部として提示されるものである。ここのリストに掲示されない項目も、しかしながら、所与の実施形態の一部であってもよい。本文を読みやすくするために、所与の参照番号は、本文において参照される項目の、全てではないが一部の記載の近くに記載される。同じ参照番号が、所与の項目の異なる例または異なる実例を参照するために使用される場合もある。参照番号のリストは次の通りである。
【００８２】
[00100]  １００  コンピューティング環境とも呼ばれる動作環境
【００８３】
[00101]  １０２  計算システムまたはコンピューティング・システムとも呼ばれるコンピューター・システム
【００８４】
[00102]  １０４  ユーザー
【００８５】
[00103]  １０６  周辺機器
【００８６】
[00104]  １０８  ネットワーク全体
【００８７】
[00105]  １１０  プロセッサー
【００８８】
[00106]  １１２  コンピューター読み取り可能記憶媒体、例えば、ＲＡＭ、ハード・ディスク
【００８９】
[00107]  １１４  リムーバブル構成コンピューター読み取り可能記憶媒体
【００９０】
[00108]  １１６  プロセッサーによって実行可能な命令であって、リムーバブル媒体上または他のメモリー（揮発性または不揮発性または双方）内に存在することができる。
【００９１】
[00109]  １１８  データー
【００９２】
[00110]  １２０  カーネル（１つまたは複数）、例えば、オペレーティング・システム（１つまたは複数）、ＢＩＯＳ、デバイス・ドライバー
【００９３】
[00111]  １２２  ツール、例えば、ウィルス予防ソフトウェア、プロファイラー、デバッガー、エディター、コンパイラー、インタプリター、セキュリティ・ペネトレーション・テスター、ファザー(fuzzer)、自動性能監視ツール等。本明細書において教示されるような実行制御を使用するように適応化することもできる。
【００９４】
[00112]  １２４  アプリケーション、例えば、ワード・プロセッサー、ウェブ・ブラウザー、スプレッドシート。
【００９５】
[00113]  １２６  表示画面。
【００９６】
[00114]  １２８  他の参照番号１０６、１０８、１１０、１１２、１１４と関連付けられないコンピューティング・ハードウェア。
【００９７】
[00115]  ２００  デバッギングのアクティビティとも呼ばれるデバッガー。
【００９８】
[00116]  ２０２  ライブ・デバッギー・プログラムまたはプロセス。
【００９９】
[00117]  ２０４  ランタイム、例えば、共通言語ランタイム、Ｊａｖａ（登録商標）仮想機械または実行のためにコードを動的に変換する他の仮想機械（Ｏｒａｃｌｅ Ａｍｅｒｉｃａ，Ｉｎｃ．の商標(mark)）。
【０１００】
[00118]  ２０６  メモリー品目、例えば、アプリケーションまたはシステム・データー構造。
【０１０１】
[00119]  ２０８  デバッガーのデーター・アクセス・コンポーネント。
【０１０２】
[00120]  ２１０  デバッガーのユーザー・インターフェース。
【０１０３】
[00121]  ２１２  メタデーターおよびシンボル表のような、ソース・コード関連情報。
【０１０４】
[00122]  ２１４  デバッガーからデバッギー情報源への主リクエスト、例えば、ライブ・デバッギーまたはダンプ・ファイル・リーダー・スナップショットまたはスナップショット・リーダー・ソフトウェアまたはトレース・ファイル・リーダー・ソフトウェア。
【０１０５】
[00123]  ２１６  デバッギー情報源または状態変化から情報を求めた主リクエストに対するレスポンス。最初の(first or initial)または最も重要なレスポンスにおいてではなく、主リクエストの抽象化レベルでのレスポンスにおけるように「主レスポンス」とも呼ばれる。
【０１０６】
[00124]  ２１８  ソース・コードにおけるステートメント。例えば、セミコロンまたは括弧、中括弧、または角括弧によって明示的に範囲を限定することができ、あるいは空白または行末によって暗示的に範囲を限定することもできる。
【０１０７】
[00125]  ２２０  ソース・コードにおける式。使用されるプログラミング言語によって構文的に定義され、関数コールの割り当て(assignment)、オブジェクト・メンバー(object member)の割り当て、ルーチン・コール、または定数、変数、演算子、および最終的な値または副作用を生成するルーチンの他の組み合わせであってもよい。
【０１０８】
[00126]  ３０２  ダンプ・ファイル、別名、メモリー・ダンプ。インデックスまたはメタデーターのような追加情報を含むこともできる。
【０１０９】
[00127]  ３０４  メモリー・スナップショット。インデックスまたはメタデーターのような追加情報を含むこともできる。
【０１１０】
[00128]  ４０２  例えば、デバッギーをステップスルーする(stepping through)ブレークポイントを設定する、ブレークポイントに到達するまでデバッギーを実行する等のような、デバッギーに対する実行制御をリクエストまたはエミュレートするための、デバッガーにおけるデバッギー実行制御コード。
【０１１１】
[00129]  ４０４  デバッガーまたは他のツールにおけるクロスレベル・マッピング。例えば、ソース・コードと中間表現との間のマッピング、または中間表現とトレース・データーとの間にマッピング。
【０１１２】
[00130]  ４０６  トレース・ファイルを使用してデバッギー実行をエミュレートする再生コンポーネント。単独で、または他の再生レイヤ・コンポーネント４０２、４０８（実装によって異なる）を用いて、トレース再生コンポーネント４０６は、トレースを使用して元のプロセスの実行をエミュレートし、経時的にＣＰＵ状態およびメモリー・セルを監視する(viewing)ことを可能にする。このエミュレーションは、実施形態によっては、順方向または逆方向に進むことができる。
【０１１３】
[00131]  ４０８  再生コンポーネントのための再生アダプター。これは再生コンポーネントがリクエストを送ること、およびライブ・プロセスのデバッギング中にも使用されるレスポンスを受け取ることを可能にする。トレース・ファイル・デバッギングのシナリオでは、再生レイヤ（即ち、再生コンポーネントおよび再生アダプター）は、ライブ・プロセス・デバッギングのシナリオではランタイムが受け取り応答することができる、デバッガーからの主リクエストを受け取り、これらに応答する。更に、再生アダプターは、二次リクエストもトレース・ファイルに対して行う。
【０１１４】
[00132]  ４１０  再生アダプター・インターフェース。デバッガーとの通信のために構成される。
【０１１５】
[00133]  ４１４  再生アダプターからのトレースの二次リクエスト。「二次」とは、主リクエスト２１４の抽象化レベルよりも低いレベルの抽象化を示す。この二次リクエストは、機械レベルのリクエストであってもよく、トレース・ファイル・リーダーへの通信として実施することができ、または再生アダプター内において内部で（例えば、関数コールとして）実施することもできる。
【０１１６】
[00134]  ４１６  トレースから情報を求めた機械レベル・リクエストに対するレスポンス。第２レスポンスにおいてのようにではなく、二次リクエストの抽象化レベルでのレスポンスにおけるように、「二次レスポンス」とも呼ぶ。トレース・ファイル・リーダーからの通信として実施することができ、または再生アダプターにおいて内部で（例えば、関数の結果またはデーター構造の更新として）実施することもできる。
【０１１７】
[00135]  ４１８  実行トレース。図４における破線は、個々の項目を所与のトレースに含めてもよく、または省略してもよいことを示すが、ここでは、トレースが空ではないと仮定し、したがって、トレース・データー一般４５４のボックスを実線を示す。また、４１８はトレースを作成するアクティビティも指す場合もあり、これを「トレーシング」または「レコーディング」と呼ぶこともある。
【０１１８】
[00136]  ４２０  実行トレース・データーを収容するトレース・ファイル。機械レベルのトレース・データー、即ち、ネーティブ・コードのレベルで実行アクティビティを記録するデーターを含むことができる。
【０１１９】
[00137]  ４２２  トレースにおけるビット精度のトレース・データー。
【０１２０】
[00138]  ４２４  トレースにおいて、トレース対象コードの実行における特定の実行時点を特定するタイムコード。トレースの内側にある他のデーター、例えば、表示データー値(stated data value)を伴う表示メモリー・アドレス(stated memory address)における表示動作(stated operation)と関連付けられた実行時点を明示的に表示するトレース・データーにおける他のデーターにリンクされても、またはその中に埋め込まれてもよい。タイムコードは、例えば、クロック・ティックまたは命令カウンターとして実装されてもよい。あるトレースは、記録される動作毎に一意のタイムコードを収容することができるが、タイムコードは、あるトレース・データーにおいて繰り返されてもまたは省略されてもよい。
【０１２１】
[00139]  ４２８  トレーシングが実行されなかった実行時点を明示的または暗示的に示すための、トレースにおけるタイムコード内のギャップ（例えば、スレッドまたは処理ユニットに対してトレーシングが不能に(disabled)された範囲）。これは、隣接するタイムコードがデフォルトまたは指定の刻み（通常では１）よりも多く異なる任意のギャップを含むことができる。例えば、タイムコード・シーケンス２、３、４、３００、３０１、３０２は、４および３００の間のギャップを有し、タイムコード・シーケンス２５０、５００、７５０、１０００、２０００、２２５０、２５００は、１０００および２０００の間のギャップを有する。
【０１２２】
[00140]  ４３０  トレース・ファイル、例えば、トレース属性を素早く識別するための逆参照データー構造、メモリー寿命索引付け情報(indexing information)、および特に関心があると考えられるトレース・データーにおける位置の他の検索可能なリストにおけるデーターへのインデックス。
【０１２３】
[00141]  ４３２  トレース・データーにおけるキー・フレーム。例えば、再生が、キー・フレームにおける（またはその付近の）トレースの再生に、より素早くジャンプすることを可能にするために、トレース・データーにおいて規則的な間隔で存在することができる。
【０１２４】
[00142]  ４３４  実行コード、例えば、デバッギーが実行しトレースされるに連れてプロセッサーによって実行されたデバッギーの機械レベル・コードのオペコードおよび引数。
【０１２５】
[00143]  ４３６  デバッギーが実行しトレースされるに連れて発生したスタック・アクティビティ、例えば、スタック成長、スタック収縮、およびこのアクティビティが発生した実行時点。
【０１２６】
[00144]  ４３８  データー・ストリーム。個々のスレッドまたは１組のスレッドに対応することができ、プロセッサー・ユニット（例えば、プロセッサー・コア）に対応することができ、所与のプロセッサー・ソケットにおける全てのコアに対応することができ、再生を補助するためにメタデーターによって注釈を付けることができる。
【０１２７】
[00145]  ４４０  デバッギーが実行しトレースされていくに連れて発生したプロセッサー・コア・アクティビティ。例えば、コアによって実行された命令のオペコードおよび引数。
【０１２８】
[00146]  ４４２  デバッギーが実行しトレースされていくに連れて発生したプロセッサー・ソケット・アクティビティ。例えば、所与のプロセッサー・ソケットに位置する任意のコアによって実行された命令のオペコードおよび引数。
【０１２９】
[00147]  ４４４  デバッギーが実行しトレースされていくに連れて発生したスレッド・アクティビティ。例えば、スレッドが実行していた間に実行された命令、スレッドが実行していた間に行われたメモリー・セル・アクセス、スレッドＩＤおよびタイムコードのような、関連メタデーター。
【０１３０】
[00148]  ４４６  デバッギーが実行しトレースされていくに連れて発生したレジスター・アクティビティ。例えば、どのタイムコードにおいてどのレジスターから何の値が読み取られたか、どのタイムコードにおいて何の値がどのレジスターに書き込まれたか。
【０１３１】
[00149]  ４４８  メモリー・アドレス
【０１３２】
[00150]  ４５０  命令オペコード
【０１３３】
[00151]  ４５２  データー値
【０１３４】
[00152]  ４５４  トレース・データー一般
【０１３５】
[00153]  ４５６  タプル、即ち、トレースされる実行中における同じ動作を表すものとして、トレースにおいて関連付けられるトレース・データーの２つ以上の項目。例えば、メモリー読み取り動作またはメモリー書き込み動作は、オペコード（例えば、読み取りまたは書き込み）、アドレス（例えば、ＲＡＭアドレスまたはレジスターＩＤ）、および読み取られたデーター値または書き込まれたデーター値を収容する、またそうでなければ一緒に関連付けるタプルとして、トレースにおける１本のライン上に、記録することができる。
【０１３６】
[00154]  ４５８  トレース・エントリー
【０１３７】
[00155]  ５０２  メモリー・セル、例えば、ＲＡＭまたはＲＯＭ内におけるバイトもしくはワード、プロセッサー・レジスター、キャッシュ・ライン、あるいは他のアドレス可能なメモリー単位。
【０１３８】
[00156]  ５０４  スタック。例えば、ルーチンに入ったときに状態情報がプッシュされ、次いで制御がルーチンから、そのルーチンをコールしたコードに戻るときにポップされるメモリーの部分。ヒープ・メモリーとは区別されることが多い。
【０１３９】
[00157]  ５０６  メモリーの隣接片にスタックが割り当てられる開始点を定めるスタック・ベース・アドレス。スタックは、システムにおけるスタック・メモリーの割り当てによって、既知の方向に成長すると仮定する。この方向は、所与のシステムでは上方向（即ち、項目がスタック上にプッシュされるに連れて、アドレスが増大する）でよいが、他のシステムでは下方向（即ち、項目がスタック上にプッシュされるに連れてアドレスが減少する）であってもよい。「成長方向」(growthward)という用語は、本明細書では、当該システム上におけるスタックの成長方向を意味し、「収縮方向」(shrinkward)はその逆の方向を意味する。
【０１４０】
[00158]  ５０８  スタック・フレーム、別名、割り当て記録。これは、ルーチンがコールされるときに、スタック上に割り当てられる。通例、コードにおいて、ルーチンが戻るときに実行を再開する位置を特定するリターン・アドレスを収容する。また、ルーチンがコールされるときに、ルーチンにパラメータとして渡される値、またはこのようなパラメータ値のアドレスも保持することができる。
【０１４１】
[00159]  ５１０  オブジェクトが構築および解放されるときに、割り当てられそして割り当て解消されるヒープ・メモリー。場合によっては、ヒープが自動ガベージ・コレクションの対象になることもある。自動ガベージ・コレクションは、プロセスのライブ実行の間にはもはや到達できないオブジェクトを保持する、利用可能なメモリーを特定し、印を付ける。別の場合では、ヒープから割り当てられるメモリーは、割り当てられたメモリーを解放するためには、別個の明示的なコールを必要とする。
【０１４２】
[00160]  ５１２  オブジェクト
【０１４３】
[00161]  ５１４  キャッシュ・メモリー。例えば、ＲＡＭの作業メモリー内にあってもよく、またはプロセッサー・チップ上に実装されてもよい。
【０１４４】
[00162]  ５１６  プロセッサー・コア内のレジスター
【０１４５】
[00163]  ５１８  オブジェクトのプロパティ。オブジェクトの構成要素である名称付きの値。関数でもよい。その場合、プロパティはメソッドと呼ばれることが多い。また、オブジェクトのプロパティを実装する関数を引用する。
【０１４６】
[00164]  ５２０  ＲＯＭ（リード・オンリー・メモリー）。通例、不揮発性である。
【０１４７】
[00165]  ５２２  リムーバブル・フラッシュ・メモリー、磁気または光ディスク・ストレージ、テープ・ストレージ等のような、ボード実装ＲＯＭ以外の不揮発性メモリー。
【０１４８】
[00166]  ５２４  ＲＡＭ（ランダム・アクセス・メモリー）。通例揮発性である。
【０１４９】
[00167]  ５２６  ローカル・メモリー、例えば、ルーチンの実行中はそのルーチンにローカルであり、次いで解放されるというように、述べられたまたは暗示されたコンテキストにローカルなメモリー、またはスレッドにローカルなメモリー。
【０１５０】
[00168]  ５２８  グローバル・メモリー。例えば、１組の複数のルーチンの内任意のものの実行中にこれらのルーチンに対してグローバルな、というように、述べられたまたは暗示されたコンテキストに対してグローバルなメモリー、または１組のスレッドに対してグローバルなメモリー。
【０１５１】
[00169]  ５３０  スレッドの外部にあるエンティティがメモリー・セルに格納されている値を変化させる可能性(likelihood)を上げるまたは下げるメモリーの特性。例えば、メモリー・セルが他のスレッドに関して書き込み保護されているか否か、複数のスレッドに対してグローバルであるメモリーのような、共有メモリー内にあるか否か。
【０１５２】
[00170]  ６０２  メモリー・セルの指定(specification)。例えば、ＲＯＭまたはＲＡＭまたはキャッシュにおけるアドレス、レジスターＩＤ、そのメモリー・セルへのアクセスを許可するために（読み取りまたは書き込み、あるいは読み取りまたは書き込みに対する正当な試行）他のメモリー・セルからそれを区別することによって、メモリー・セルを指定する他の項目。複数のメモリー・セルを、例えば、ある範囲のアドレスとして指定することもできる。
【０１５３】
[00171]  ６０４  レジスターＩＤ。例えば、レジスター名、またはレジスターのアレイへのインデックス。
【０１５４】
[00172]  ６０６  アドレス範囲。即ち、対応する１組の連続メモリー・セルを識別する１組の隣接するアドレス。一例として、１対のアドレス（高アドレスおよび低アドレス）として範囲を指定することができる。他の例として、ベース・アドレス、およびこのベース・アドレスに基づく連続セルのカウントとして、範囲を指定することもできる。
【０１５５】
[00173]  ６０８  例えば、特定のタイムコードまたはタイムコードの範囲としての１つ以上の実行時点の指定。１対のタイムコード（開始タイムコードおよび終了タイムコード）として範囲を指定することができ、またはベース・タイムコード、およびクロック・ティックの数または命令の数というような、タイムコード刻みのカウントとして、範囲を指定することもできる。
【０１５６】
[00174]  ６１０  タイムコードとして使用可能な命令カウント。プロセスが実行を開始したときからの絶対カウント、またはスレッドが実行を再開したときからというような、相対カウントでもよい。
【０１５７】
[00175]  ６１２  例えば、ミリ秒単位またはＣＰＵサイクル単位のシステム・クロック値。
【０１５８】
[00176]  ６１４  実行時間範囲指定。即ち、実行時点の範囲を指定するデーター。例えば、１対のタイムコード（開始および終了）として、またはベース・タイムコード、およびこのベース・タイムコードに基づくタイムコード刻みのカウントとして実施することができる。
【０１５９】
[00177]  ６１６  実行時点。
【０１６０】
[00178]  ６１８  実行制御動作、例えば、順方向ステップ、逆方向ステップオーバー、ｇｏｔｏ指定位置、設定またはクリア・ブレークポイント、およびその他。
【０１６１】
[00179]  ６２０  実行制御動作の識別子。動作をステップ毎に進めるためまたは連続的に進めるために、これは方向（即ち、順方向または逆方向。「逆」(reverse)および「後ろ向き」(backward)は、ここでは相互交換可能に使用される）を参照するまたは含む。更に、刻みサイズ（例えば、１ステップ、ルーチンをステップオーバーする、またはブレークポイントに遭遇するまで継続する）も参照するまたは含む。
【０１６２】
[00180]  ７０２  トレース・データーから導き出されたデーター値。
【０１６３】
[00181]  ７０４  トレース・データーにおいて特定の命令または実行時点を識別する命令ポインター。これは、再生実行が順方向または逆方向に移動する元の基準位置である。「逆方向」(backward)とは、実行時点が増々若くなる方向を意味し、「順方向」(forward)とは、実行時点が増々古くなる方向を意味する。
【０１６４】
[00182]  ７０６  リクエストの結果を示すステータス・コード。例えば、実行制御動作成功、実行制御動作開始（非同期制御に対して）、実行制御動作失敗を示す。
【０１６５】
[00183]  ８００  トレース再生実行制御システム。
【０１６６】
[00184]  ８０２  トレース対象プログラムのプロセス。１つ以上のスレッドを含むことができる。
【０１６７】
[00185]  ８０４  スレッド。
【０１６８】
[00186]  ８０６  実行制御動作のためのツールへのユーザーからのリクエスト。
【０１６９】
[00187]  ８０８  プログラム・メタデーターまたはツール・メタデーター。例えば、特に具体的に付番されていないが、にも拘わらず本明細書において論じられるデーター。
【０１７０】
[00188]  ８１０  ソース−中間マッピング。即ち、ソース・コードまたはソース・コード項目（１つまたは複数）とソース・コードまたはソース・コード項目（１つまたは複数）の１つ以上の中間表現との間のマッピング。マッピング８１０は、クロスレベル・マッピング４０４の例である。
【０１７１】
[00189]  ８１２  中間−ネーティブ・マッピング。即ち、１つ以上の中間表現とネーティブ命令または他のトレース・データーとの間のマッピング。マッピング８１２はクロスレベル・マッピング４０４の例である。
【０１７２】
[00190]  ８１４  トレースにおけるネーティブ命令１１６の記録。例えば、ビット精度トレース・データー４２２、実行されたコード４３４、タプル４５６、または他のトレース・データー４５４を含むことができる。
【０１７３】
[00191]  ８１６  ＪＩＴ（ジャストインタイム）コンパイラー。
【０１７４】
[00192]  ８１８  ルーチンに対するコールまたは他の呼び出し(invocation)。例えば、例外ハンドラーまたは割り込みハンドラーへの制御の移行。
【０１７５】
[00193]  ８２０  リターン・アドレス。即ち、コール８１８の後に実行が継続する実行時点または命令。
【０１７６】
[00194]  ８２２  ネーティブ命令のような、トレース・データーのグループ。これは特定のソース・コード・ステートメントＳまたはソース・コード式Ｅに対応する。例えば、これは、命令の実行の記録を含むことができ、これらの命令は全て、ソース・コード・ステートメントＳまたはソース・コード式Ｅをコンパイルすることによって生成されたのであり、ＳまたはＥに隣接するソース・コード・ステートメントおよびソース・コード式のコンパイルから生成されたのではない。
【０１７７】
[00195]  ８２４  グループ８２２のエッジ命令(edge instruction)。各グループは通常２つのエッジを有する − 命令が並べられる場合、一方のエッジはグループにおいて最も若い命令となり、他方のエッジはグループにおいて最も古い命令となる。グループの全ての命令が互いに関係付けて並べられるか否かには関係なく、トレースにおける命令グループＧの中の命令Ｘは、Ｘが以下の条件の内少なくとも１つを満たすとき、Ｇのエッジとなる。Ｘが、トレースの順方向実行の間に遭遇したＧの最初の命令である（「最初の順方向エッジ」）、Ｘが、トレースの順方向実行の間に遭遇したＧの最後の命令である（「最後の順方向エッジ）、Ｘが、トレースの逆方向実行の間に遭遇したＧの最初の命令である（「最初の逆方向エッジ」）、またはＸが、トレースの逆方向実行の間に遭遇したＧの最後の命令である（「最後の逆方向エッジ」）。
【０１７８】
[00196]  ８２６  中間表現。例えば、中間言語コードのような低レベル・コード、または抽象構文ツリー、またはシンボル表。
【０１７９】
[00197]  ８２８  ブレークポイント。
【０１８０】
[00198]  ８３０  ブレークポイント範囲。
【０１８１】
[00199]  ９０２  順方向ステップ動作、別名「順方向ステップ」または「ステップ」（デフォルトの場合、または唯一の方向が順方向である場合）。ソース・コード・ステートメントを１つずつ進めるステップ実行を意味する。
【０１８２】
[00200]  ９０４  順方向ステップイン動作、別名、「順方向ステップイン」またはステップイン」（デフォルトの場合、または唯一の方向が順方向である場合）。実行する次のステートメントが、ルーチン本体の最初のステートメントとなるように、順方向にルーチン内に入るステップ実行を意味する。
【０１８３】
[00201]  ９０６  順方向ステップオーバー動作、別名、「順方向ステップオーバー」または「ステップオーバー」（デフォルトの場合、または唯一の方向が順方向である場合）。実行する次のステートメントが、ルーチンに対するコール後の最初のステートメントになるように、順方向にルーチンに入りルーチンを抜けるステップ実行を意味する。
【０１８４】
[00202]  ９０８  順方向ステップアウト動作、別名、「順方向ステップアウト」または「ステップアウト」（デフォルトの場合、または唯一の方向が順方向である場合）。実行する次のステートメントが、ルーチンに対するコール後の最初のステートメントになるように、順方向に現在のルーチンの残りを抜けるステップ実行を意味する。
【０１８５】
[00203]  ９１０  順方向継続動作、別名、「継続」、あるいはデフォルトの場合または唯一の方向が順方向である場合、「実行」(run)。ブレークポイントに遭遇するまでまたはプロセスが終了するまで順方向に実行を継続することを意味する。
【０１８６】
[00204]  ９１２  逆方向ステップ動作、別名、「逆方向ステップ」。ソース・コード・ステートメントを１つずつ戻るステップ実行を意味する。
【０１８７】
[00205]  ９１４  逆方向ステップイン動作、別名、「逆方向ステップイン」。逆方向に実行する次のステートメントがルーチン本体の最後のステートメントとなるように、逆方向にルーチンに入るステップ実行を意味する。
【０１８８】
[00206]  ９１６  逆方向ステップオーバー動作、別名、「逆方向ステップオーバー」。逆方向に次に実行するステートメントが、ルーチンに対するコール前の最初のステートメントになるように、逆方向にルーチンに入りルーチンを抜けるステップ実行を意味する。
【０１８９】
[00207]  ９１８  逆方向ステップアウト動作、別名、「逆方向ステップアウト」。逆方向に実行する次のステートメントがルーチンに対するコール前の最初のステートメントになるように、逆方向に現在のルーチンの残りを抜けるステップ実行を意味する。
【０１９０】
[00208]  ９２０  逆方向継続動作、別名、「逆方向継続」または「逆方向実行」(run backward)または「逆に実行」(run in reverse)。ブレークポイントに遭遇するまでまたはプロセスの先頭に到達するまで、逆方向に実行を継続することを意味する。
【０１９１】
[00209]  ある実装では、例えば、もっと多くの命令またはもっと少ない命令を実行することによって、あるいは異なる名称を使用することによって、動作９０２〜９２０について異なる定義を使用する場合もある。
【０１９２】
[00210]  ９２２  ブレークポイント範囲設定。即ち、複数のアドレスまたは実行時点の指定範囲における任意のアドレスまたは実行時点に遭遇したとき、実行はブレークポイントで停止すべきことを指定する。
【０１９３】
[00211]  ９２４  ブレークポイント設定。
【０１９４】
[00212]  １００４  スレッドＩＤ。
【０１９５】
[00213]  １００６  スレッド・ステータス。例えば、作成、実行可能、実行中、保留、阻止、終了。
【０１９６】
[00214]  １００８  スレッド・コード、即ち、スレッドが実行するときに実行したコードまたは実行することができるコード。
【０１９７】
[00215]  １０１０  スレッド・メモリー。たとえば、スレッドにローカルなメモリー、またはスレッドに対してグローバルであり、スレッドが実行するときに、スレッドによってアクセスされるメモリー。
【０１９８】
[00216]  １１０２  シンボル表。
【０１９９】
[00217]  １１０４  ソース・コードにおいて使用される識別子。
【０２００】
[00218]  １１０６  データー型。
【０２０１】
[00219]  １１０８  抽象データー・ツリー。
【０２０２】
[00220]  １１１０  中間言語、例えば、Ｍｉｃｒｏｓｏｆｔ共通中間言語、Ｊａｖａ（登録商標）バイトコード（Ｏｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎの商標）、レジスター転送言語、Ｐａｒｒｏｔ中間表現、標準的移植可能中間表現(Standard Portable Intermediate Representation)、ＬＬＶＭ（登録商標）ＩＲ中間言語（ＬＬＶＭ  Ｆｏｕｎｄａｔｉｏｎ  Ｃｏｒｐｏｒａｔｉｏｎの商標）、およびその他。
【０２０３】
[00221]  １１１２  中間言語で書かれたコード。
【０２０４】
[00222]  １３００  トレース再生実行制御方法の例、および前記方法を示すフローチャート。
【０２０５】
[00223]  １３０２  プログラムを識別する。
【０２０６】
[00224]  １３０４  実行制御リクエストを受ける。
【０２０７】
[00225]  １３０６  ソース・コードと中間表現との間でマップを使用する。
【０２０８】
[00226]  １３０８  中間表現とトレースとの間でマップを使用する。
【０２０９】
[00227]  １３１０  例えば、順方向または逆方向に実行する、あるいはパラメータ（方向、刻み）をこのような実行に設定することによって、再生を制御する。
【０２１０】
[00228]  １３１２  例えば、エミュレーションによって、またはトレースにおいて指定された動作をネーティブ命令（必ずしも全てがトレース内になくてもよい）の再生の制御に変換することによって、再生中にトレースされた命令を実行する。
【０２１１】
[00229]  １３１４  ブレークポイントまたはブレークポイント範囲を設定する。９２２または９２４あるいは双方を含む。
【０２１２】
[00230]  １３１６  実行制御リクエストに対するレスポンスを送る。
【０２１３】
[00231]  １３１８  例えば、ブレークポイント停止の前のグループのエッジまで実行することによって、トレースされた命令のグループをソース・コード・ステートメントまたは式と整列させる。
【０２１４】
[00232]  １４００  フローチャート。
【０２１５】
[00233]  １４０２  逆方向ステップアウト・リクエストを、そのようなものとして識別する。
【０２１６】
[00234]  １４０４  指定された位置の直前の実行位置においてブレークポイントを設定する。位置Ａがトレースにおいて位置Ｂの「直前にある」のは、トレースの順方向実行中にＢに先だってＡに遭遇し、ＡとＢとの間に多くとも５つのトレース・ネーティブ・コード命令しかないときである。
【０２１７】
[00235]  １４０６  特定のソース・コード・ステートメットまたは式に対応する命令のグループのエッジにおいて、ブレークポイントを設定する。
【０２１８】
[00236]  １４０８  動的にコンパイルされた（「ＪＩＴ」された）(jitted)コードを受け取るために指定されたアドレスの範囲を包含する（そして、ある実装では、一致する）ブレークポイント範囲を設定する。
【０２１９】
[00237]  １４１０  指定されたランタイム・ルーチンをステップオーバーするために、ブレークポイントを設定する。
【０２２０】
[00238]  １４１２  元の実行または再生実行の間に命令に遭遇する。
【０２２１】
[00239]  １４１４  同時に監視されるブレークポイントの最大数ｐｆに対するハードウェア制約を超える。
【０２２２】
[00240]  １４１６  プログラムを終了するのを回避する。
【０２２３】
[00241]  １４１８  プログラムを終了する。
【０２２４】
[00242]  １４２０  例えば、どのソース・コード・ステートメットまたは式を実行するかに関して、実行を指定することによって、高レベルで元の実行または再生実行を制御する。
【０２２５】
[00243]  １４２２  （元のまたは再生）プロセス、スレッド、またはプログラムを実行する。
【０２２６】
[00244]  １４２４  ソース・コード・ステートメットまたは式のユーザー選択を得る。
【０２２７】
[00245]  １４２６  ソース・コード・ステートメットまたは式のユーザーの選択。
【０２２８】
[00246]  １４２８  プロセス、スレッド、またはプログラムをデバッグする。
【０２２９】
[00247]  １４３０  プロセス、スレッド、またはプログラムを順方向に実行する。
【０２３０】
[00248]  １４３２  プロセス、スレッド、またはプログラムを逆方向に実行する。
【０２３１】
[00249]  １４３４  広いブレークポイント範囲を設定する。ブレークポイント範囲が「広い」のは、トレースにおいて少なくとも１０００の連続アドレスまたは命令を包含するときである。
【０２３２】
[00250]  １４３６  広いブレークポイント範囲。
【０２３３】
[00251]  １４３８  ライブ・プロセスからトレース・データーを記録する。
【０２３４】
[00252]  １４４０  トレースされた命令をグループ化する。即ち、グループ８２２を作成または指定する。
【０２３５】
[00253]  １４４２  ブレークポイントまたはブレークポイント範囲をクリアする。
【０２３６】
[00254]  動作環境
[00255]  図１を参照すると、実施形態の動作環境１００は、少なくとも１つのコンピューター・システム１０２を含む。コンピューター・システム１０２は、マルチプロセッサー・コンピューター・システムであっても、またはなくてもよい。動作環境は、所与のコンピューター・システム内に１つ以上の機械を含むことができ、これらはクラスター化されても、クライアント−サーバー関係でネットワーク接続されても、および／またはクラウド内においてピア・ツー・ピア接続されてもよい。個々の機械はコンピューター・システムであり、協働する機械のグループもコンピューター・システムである。所与のコンピューター・システム１０２が、例えば、アプリケーションを用いて、エンド・ユーザーのために構成されても、アドミニストレーターのためにサーバーとして構成されても、分散型処理ノードとして構成されても、および／または他の方法で構成されてもよい。
【０２３７】
[00256]  人間のユーザー１０４は、ディスプレイ、キーボード、およびその他の周辺機器１０６を使用することによって、タイプ入力されたテキスト、タッチ、音声、動き、コンピューター・ビジョン、ジェスチャ、および／またはＩ／Ｏの他の形態を通じて、コンピューター・システム１０２と対話処理することができる。画面１２６は、着脱可能な周辺機器１０６であってもよく、またはシステム１０２の統合部分であってもよい。ユーザー・インターフェースは、実施形態と１人以上の人間のユーザーとの間における対話処理を支援することができる。ユーザー・インターフェースは、コマンド・ライン・インターフェース、グラフィカル・ユーザー・インターフェース（ＧＵＩ）、自然ユーザー・インターフェース（ＮＵＩ）、音声コマンド・インターフェース、および／またはその他のユーザー・インターフェース（ＵＩ）表示を含んでもよく、これらは別個の選択肢として提示されてもよく、または統合されてもよい。
【０２３８】
[00257]  システム・アドミニストレーター、ネットワーク・アドミニストレーター、ソフトウェア開発者、技術者、およびエンド・ユーザーは、各々、特定の型のユーザー１０４である。１人以上の人間の代わりに動作する自動化エージェント、スクリプト、再生ソフトウェア等もユーザー１０４としてよい。記憶デバイスおよび／またはネットワーキング・デバイスは、それらのプロセッサー１１０から離脱可能性(detachability)に応じて、ある実施形態では周辺機材として見なされ、他の実施形態ではシステム１０２の一部と見なされることもある。図１に示されていない他のコンピューター・システムも、技術的な方法で、コンピューター・システム１０２と、または、例えば、ネットワーク・インターフェース機材を通じて、ネットワーク１０８への１つ以上の接続を使用して、他のシステムの実施形態と相互作用することができる。
【０２３９】
[00258]  各コンピューター・システム１０２は、少なくとも１つのプロセッサー１１０を含む。コンピューター・システム１０２は、他の適したシステムと同様に、１つ以上のコンピューター読み取り可能記憶媒体１１２も含む。媒体１１２は、異なる物理型のものであってもよい。媒体１１２は、揮発性メモリー、不揮発性メモリー、所定位置固定媒体(fixed in place media)、リムーバブル媒体、磁気媒体、光媒体、ソリッド・ステート媒体、および／または他の種類の物理耐久記憶媒体（単なる伝搬信号とは対立するものとして）であってもよい。具体的には、可搬型（即ち、外部）ハード・ドライブ、ＣＤ、ＤＶＤ、メモリー・スティック、または他のリムーバブル不揮発性メモリー媒体のような、構成媒体(configured medium)１１４は、挿入またそうでなければインストールされると、機能的にコンピューター・システムの技術的部分となり、そのコンテンツを、プロセッサー１１０との相互作用のためまたはプロセッサー１１０による使用のために、アクセス可能にすることができる。リムーバブルな構成媒体１１４は、コンピューター読み取り可能記憶媒体１１２の例である。コンピューター読み取り可能記憶媒体１１２のいくつかの他の例には、内蔵ＲＡＭ、ＲＯＭ、ハード・ディスク、およびユーザー１０４によって容易に除去できない他のメモリー記憶デバイスが含まれる。現行の米国特許要件に従って、コンピューター読み取り可能媒体も、コンピューター読み取り可能記憶媒体も、コンピューター読み取り可能メモリーも、米国において係属中または付与されたいずれの請求項の下においても、信号自体でも単なるエネルギーでもない。
【０２４０】
[00259]  媒体１１４には、プロセッサー１１０によって実行可能なバイナリー命令１１６が構成される。「実行可能」(executable)とは、例えば、機械コード、解釈可能なコード、バイトコード、および／または仮想機械上で実行するコードを含むように、本明細書では広い意味で使用される。また、媒体１１４には、命令１１６の実行による技術的効果のために、作成、修正、参照、および／またはそれ以外では使用されるデーター１１８が構成される。命令１１６およびデーター１１８は、これらが常駐するメモリーまたは他の記憶媒体１１４を構成する。このメモリーまたは他のコンピューター読み取り可能記憶媒体が所与のコンピューター・システムの機能部であるとき、命令１１６および１１８もこのコンピューター・システムを構成する。ある実施形態では、データー１１８の一部は、製品特性、在庫、物理測定値、設定値、画像、読み取り値、目標、分量等のような、実世界項目を表す。また、このようなデーターは、バックアップ、修復、コミット、中断、再フォーマット、および／またはその他の技術的処理(operation)によって変換される。
【０２４１】
[00260]  実施形態は、コンピューティング・デバイス（例えば、汎用コンピューター、サーバー、またはクラスター）において１つ以上のプロセッサーによって実行されるソフトウェア命令として実装されるというように説明される場合もあるが、このような説明は、可能な全ての実施形態を網羅することを意味するのではない。同じまたは同様の技術的効果を得るために、同じまたは同様の機能も、全体的または部分的に、直接ハードウェア・ロジックにおいて実装できる場合が多いことは、当業者には理解されよう。ソフトウェアの実装の代わりにまたはこれに加えて、本明細書において説明する技術的機能は、少なくとも部分的に、１つ以上のハードウェア・ロジック・コンポーネントによって実行することができる。例えば、実施形態は、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、特定用途集積回路（ＡＳＩＣ）、特定用途標準製品（ＡＳＳＰ）、システム・オン・チップ・コンポーネント（ＳＯＣ）、複合プログラマブル・ロジック・デバイス（ＣＰＬＤ）、および同様のコンポーネントというような、ハードウェア・ロジック・コンポーネント１１０、１２８を含んでもよく、更に そして他の実装も除外しない。実施形態のコンポーネントは、例えば、それらの入力、出力、および／またはそれらの技術的効果に基づいて、相互作用する機能モジュールにグループ化することもできる。
【０２４２】
[00261]  プロセッサー１１０（例えば、ＣＰＵ、ＡＬＵ、ＦＰＵ、および／またはＧＰＵ）、メモリー／記憶媒体１１２、およびディスプレイ１２６に加えて、動作環境は、実例をあげると、バッテリー、バス、電源、有線およびワイヤレス・ネットワーク・インターフェース・カードのような、他のハードウェア１２８も含むことができる。「画面」(screen)および「ディスプレイ」(display)という名詞は、本明細書では相互交換可能に使用される。ディスプレイ１２６は、１つ以上のタッチ・スクリーン、ペンまたはタブレットからの入力に応答する画面、または出力のためにのみ動作する画面を含むことができる。ある実施形態では、人間ユーザーＩ／Ｏデバイス（画面、キーボード、マウス、タブレット、マイクロフォン、スピーカー、動きセンサー等）のような周辺機器１０６は、１つ以上のプロセッサー１１０およびメモリーと動作可能に通信するように存在することもできる。ソフトウェア・プロセスがユーザー１０４になる場合もある。
【０２４３】
[00262]  ある実施形態では、このシステムは、ネットワーク１０８によって接続された複数のコンピューターを含む。ネットワーキング・インターフェース機材は、例えば、パケット交換ネットワーク・インターフェース・カード、ワイヤレス送受信機、または電話ネットワーク・インターフェースのようなコンポーネントを使用して、ネットワーク１０８へのアクセスを付与することができる。これらのコンポーネントは、所与のコンピューター・システム内に存在することができる。しかしながら、実施形態は、直接メモリー・アクセス、リムーバブルな不揮発性媒体、あるいは他の情報記憶検索および／または送信手法によって、技術的データーおよび／または技術的命令を伝達することもできる。
【０２４４】
[00263]  尚、以上の態様および「動作環境」の下で本明細書において紹介される他の態様が、所与の実施形態の一部を形成できることは、当業者には認められよう。この文書の見出しは、機能(features)を実施形態と実施形態以外の機能集合に厳格に分類することを意図するのではない。
【０２４５】
[00264]  １つ以上の項目が、図において、破線形態で示され、または括弧の中に掲示されているが、これらは必ずしも図示する動作環境の一部または全ての実施形態の一部ではないが、本明細書において論ずるように、動作環境またはいくつかの実施形態における項目と相互動作することができるということを強調するためである。だからと言って、破線形態でない項目や括弧がない項目が、いずれの図またはいずれの実施形態においても、必ず必要とされるという訳ではない。具体的には、図１は便宜上示されているのであり、図１に項目を含めることは、その項目、またはその項目の使用についての説明が、現在の技術改革の前に知られていたことを暗示するのではない。
【０２４６】
[00265]  デバッギング環境
[00266]  図２は、動作環境１００の例である、ライブ・プロセス・デバッギング環境を示す。デバッガー２００は、種々のコンポーネントを内蔵するが、多くは良く知られているので、ここでは全てを示してはいない。本明細書において教示されるような実行制御は、ライブ・プロセス・デバッギングが実現可能でなない、または少なくとも望ましくない環境において、主に使用することができる。しかしながら、ライブ・プロセス・デバッギングを示すのは、背景のため(for context)であると共に、本明細書における実行制御の教示を利用する、トレースに基づくデバッギングとライブ・プロセス・デバッギングを組み合わせることができるからである。
【０２４７】
[00267]  デバッガー２００は、従来からのデバッガーであってもよく、または本明細書において教示される通りに実行制御を実行するように適応化することもできる。図示するデバッガーは、データー・アクセス・コンポーネント２０８（ＤＡＣ）を含む。このライブ・デバッギング１４２８の環境では、ＤＡＣ２０８は、状態情報２０６を得るために、ランタイムに対する主リクエスト２１４、およびランタイムからの主レスポンス２１６を使用することによって、デバッギー・プロセス２０２のランタイム２０４と通信する。次いで、デバッガーは、しかるべくそのユーザー・インターフェース２１０を更新する。ユーザー・インターフェースは、比較的高いレベルで、例えば、ソース・コード２１２において定義されるアーチファクトに関して、状態情報を提示する。しかしながら、ＤＡＣ２０８または他のアダプターは、本明細書において教示される通りの実行制御のためには必要とされないことは、当業者には認められよう。
【０２４８】
[00268]  図３は、動作環境１００の他の例である、ダンプ・デバッギング環境を示す。デバッガー２００は、ダンプ・ファイル３０２またはスナップショット３０４、あるいは双方から、メモリー・コンテンツ、およびデバッギーの実行における特定の時点についての他の状態情報を読み取るために、そのデーター・アクセス・コンポーネント２０８または機能的に同様のコードを使用する。
【０２４９】
[00269]  図４は、動作環境１００の他の例である、トレースに基づくデバッギング環境を示す。図示するデバッガー２００は、多少このデバッガーが代わりにランタイムと相互作用するかのように、デバッガーがトレース４１８と相互作用することを可能にする技術的適応化によって動作するか、またはこの技術的適応化を含む（何故なら、デバッガーの範囲は、例えば、所与の開発者によって、再生アダプター４０８を含むように定められてもよいからである）。例えば、この例では、主リクエスト２１４および主レスポンス２１６に、図２のライブ・プロセス・デバッギング環境において使用したものと同じフォーマットを使用することができる。しかしながら、トレースに基づくデバッギング１４２８は、ランタイムを通じてアクセス可能な変数および他のメモリー・コンテンツが必ずしもトレースから読み取り可能でないということにおいて、ライブ・プロセス・デバッギングよりも、開発者に付与する柔軟性は低くなるおそれがある。また、周知のトレースに基づくデバッガーによる実行制御の粒度が、本明細書において与えられる教示を通じて得られる粒度よりも大きい場合もある。粒度が細かい程、デバッギング中における制御が改善され、バグの位置特定、およびバグの理解を高速化することができる。
【０２５０】
[00270]  トレースに基づくデバッギングは、適した実行制御４０２コード、再生コード４０６、およびトレース・データーとソース・コード２１２との間のマッピング４０４によって、トレースされた実行の逆再生という形態で、逆実行１４２２をサポートすることができる。ライブ・デバッギングでは、対照的に、デバッギーは通常では逆に実行しない。
【０２５１】
[00271]  図示する再生アダプター４０８は、デバッガーに対するインターフェース４１０を含む。この例では、インターフェース４１０は、ライブ・プロセス・デバッギング１４２８をサポートするために、ランタイム２０４によって従来のデバッガーに提示されるＡＰＩの少なくとも部分集合と一致するＡＰＩを、デバッガーに提示する。他の実装の手法も可能である。更に、図４における再生アダプター４０８の周りにある破線によって示すように、ある実装では、このデバッガーが、１つ以上のクロスレベル・マッピング４０４を利用するコードを含む適応デバッガー２００であるということから、再生アダプターの一部または全部がデバッガー２００の一部と見なされてもよい。実例をあげると、１つの変形では、外部メッセージを使用するのではなく、主リクエスト２１４および主レスポンス２１６ならびにインターフェース４１０を関数コールおよびリターン、ならびにデバッガー内のインターフェースとして実装する。ある変形では、デバッガーはクロスレベル・マッピング４０４を含みそして利用し、別個の再生アダプター４０８はない。デバッガーＤＡＣ２０８は、アドレス４４８を高レベルのオブジェクト５１２にマッピングするように作用することができる。デバッガー・クロスレベル・マッピング４０４およびそれらの関連コード（即ち、実行コントローラー４０２、再生コンポーネント４０６、および再生アダプター４０８の内１つ以上）は、ソース・コード・ステートメント２１８および式２２０あるいは双方を、ネーティブ命令の内特定のネーティブ命令４３４およびグループ８２２にマッピングするように作用することができる。ある実施形態では、ＤＡＣ２０８はランタイムの内部知識を有し、ダンプ・デバッギングと類似して、ＪＩＴネーティブ・コードが所与の１組のＩＬ命令に対してどこに位置付けられるか決定するために、ランタイム・データー構造を読み取ることができる。デバッギーが実行した機械アーキテクチャは、デバッガーが実行している機械とは大きく異なる可能性があるが、ＤＡＣは、ランタイムのデーター構造を読み取り、ハードウェア／ランタイムの相違を乗り越えるように設計することができる。
【０２５２】
[00272]  図４は、機械レベルのリクエスト４１４およびレスポンス４１６という形態で、再生コンポーネント４０６とトレース４１８との間における通信を示す。これは、１つの可能な実装であり、一例として、リクエストを受けそれに応答するために、トレース・リーダー（図示せず）を使用することができる。しかしながら、他の実装では、機械レベルのリクエスト４１４およびレスポンス４１６は、再生アダプター４０８内において関数コールの形態を取り、これらの関数コールは、トレース内で発見された情報をトレース４１８から読み取り、それらのコール元に戻す関数を含むので、再生コンポーネントは、トレース４１８におけるどの位置が現行の命令ポインター７０４によって特定されたかというような、現行の状態情報を維持することができる。
【０２５３】
[00273]  図示のように、トレース４１８を１つ以上のファイル４２０に格納することができ、トレース４１８は、種々の種類のトレース・データー、およびトレース・データーの検索を容易にするまたは制限する(delimit)メタデーターを含むことができる。トレース４１８の一部または全部がＲＡＭ内に常駐してもよい。トレース・データーのいくつかの例には、低レベル命令およびそれらのオペランド（「ネーティブ命令」とも呼ばれる）のコピーのようなビット精度トレース・データー４２２、トレース・データー項目を互いに並べるために使用することができるタイムコード４２４、メモリー・スナップショット３０４またはダンプ３０２、生トレース・データーへのインデックス４３０、指定された間隔で生トレース・データーに挿入されるキー・フレーム４３２、トレーシングの間にデバッギーによって実行された（１４２２）コード４３４のコピー、スタック・アクティビティ４３６、トレーシングの間にデバッギーによって読み取られたまたは書き込まれたデーター・ストリーム４３８、コア４４０毎またはソケット（複数のコア）４４２毎のプロセッサー・アクティビティ、トレーシングの間におけるスレッド・アクティビティ４４４、トレーシングの間におけるレジスターの読み取りおよび書き込み４４６、メモリー・アドレス４４８を命令４５０および１つ以上の値４５２と相関付け、更に随意にタイムコード４２４とも相関付けるタプル４５６、ならびにトレース内に捕捉された他の読み取りまたは書き込みまたは値またはオペコード４５４が含まれる。ある実施形態では、項目２１６、４２２、４３４、４３６、４３８、４４０、４４２、４４４、４４６、４５６の内任意のもののインスタンスが、トレース「エントリー」４５８に該当する。ある実施形態では、トレース・データー５４５の内、それ自体によってトレースされたプログラムの状態変化を表す任意の最小部分が、トレース「エントリー」４５８に該当する。また、トレースにおける特定のデーターの不在も、状態情報、例えば、タイムコードのシーケンスにおけるギャップ４２８と見なすことができる。
【０２５４】
[00274]  図５は、トレースすることができる、つまり本明細書における教示にしたがって、実行１４２２制御の下でネーティブ命令の実行による値または割り当てステータスの変化を受ける可能性がある、種々の種類のメモリー１１２を示す。図示するメモリー・セル５０２の例には、スタック５０４（それらのベース・アドレス５０６および割り当てられたスタック・フレーム５０８というようなデーターを含む）、オブジェクト５１２またはガベージ・コレクション・データーのようなメタデーターのようなヒープ・コンテンツ５１０、キャッシュ５１４、プロセッサー・レジスター５１６、プロパティ５１８のようなオブジェクト・メンバー、ＲＯＭ５２０またはＲＡＭ５２４におけるアドレス可能なセル、リムーバブルまたは第３層メモリー(third-tier memory)５２２、ローカル・メモリー５２６、およびグローバル・メモリー５２８が含まれる。メモリー・セルは、そのメモリー・セルのアクセス可能性を増加または減少させる１つ以上の特性５３０を有することができる。例えば、メモリーは、カーネル空間内にあってもよく、共有されてもよく、ＤＭＡの対象になってもよい等である。
【０２５５】
[00275]  図６は、機械レベル・リクエスト４１４のコンテンツを示す。注記したように、これらのリクエストは、通信データー構造を使用して実施することができ、またはルーチンのパラメータとして実施することもできる。機械レベル・リクエスト４１４におけるコンテンツのいくつかの例には、メモリー・セル指定６０２、および１つ以上の実行時点６１６の指定６０８がある。メモリー・セル５０２は、例えば、１つのアドレス４４８として、アドレスの範囲６０６として、またはレジスター名６０４として指定することができる。タイムコード４２４は、例えば、命令カウント６１０として、またはシステム・クロック値６１２として指定することができ、この指定は、１つの特定の実行時点６１６（トレーシング中のポイント、または特定のネーティブ命令）について、または実行時６１４の範囲（別名、トレーシング中における実行１４２２時の範囲または周期または間隔、あるいは連続するネーティブ命令のグループ）についてであってもよい。
【０２５６】
[00276]  図７は、機械レベル・リクエストに対するレスポンス(request response)４１６のコンテンツを示す。注記したように、これらのリクエストに対するレスポンスは、通信データー構造を使用して実施することができ、または関数戻り値またはルーチンの副作用として実施することもできる。機械レベル・リクエストに対するレスポンス４１６のコンテンツのいくつかの例には、対応するリクエスト４１４において指定された１つ以上のメモリー・セルに対する値７０２、どの命令が次に実行するか（またはどの命令が丁度実行１４２２を終了したか）を示す命令ポインター７０４、および、例えば、命令に関連付けられたフラグ、またはエラー、またはファイル終端のような条件を収容するステータス・コード７０６がある。各スレッドが、それぞれの命令ポインター７０４を有することもできる。
【０２５７】
[00277]  いくつかのトレース再生実行制御システム
[00278]  図８は、トレース再生実行制御システム８００を示し、その各々は、本明細書において付与される実行教示(execution teachings)によって構成されたシステム１０２である。実行制御システムがライブ・デバッギング環境において動作している場合、コール可能なランタイム２０４を有するデバッギー・プログラム１２４を含む(contain)。デバッギングを例として使用するが、実行制御は、例えば、実行分析(performance profiling)またはソフトウェア健全性監視のために、他のコンテキストでも本明細書において教示するように、実行することができる。デバッギーまたは他の再生されるプログラムは、１つ以上のプロセス８０２を含み、その各々が１つ以上のスレッド８０４を含むことができる。尚、「プロセス」および「スレッド」という用語は、様々な方法で使用され、例えば、ときには互いに同義語として、そして他の場合には全く異なる意味で使用されることは、当業者には理解されよう。いずれにしても、本明細書において付与される実行制御の教示を適用することができる。何故なら、プロセス８０２およびスレッド８０４は、「プロセス」および「スレッド」の意味に対するいずれの捉え方(approach)であっても、対応するソース・コード２１２および対応するトレース対象命令(traced instruction)４３４を有するからである。
【０２５８】
[00279]  再生実行がライブ・デバッギング環境で行われるか否かには関係なく、再生されるプログラムの状態情報は維持され、再生実行が「進む」に連れて更新される。この意味での進む(proceeding)は、順方向に実行すること、逆方向に実行すること、または双方を含む。状態情報には、例えば、トレース４１８における実行時点（１つまたは複数）を示す１つ以上の命令ポインター値、およびトレース４１８において捕捉された、トレース対象プログラムの変数値変化が含まれる。状態情報の存在を示すために、プロセス（１つまたは複数）８０２のボックスが、図８では、デバッギー・プログラム１２４のボックスの内側において、破線形状ではなく、実線形状で示されている。しかしながら、状態情報は、実行コントローラー４０２の内部に、またはシステム８００における１つ以上の他の場所にも維持できることは、当業者には認められよう。
【０２５９】
[00280]  実行コントローラー４０２は、それ自体が、プロセッサー１１０およびメモリー１１２を使用して実行されるソフトウェアを含む。トレース対象プログラム１２４は、ソース・コード２１２およびメタデーター８０８を有する別のソフトウェアである。実行コントローラー４０２は、ソース・コード２１２と、ソース・コードの中間表現８２６との間で、ソース−中間マッピング８１０を使用して、マッピングを行う。また、実行コントローラー４０２は、中間−ネーティブ・マッピング８１２を使用して、中間表現８２６と、トレースから少しずつ収集されたネーティブ命令の記録８１４を含む、トレース４１８との間でもマッピングを行う。これらのマッピング８１０、８１２を、ここでは、纏めて「クロスレベル・マッピング」(cross-level mapping)と呼ぶ。尚、所与の実施形態は１つ以上のクロスレベル・マッピング４０４を含んでもよいこと、例えば、ソース／中間および中間／ネーティブの機能を１つのソース−ネーティブ・マッピング４０４に統合してもよいことを注記しておく。
【０２６０】
[00281]  ある状況では、ソース−ＩＬマッピング８１０が、コンパイラーによって、例えば、．ＮＥＴ言語の場合に作成される。しかしながら、ソース言語を直接実行するランタイム２０４があり、これの一例にＪａｖａＳｃｒｉｐｔ（登録商標）（Ｏｒａｃｌｅ  Ａｍｅｒｉｃａ  Ｉｎｃ．の商標）がある。この場合、ランタイム自体が、言語を中間フォーマットにコンパイルし、同時にソース−ＩＬマッピングを作成する。．ＮＥＴ言語のような管理言語(managed language)の場合、高水準言語のコンパイラーがＩＬ−ネーティブ・マッピングを行うのではなく、代わりに、ランタイム２０４におけるＪＩＴコンパイラーが行う。ネーティブ・コードにコンパイルするコンパイラーも、ＩＬ−ネーティブ・マッピングは行わない。実際、このようなコンパイラーがＩＬの任意の形態を有する場合、おそらくそれはコンパイラーの実装詳細(implementation detail)である。ある実施形態では、実行制御は、ランタイムによって生成されたＩＬ−ネーティブ・マッピング８１２を利用する。
【０２６１】
[00282]  ある実装では、生成されたＩＬのために、トレースからネーティブ命令を得る。例えば、ある実装は、ＣＰＵをエミュレートすることによって動作し、ネーティブ命令を使用してトレースを再生する(play back)。場合によっては、ＩＬだけでは、ネーティブ命令を作り直すには十分な情報ではないこともある。場合によっては、ネーティブ命令自体が、ＩＬステッピングまたはＩＬブレークポイントを実装するには十分でないこともある。加えて、ネーティブ命令とＩＬ命令との間のマッピングが使用される。ある実施形態では、ネーティブ命令を知ることに頼らないトレース・リプレーヤー(trace replayer)を使用して、ＩＬコードのステップスルーをサポートするデバッガーを実装するために、ネーティブ命令に頼らない（トレース内に存在しない場合さえもあり得る）マッピングを使用する。このような実装は、マッピングにおいて提示される範囲にわたって、または指定された項目の任意の連続または不連続集合体(collection)にわたって、命令ポインターを追跡する。
【０２６２】
[00283]  クロスレベル・マッピングについての余談(aside)
[00284]  更にクロスレベル・マッピング４０４の実例を示すために、あるソース・コード２１２、中間表現８２６として役割を果たすある対応する中間言語コードの一部、およびいくつかのネーティブ命令の一部の以下の例について検討する。 ここでは、中間言語コードおよびネーティブ命令の一部分のみを示すが、これは特許文書におけるコンピューター・コードの包含についての特許庁の制約のためであり、更に、一部を示すことが、本明細書において提示される他の情報および当業者の知識に照らして、マッピング４０４を例示するのに十分であるからである。
【０２６３】
[00285]  元のＣ＃ソース・コード：
【表１】
2021523444.tif 000003
【０２６４】
[00286]  ソース−ＩＬマッピングの見本。この見本は、手作業によって生成された。実際の実装は、通常人間には読み取ることはできないであろう。即ち、ソース−ＩＬマッピングは、通常、テキスト・フォーマットではなく、バイナリー・フォーマットで実装される。しかしながら、以下の資料(material)は、当業者に対するソース−ＩＬマッピング機能の実例である。このマッピングは、１対１ではなく、ソース・ラインのいくつかの部分は、ＩＬコードにおいて異なる場所で終わる。１つのソース・プログラムに対して、多くの正しく生成されたＩＬ変換がある。
【０２６５】
【表２−１】
2021523444.tif 000004
【０２６６】
【表２−２】
2021523444.tif 000005
【０２６７】
【表２−３】
2021523444.tif 000006
【０２６８】
[00287]  ＩＬ−ネーティブ・マッピングの見本。ソース−ＩＬマッピングと同様、これも手作業で生成され、実装は、例えば、ランタイムにおけるデーター構造として存在する。１つの生成されたＩＬに対して、多くの正しく生成されたネーティブ・コード変換がある。プロセッサー特定最適化により、ＪＩＴコンパイラーが招いたかもしれない、複雑さ増大のため、そしてトレースを使用するプログラムのデバッギング１４２８が同じプロセッサー型において実行していない（即ち、異なる最適化が適用される）おそれがあるために、ＪＩＴをＩＬ上で単に実行することができず、トレース４１８の生成中に実行した場合と同じ結果を保証することができない。この例では、ＩＬは「ＩＬ＿」から開始し、ネーティブは、＜メモリー・アドレス＞＜ネーティブ・コードの１６進表現＞＜アセンブリー・ニモニック＞として表される。
【０２６９】
【表３−１】
2021523444.tif 000007
【０２７０】
【表３−２】
2021523444.tif 000008
【０２７１】
【表３−３】
2021523444.tif 000009
【０２７２】
[00288]  一般に、カーネル１２０が存在し、ランタイム２０４とカーネル１２０との間における混乱を防ぐのに役立てるために、図８にカーネル１２０を明示的に示す。本明細書において説明するようなクロスレベル・マッピングおよび実行制御は、トレース４１８を作成するために実行をトレースしたときに、全ての構成ではなくとも、殆どの構成にランタイムが存在することを仮定する。
【０２７３】
[00289]  システム８００および関連システムの追加の態様
[00290]  システム８００の実施形態の中には、トレース対象プログラム１２４のコードを動的にコンパイルするために、ＪＩＴコンパイラー８１６を含むものがある。実行制御のある態様は、ＪＩＴコンパイルによって、例えば、ブレークポイント範囲８３０をサポートすることによって、生じた課題に取り組む。これは、生成されたコードを含むアドレス範囲が分かっている限り、ブレークポイントの位置に及ぶネーティブ・コードがコンパイルによって未だ生成されていなくても、ブレークポイントを発見することを可能にする。ブレークポイント範囲８３０は、例えば、範囲６０６または６１４として指定することができ、一方個々のブレークポイント８２８は、トレース４１８における特定の１つの位置として指定される。
【０２７４】
[00291]  引き続き図８を参照すると、システム８００の実施形態の中には、コール８１８のリターン・アドレス８２０を含むものがある。これは、例えば、逆実行においてコール先ルーチンからステップアウトする、逆ステップアウト実行制御動作を実行するときに、使用することができる。
【０２７５】
[00292]  ある実施形態は、一方ではソース・コード・ステートメントまたは式と、他方ではそれらを実行するトレース対象命令との間で、一層精度を高めた対応付けを行うことによって、実行制御の精度を高める。ある周知のトレース手法は、例えば、所与のソース・コード・ステートメント２１８または式２２０に対応するトレース対象命令の中へのステップを再生するが、これは混乱を生ずる可能性がある。本明細書において説明する実施形態の中には、所与のソース・コード・ステートメント２１８または式２２０（を実装するためにコンパイルによって生成された）に対応するトレース対象命令のグループ８２２を肯定的に(affirmatively)定義するものがある。次いで、実行コントローラーは、以前に行われたように、中間のどこかの代わりに、グループ８２２のエッジ８２４における位置に、命令ポインターを設定する。どのエッジ８２４を選択するかは、実行が順方向または逆方向のどちらに再生しているかに応じればよい。例えば、順方向の再生では、最初の順方向エッジを選択し、逆方向の再生では、最初の逆方向エッジを選択するのでもよい。あるいは、再生の方向に関係なく、同じエッジを常に使用してもよい。例えば、命令ポインターを常に最初の順方向エッジに設定してもよい。
【０２７６】
[00293]  図９は、様々な実行制御動作６１８を示す。制御動作リクエスト８０６がデバッガー２００または他のツール１２２に、例えば、ユーザーによってデバッガー・インターフェース２１０を通じて提示される。実行コントローラー４０２は、制御動作リクエスト８０６をプロセス８０２の状態変化に変換する。図示する動作は、順方向ステップ９０２、順方向ステップイン９０４、順方向ステップオーバー９０６、順方向ステップアウト９０８、順方向継続９１０、逆方向ステップ９１２、逆方向ステップイン９１４、逆方向ステップオーバー９１６、逆方向ステップアウト９１８、逆方向継続９２０、ブレークポイント範囲設定９２２、ブレークポイント設定９２４を含む。これらの動作名称において、「順方向」は、順方向実行再生を示し、「逆方向」は逆方向実行再生を示す。
【０２７７】
[00294]  種々のステップ動作９０２〜９２０は、開発者の視点から、同様にまたは同一に命名された周知の動作と同様にまたは同一に動作するように、実施することができる。しかしながら、内部では、例えば、クロスレベル・マッピング４０４、命令グループ８２２、および特定のブレークポイント配置を使用して、ソース・コードをトレースに整列させる技術革新によって、これらを実装することができる。継続動作９１０、９２０も、開発者の視点から、周知の継続動作と同様にまたは同一に動作するように実装することができるが、内部では、これらはクロスレベル・マッピング４０４または命令グループ８２２、あるいは双方を利用する。ブレークポイント設定動作９２４も、開発者の視点から、開発者にとって周知の、ブレークポイントを設定する動作と同様にまたは同一に動作するように実装することができるが、内部では、クロスレベル・マッピング４０４または命令グループ８２２、あるいは双方を利用する。
【０２７８】
[00295]  図１０は、所与のトレース４１８において捕捉することができるスレッド８０４アクティビティ情報４４４を示す。図示されているのは、スレッド識別子１００４、スレッド・ステータス指示１００６、スレッドの実行可能コード１００８、ならびにスレッド・ローカル変数およびそれらの識別子のようなメモリー・セル５０２の状態情報１０１０である。
【０２７９】
[00296]  図１１は、中間表現８２６のいくつかの例を示す。図示する例には、シンボル表１１０２が含まれる。シンボル表１１０２は、ソース・コード識別子１１０４（変数名、関数名、オブジェクト・メンバー、およびメソッド名等）を、データー型１１０６（例えば、整数、浮動小数点、文字列、ブール、およびユーザー定義型）と相関付ける。他の例に、抽象構文ツリー１１０８がある。他の例には、１つ以上の中間言語１１１０で書かれたコード１１１２が含まれる。更に一般的には、ある実施形態は、構造を共有する、またはコンパイラーによって作成された中間表現のコピーである中間表現８２６でさえも使用する。しかしながら、中間表現８２６は、コンパイラーのコンテキストではなく、実行コントローラーのコンテキストに置かれる。また、中間表現８２６は、以前に生成されたコードの実行トレース４１８のトレース再生のために利用されるのであり、そもそもそのコードを生成するために利用されるのではない。
【０２８０】
[00297]  尚、多くの異なるバージョンの対応ＩＬを生成するために、潜在的に所与のソース・コード２１２を使用できることは、当業者には認められよう。しかしながら、これらのバージョンの内１つのみがプログラムにおいて使用され、コンパイラーによって発せられる(emit)シンボル情報が、発せられるＩＬに対応する。デバッガーは、１つのマッピングのみが存在するように、対応するシンボル情報のみをロードするように設計されてもよい。あるシステムでは、ランタイムが、所与のルーチンに対して複数のバージョンのネーティブ・コードを含むことがある。例えば、デバッギングのためのネーティブ・コードの最適化生産バージョンおよび最適でないバージョンの双方が存在することもあり、または多層(multi-tiered)ＪＩＴ機能が、複数のバージョンのネーティブ・コードをメモリー内に供給することもある。このような複数ネーティブ・バージョン・システムでも、再生を行うことができる。例えば、ブレークポイントを設定するとき、存在する全てのバージョンのネーティブ・コード内に設定することができる。ある実施形態は、ＩＬコードだけでなく、ＪＩＴによって生成されたネーティブ・コードも使用する。これらは、トレース４１８からまたはトレース４１８によって得られる。また、ある実施形態は、ソース／ＩＬマッピングについての対応するシンボル情報を使用する。これは、同じトレース・ファイル４２０に含まれても含まれなくてもよい。
【０２８１】
[00298]  図１２は、図２の変形である。図１２の環境では、ライブ・デバッギングおよび再生実行の双方をサポートする。再生は、ローリング・トレース(rolling trace)４１８によってサポートされ、デバッギーが、デバッガー２００によって促される通りに、実行する間、その最中にライブ・デバッギーの順方向実行を記録する。効率のために、例えば、１対のバッファーを使用して、最新の命令のみをトレースする。トレース４１８は、一方のバッファーに、それが満杯になるまで書き込まれ、次いで他方に、それが満杯になるまで書き込まれ、次いで最初のバッファーに戻って書き込まれる（前のトレースを上書きする）等となる。あるいは、ローリング・ウィンドウの代わりに、デバッギング１４２８セッション中における全ての実行アクティビティをトレースすることもできる。他の代案として、ライブ・デバッギング・セッション中に、以前に記録したトレース４１８にアクセスすることもできる。
【０２８２】
[00299]  いくつかの追加システムの例
[00300]  ここで、本技術の態様を例示するのに役立てるために、例を示すが、この文書内であげられる例は、可能な実施形態の全てを説明する訳ではない。実施形態は、本明細書において提示する特定の実装、配列、表示、特徴、手法、またはシナリオにも限定されない。所与の実施形態は、実例をあげると、追加のまたは異なる技術的特徴、メカニズム、シーケンス、またはデーター構造を含むこともでき、それ以外ではここで示す例から逸脱することもある。
【０２８３】
[00301]  図１および図２を参照すると、ある実施形態は、トレース再生実行制御システム８００を使用または提供する。このシステムは、プロセッサー１１０と、このプロセッサーと動作可能に通信するメモリー１１２と、ランタイム２０４およびカーネル１２０と併せたプログラム１２４の実行中に記録されるトレース４１８とを含む。トレースは、プログラムの少なくとも１つのスレッド８０４において実行されたネーティブ・コード命令１１６の記録８１４を含む。プログラムの少なくとも一部のソース・コード２１２も存在する。
【０２８４】
[00302]  また、システム８００は、ソース・コードとソース・コードの中間表現８２６との間でマッピングを行うソース−中間マッピング８１０と、中間表現８２６とトレース４１８との間でマッピングを行う中間−ネーティブ・マッピング８１２も含む。
【０２８５】
[00303]  また、システム８００は、ソフトウェア・ツール１２２内に実行コントローラー４０２も含む。実行コントローラーは、プロセッサーによる実行時に、リクエスト８０６に応答してトレース４１８の再生実行を制御するように構成される。再生実行において、ソース・コードがトレース・ネーティブ・コード命令または他のトレース・エントリーと、ソース−中間マッピングおよび中間−ネーティブ・マッピングによって、相関付けられる。
【０２８６】
[00304]  ある実施形態では、実行コントローラー４０２は、少なくとも以下の動作６１８を求めるリクエストを、トレース・ネーティブ・コード命令の対応する実行(performance)に変換するように構成される。順方向実行ステップイン９０４動作、順方向実行ステップアウト９０８動作、および順方向実行ステップオーバー９０６動作。
【０２８７】
[00305]  ある実施形態では、実行コントローラー４０２は、少なくとも以下の動作６１８を求めるリクエストを、トレース・ネーティブ・コード命令の対応する実行(performance)に変換するように構成される。逆方向実行ステップイン９１４動作、逆方向実行ステップアウト９１８動作、および逆方向実行ステップオーバー９１６動作。
【０２８８】
[00306]  ある実施形態では、実行コントローラー４０２は、少なくとも以下の動作６１８を求めるリクエストを、トレース・ネーティブ・コード命令の対応する実行(performance)に変換するように構成される。ブレークポイント範囲８３０における任意の位置に到達するまでトレース全体にわたる順方向継続実行９１０、およびブレークポイント範囲における位置に到達するまでトレース全体にわたる逆方向継続実行９２０。
【０２８９】
[00307]  ある実施形態では、システム８００は、ソース・コードの内、再生実行中には未だネーティブ・コード命令にコンパイルされなかった部分にステップイン(step into)ように構成される。
【０２９０】
[00308]  ある実施形態では、中間表現８２６は、以下の内少なくとも１つを含む。ソース・コードにおいて使用される少なくとも２つの識別子１１０４をデーター型１１０６と相関付けるシンボル表１１０２、ソース・コードの少なくとも一部から導き出される抽象構文ツリー１１０８、またはソース・コード２１２の少なくとも一部の中間言語１１１０への変換１１１２。
【０２９１】
[00309]  ある実施形態では、トレース４１８は、ランタイム２０４のいずれの実行インスタンスも含まず、システム８００は、ランタイムに特定的な任意のコードを実行するために、トレース内にコールする(call into)ように構成されていない。
【０２９２】
[00310]  ある実施形態では、システム８００は、 ランタイム２０４のコール可能なインスタンスを有するプログラム１２４のライブ・プロセス２０２を含む。ある実施形態では、トレース４１８はライブ・プロセスから記録され、システムはトレースの実行を再生するように構成される。
【０２９３】
[00311]  ある実施形態では、システム８００は、トレース４１８の一部の再生実行をスキップオーバーするように構成される。実行コントローラー４０２は、再生実行をトレースの第１実行時点からトレースの第２実行時点に移動させ、システムは、トレース対象ネーティブ・コード命令または他のトレース・エントリーの内、継続実行であれば第１位置から第２位置までに実行されたはずのものを実行しない。
【０２９４】
[00312]  尚、他のシステムも、本明細書において紹介する教示の範囲内に該当することは当業者には認められよう。具体的には、他のシステムがクロスレベル・マッピング４０４を実行し、ブレークポイント範囲８３０を使用し、本明細書において提示したが本明細書において記載した特定例から逸脱する他の教示を実施してもよい。本明細書において教示する実行制御の教示のいずれかを使用するシステムまたは装置は、これらが、提示される特定例内に入るか(among)否かには関係なく、本開示の範囲内に該当する。
【０２９５】
[00313]  いくつかの方法例
[00314]  図１３は、実行コントローラー４０２、クロスレベル・マッピング４０４、または本明細書において論じた他の品目によって実行または補助される方法の例である、実行制御方法１３００を示す。この方法例は、トレース対象マネージド・プログラム(traced managed program)をトレース対象マネージド・プログラムとして識別するステップ１３０２を含む。プログラムをトレース対象として識別するステップは単純である。プログラムがトレースされている場合、または既にトレースされた場合、これはトレース対象プログラムとなる。プログラムを管理対象として識別するステップの方が、いくらか複雑である。何故なら、プログラムが管理されるのは、それがライブ実行のためにランタイム２０４を頼りにするときであり、ランタイム２０４は様々なサービスを異なる実装において提供できるからである。多くの場合、ランタイム２０４は到達可能性分析または参照カウント、または他のメカニズムに基づくガベージ・コレクションによって、ヒープ・メモリーの自動管理を提供する。しかしながら、特許出願においてもっと興味があるのは、中間言語コード１１１２を実行するためのランタイム２０４の使用である。あるランタイムでは、ソースからネーティブ命令への変換は、ソース−中間言語フェーズ、およびそれに続く中間言語−ネーティブ・コード・フェーズにモジュール化されていない。例えば、あるＪａｖａＳｃｒｉｐｔ（登録商標）は、直接ソース・コードを実行する（Ｏｒａｃｌｅ Ａｍｅｒｉｃａ Ｉｎｃ．の商標）。この出願に限って言えば、「マネージド」プログラムとは、ネーティブ命令を生成するためにランタイム２０４に頼るプログラムである。また、マネージド・プログラムは、ランタイムによるガベージ・コレクションの対象になることがあり、またならないこともある。
【０２９６】
[00315]  また、図示する方法１３００は、何らかのトレース再生実行制御動作を求めるリクエストを受けるステップ１３０４も含む。リクエストは、ユーザー・インターフェースを通じてユーザーから直接受けるリクエスト８０６、またはデバッガーからトレース再生レイヤ・コンポーネント４０２、４０６、または４０８へのリクエスト２１４でもよい。
【０２９７】
[00316]  また、図示する方法１３００は、ソース・コードから中間表現にマッピングするステップ１３０６、および中間表現からネーティブ・コードにマッピングするステップ１３０８も含む。これは、示すように、２フェーズで行えばよく、また他の実施形態では、１つの組み合わせフェーズにおいて、ソース・コードからネーティブ命令にマッピングしてもよい。しかしながら、コンパイル自体とは異なり、マッピング１３０６、１３０８は、２フェーズかまたは１フェーズかには関係なく、実行のためのコードを生成するために行われるのではなく、代わりに、ソース・コード位置を、以前に生成および実行された命令のトレースにおける位置と相関付けるために行われる。
【０２９８】
[00317]  ある実装では、ハッシュ、チェックサム、またはソースに対応するＩＬの他の識別子を収容するシンボル・ファイルを使用することによって、ソース・コードから中間表現へのマッピングを行う（１３０６）。識別子が対応する場合、デバッガーはシンボル・ファイルをロードする。また、シンボル・ファイルは、ILをコンパイルするために使用されるあらゆるソース・ファイルの識別子も収容する。デバッガーがソース・ファイルをロードし、ＩＬコードをソースにマッピングする前に、シンボル・ファイルに収容されている識別子によって、ソース・ファイルの識別子を確認する。
【０２９９】
[00318]  ある実装では、ＩＬがＪＩＴされたときにランタイムによって生成されたマッピングを使用して、ＩＬからネーティブ・コードにマッピングを行う（１３０８）。ある実装では、ランタイムが、どのようにＪＩＴが行われるかについて下位互換性を必ずしも保持するとは限らず、したがっていずれの時点でも自由にＪＩＴプロセスに変更を加えることができる可能性がある。このような実装では、デバッガーが、ＪＩＴプロセスによって出力されたネーティブ・コードが何を含むかについて想定できない場合もある。したがって、デバッガーは、ランタイムに、ネーティブ・コードとＩＬとの間のマッピングを提供するように求めることができる。
【０３００】
[00319]  図示する方法１３００の変形には、ネーティブ命令のグループを、これらのネーティブ命令がコンパイルによって生成された元であるソース・コード・ステートメントまたは式と整列させるステップ１３１８を含むものもある。
【０３０１】
[00320]  図示する方法１３００は、再生を制御するステップ１３１０、別名、「実行制御」を行うステップを含む。制御１３１０の一例は、ステップ、ステップイン、ステップオーバー、ステップアウト、または継続動作に対応するネーティブ命令または他のトレース・エントリーを実行し、これによってプロセス８０２の状態を変化させるステップ１３１２である。制御１３１０の他の例は、個々のブレークポイントまたはブレークポイント範囲を設定するステップ１３１４である。尚、ステップ、ステップイン、ステップオーバー、またはステップアウト動作を実行するステップは、ブレークポイントを設定することを伴うが、例えば、継続動作に備えて、ネーティブ命令または他のトレース・エントリーを実行せずに、ブレークポイントを設定することも可能であることは、当業者には認められよう。ある実施形態では、トレース内にブレークポイントを設定するために、コード自体は変更されない。尚、プロセッサーは、命令（例えば、あるＩｎｔｅｌアーキテクチャではｉｎｔ３）によって、またはハードウェア・ブレークポイント（監視すべきアドレスを指示するレジスター）によって、実行ブレークポイントを設定できることは、当業者には認められよう。ある実施形態では、再生エンジン８００が同様の能力を備える。ある実装では、コード・ストリームを変更せず、任意の多数のブレークポイントをサポートする。
【０３０２】
[00321]  最後に、図示する方法１３００は、リクエストに対して、レスポンス４１６、または他のメッセージ、あるいは命令ポインター７０４またはステータス・コード７０６を含むデーター構造のようなレスポンスを送るステップ１３１６を含む。
【０３０３】
[00322]  図１４は、ある実施形態では実行してもよいいくつかの追加の実行制御ステップを示す。周知のデバッガーには、逆方向ステップアウト動作９１８をサポートしないものがある。しかしながら、ある実施形態は、逆方向ステップアウト動作９１８を求めるリクエストを識別し（１４０２）、この動作を、本明細書において教示するように実施する。
【０３０４】
[00323]  デバッガーは、いくつかの一般に周知のブレークポイントポイント動作、即ち、ブレークポイントを設定する動作１３１４を実施することができる。しかしながら、ある実施形態は、指定された位置の直前に、ブレークポイントを設定する（１３１４、１４０４）。ある実施形態は、命令グループのエッジ８２４においてブレークポイントを設定する（１３１４、１４０６）。ある実施形態は、例えば、ＪＩＴされたコード（ＪＩＴコンパイラーによって生成されたコード）を受け取るように設計されたアドレスの範囲にわたって、ブレークポイント範囲８３０を設定する（１３１４、１４０８）。具体的には、ある実施形態は、広いブレークポイント範囲１４３６、８３０を設定する（１４３４、１３１４、１４０８）。ある実施形態は、開発者にとって殆ど関心がなさそうなランタイム・ルーチンをステップオーバーするためのステップオーバー動作を実施する一部として、ブレークポイントを設定する（１３１４、１４１０）。このようなランタイム・ルーチンは、例えば、ガベージ・コレクション、ＪＩＴコンパイル、マルウェア対策または他のセキュリティ・チェック、あるいはランタイム２０４のハウスキーピング機能を実行することができる。図１４に示す他のステップについては、本明細書のいずれかの場所で論じられ、または完全さのために含まれる。例えば、ブレークポイントは、設定するだけでなく、クリアされても（１４４２）よい。
【０３０５】
[00324]  図に示す技術的方法またそうでなければ開示する技術的方法は、特に断わりのない限り、自動的に、例えば、システム８００によって実行される。また、方法は、人間のアドミニストレーターまたは他の人間がアクションに関与する範囲で、一部自動的に、そして一部手動で実行することもできる。例えば、人がソース・コード・ステートメントまたは式を選択し（１４２６）、次いでツール１２２のユーザー・インターフェースを使用して、ステップ動作またはブレークポイント動作を要求することができる。しかし、完全に手動のものは、本明細書において技術革新として考えられる方法ではない。所与の実施形態では、方法の０個以上の図示したステップが、おそらくは、異なるパラメータまたはデーターを処理するために、繰り返されることもある。実施形態におけるステップは、図に示す順序とは異なる順序で行うこともできる。ステップは、直列に、部分的に重複して、または完全に並行に実行される場合もある。所与の方法においてステップが実行される順序は、方法の実行毎に異なってもよい。また、実行される方法が動作可能であり少なくとも１つの請求項に従うのであれば、ステップを省略する、組み合わせる、改名する、グループ化し直す、またはそれ以外で図示するフローから逸脱してもよい。
【０３０６】
[00325]  ある実施形態は、トレース再生実行制御方法のために、コンピューター実装方法を使用または提供する。１つの方法例は、トレース対象マネージド・プログラム(traced managed program)、即ち、ランタイムへのコールと併せて実行するように構成され、更にトレースされるように構成されたプログラムを識別するステップ１３０２を含む。また、この例は、コンピューティング・システム上で実行するソフトウェア・ツールにおいてトレース再生実行制御リクエストを受けるステップ１３０４も含む。トレース再生実行制御リクエストに基づいて、この方法例は、トレース対象マネージド・プログラムのソース・コードと、ソース・コードの中間表現との間で自動的にマッピングを行い（１３０６）、中間表現とトレース４１８との間で自動的にマッピングを行う（１３０８）。トレースは、トレース対象マネージド・プログラムが実行したときにトレースされたネーティブ・コード命令の記録を含む。トレース４１８は、ランタイムの実行インスタンスを全く含まない。また、この方法例は、トレース再生実行制御リクエストに対応するネーティブ・コード命令をトレースし（１３１２）、これによってトレースの一部を再生する。
【０３０７】
[00326]  ある実施形態では、トレース再生実行制御リクエストは、ルーチンからステップアウトするために、逆方向実行ステップアウト動作を識別し（１４０２）、この方法は、ルーチンへのコールのリターン・アドレスの位置の直前にある位置を有するトレース・ネーティブ・コード命令上にブレークポイントを設定するステップ１３１４、１４０４を含む。この方法に限って言えば、位置Ａがトレースにおける位置Ｂの「直前に位置する」のは、トレースの順方向実行中にＢよりも前にＡに遭遇し（１４１２）、ＡとＢとの間には多くとも５つのトレース・ネーティブ・コード命令しかないときである。この方法に限って言えば、ソース・レベルのデバッギングを実行するとき、整列１３１８は、命令グループのエッジ８２４を、最後に実行されたソース・ファイルのラインの番号、ステートメント、または現在の関数の呼び出しの前に実行された式と相関付けることができる。ある実施形態は、ルーチンのコール位置(call site)にブレークポイントを設定する。例えば、ある実施形態は、現在の関数のコール位置にブレークポイントを設定する。
【０３０８】
[00327]  一般に、ソース・コードはステートメント２１８と式２２０とを含む。ある実施形態では、この方法は、ソース・コードにおける所与のステートメントまたは所与の式にこの方法によってマッピングされた全てのトレース・ネーティブ・コード命令から成るグループ８２２のエッジ８２４上にあるトレース・ネーティブ・コード命令１１６上にブレークポイントを設定するステップ１４０６、１３１４を含む。ある実装では、このグループは、単に、全てのトレース・ネーティブ・コード命令を含み、更に他の命令も含むことができる。
【０３０９】
[00328]  ある実施形態では、受け取られたトレース再生実行制御リクエスト８０６、２１４、４１４は、以下の内の１つにしたがって、再生実行に名称を付ける、識別する、またそうでなければ要求する。順方向にルーチンをステップオーバーする順方向実行ステップオーバー９０６動作、逆方向にルーチンをステップオーバーする逆方向実行ステップオーバー９１６動作、順方向にルーチンにステップインする順方向実行ステップイン９０４動作、または逆方向にルーチンにステップインする逆方向実行ステップイン９１４動作。
【０３１０】
[00329]  ある状況では、受け取られたトレース再生実行制御リクエスト８０６、２１４、４１４は、ユーザー・コード・ルーチンにステップインする順方向実行ステップイン９０４動作にしたがって、再生実行に名称を付ける、再生実行を識別する、またそうでなければ再生実行を要求し、ユーザー・コード・ルーチンの再生実行は、ランタイム２０４ルーチンへの少なくとも１つのコール８１８の再生実行を含み、ランタイム・ルーチンへのコールは、ソース・コード内に対応するコール・ステートメントもコール式も有さない。このコンテキストでは、ある実施形態は、以下の内少なくとも１つを含む。動的にコンパイルされたコードを受け取るように設計されたメモリー範囲全体を指定するブレークポイント範囲を設定するステップ１４０８、またはランタイム・ルーチンへのコールに対してステップオーバー動作を実行するためにブレークポイントを設定するステップ１４１０。
【０３１１】
[00330]  ある実施形態では、順方向ステップイン９０４動作は、次のように進められる。本明細書における教示にしたがって構成されたデバッガー２００が、ソース・ライン範囲を中間言語範囲にマッピングし（１３０６）、中間言語範囲をネーティブ範囲にマッピングする（１３０８）。次いで、デバッガーは低レベル・プリミティブを使用してこのステップを実行する。これは、命令レベルの１つずつのステップまたはブレークポイントを使用して行うことができる。コール８１８命令に遭遇したとき、デバッガーは、ターゲットが、ソース・レベルにおいてステップインを表す高レベルのソース・ステップであるか、または代わりに、ソース・コードにおいて明確に表されていないので、ステップインすべきではないランタイム実装の詳細であるか判定する。この判定は、例えば、ランタイムに問い合わせることによって、またはソース・コードを検索して、コール先ルーチンの名称を見つけることによって行うことができる。コールが異なる高レベル（ソース・コードにおいて示される）ルーチンに対するものである場合、デバッガーはランタイム２０４に問い合わせて（例えば、ＤＡＣ２０８を通じて）、コール先ルーチンがＪＩＴコンパイルされているか否か判定する。コール先ルーチンがＪＩＴコンパイルされている場合、デバッガーは、命令レベルのコールへの１つのステップインを使用して、またはターゲット・ルーチンの内部にブレークポイントを設定することによって、コールへのステップイン９０４を実行する。コール先ルーチンがＪＩＴコンパイルされていない場合、デバッガーはＤＡＣ２０８または他のメカニズムを使用して、ＪＩＴコンパイラー上またはＪＩＴコンパイル書き込みのターゲット・アドレス領域上に、データー・ブレークポイント（１つまたは複数）を使用して、ブレークポイントを設定する。デバッガーは、トレース再生が、ＪＩＴコンパイルが完了するまで、実行することを許容する。デバッガーは、ＪＩＴコンパイルのターゲット上にブレークポイントを設定し、実行する。これは、ネーティブ命令が、先に説明した初期アクションからマッピングされたネーティブ・ステッピング範囲にもはや該当しなくなるまで継続し、該当しなければプログラムは終了する。例外は、キャッチのターゲット上に降下すべき特殊な場合である。
【０３１２】
[00331]  ある実施形態では、トレース再生実行制御リクエストは、以下の動作の内少なくとも１つを要求する。ブレークポイント８２８に到達するまで、トレース再生実行を順方向９１０にトレース全体にわたって継続する。ブレークポイント範囲８３０内の位置に到達するまで、トレース再生実行を順方向９１０にトレース全体にわたって継続する。ブレークポイント８２８に到達するまで、トレース再生実行を逆方向９２０にトレース全体にわたって継続する。またはブレークポイント範囲８３０内の位置に到達するまで、トレース再生実行を逆方向９２０にトレース全体にわたって継続する。ある実施形態は、更に、実例をあげると、以下の内１つ以上を含む他の動作を、リクエストにおいて潜在的に要求される可能性があるものとして含む。逆方向実行ステップイン９１４動作、逆方向実行ステップアウト９１８動作、逆方向実行ステップオーバー９１６動作、順方向実行ステップイン９０４動作、順方向実行ステップアウト９０８動作、順方向実行ステップオーバー９０６動作。更に一般的には、所与の実施形態は、本明細書において教示される動作のいずれの部分集合にも限定されないとして差し支えない。
【０３１３】
[00332]  ある場合には、トレース４１８を作成するためのトレース対象マネージド・プログラムの実行中に、プロセッサーは一度に多くともＮ箇所のアドレスしか監視できないというハードウェア・ブレークポイント制約によって、ブレークポイントの最大数が制限された。しかしながら、ある実施形態では、この方法は、更に、トレースの再生実行中にＮ個よりも多いブレークポイントを設定し（１３１４）、これによってハードウェア・ブレークポイント制約を超過する（１４１４）。
【０３１４】
[00333]  尚、他の方法も、本明細書において紹介した教示の範囲内に該当することは、当業者には認められよう。具体的には、他のシステムが、クロスレベル・マッピング４０４を実行し、ブレークポイント範囲を使用し（８３０）、本明細書において提示したが本明細書において記載した特定例から逸脱する他の教示を実施してもよい。本明細書において教示した実行制御の教示の内いずれかを使用する方法は、これらが、提示される特定例内に入るか(among)否かには関係なく、本開示の範囲内に該当する。
【０３１５】
[00334]  いくつかの構成媒体例
[00335]  ある実施形態は、構成コンピューター読み取り可能記憶媒体configured computer-readable storage medium)１１２を含む。媒体１１２は、ディスク（磁気、光、またはそれ以外）、ＲＡＭ、ＥＥＰＲＯＭまたは他のＲＯＭ、および／または特にコンピューター読み取り可能媒体（単なる伝搬信号でも単なるエネルギーでもない）を含む他の構成可能なメモリーを含むことができる。構成される記憶媒体は、具体的には、ＣＤ、ＤＶＤ、またはフラッシュ・メモリーのような、リムーバブル記憶媒体１１４であってもよい。リムーバブルであってもなくてもよく、揮発性であってもなくてもよい汎用メモリーは、実行コントローラー４０２、再生アダプター４０８、命令グループ８２２、クロスレベル・マッピング４０４、機械レベル・リクエスト４１４およびレスポンス４１６、データー１１８および命令１１６の形態であり、構成媒体を形成するために、リムーバブル媒体１１４および／またはネットワーク接続のような他のソースから読み取られるブレークポイント範囲８３０のような項目を使用して、実施形態に構成することができる。構成媒体１１２は、コンピューター・システムに、本明細書において開示したようなレベル間交差（ツール１２２における高レベルからトレース４１８における低レベルにわたる）再生実行制御のために技術的プロセス・ステップを実行させることができる。このため、図は、構成記憶媒体の実施形態およびプロセスの実施形態、ならびにシステムおよびプロセスの実施形態を例示するのに役立つ。具体的に、図４、図１３、または図１４に示す、あるいはその他で本明細書において教示したプロセス・ステップはいずれも、構成媒体の実施形態を形成するために記憶媒体を構成するのを補助するために使用することができる。
【０３１６】
[00336]  ある実施形態は、コンピューター・プロセッサー１１０によって実行されると、トレース再生実行制御方法を実行するコードが構成されたコンピューター読み取り可能記憶媒体１１２、１１４を使用または提供する。この例では、トレース再生実行制御方法は、コンピューティング・システム上で実行するソフトウェア・ツールにおいてトレース再生実行制御リクエストを受けるステップ１３０４を含む。トレース再生実行制御リクエストに基づいて、この方法は、トレース対象マネージド・プログラムのソース・コードとソース・コードの中間表現との間でマッピングを行うステップ１３０６と、中間表現とトレース４１８との間でマッピングを行うステップ１３０８とを含む。トレース４１８は、トレース対象マネージド・プログラムが実行されたときにトレースされたネーティブ・コード命令のような、プロセッサー・アクティビティの記録を含み、トレースはランタイムの実行インスタンスを全く含まない。この例では、トレース再生実行制御方法は、更に、トレース再生実行制御リクエストに対応するトレース・ネーティブ・コード命令または他のトレース・エントリーを実行するステップ１３１２、またはトレース・ネーティブ・コード命令上にブレークポイントを設定し（１３１４）、これによってトレースの再生を制御するステップ１３１０も含む。
【０３１７】
[00337]  ある実施形態は、デバッガー・コード２００との組み合わせで動作し、これらの場合のいくつかでは、トレース対象マネージド・プログラムはライブ・プロセスと実行ランタイム２０４とを含む。デバッガー・コード２００は、トレース対象マネージド・プログラムの実行ランタイム２０４と通信し、この方法は、トレース対象マネージド・プログラムを終了せずに１４１６、１４１８、トレース４１８を使用して逆方向実行再生を制御する（１３１０）。即ち、この例では、逆デバッグがライブ・プロセス・デバッギングとインターリーブされる(interleaved)。
【０３１８】
[00338]  ある実施形態は、特に興味深い以下のアクティビティの内１つ、または２つ、または３つ、または４つ全てを実行する。１つの特に興味深いアクティビティは、トレース４１８において機械レベル情報を使用して高レベルでランタイム２０４の実行を制御する（１４２０）ことである。このコンテキストでは、「高レベルで」制御するとは、ソース・コードにおいて識別子またはステートメントまたは式を指定するユーザーの選択１４２６（ユーザー１０４からユーザー・インターフェースを通じて得られる１４２４）に基づいて制御することを意味する。このコンテキストでは、「機械レベル」情報とは、プロセッサー・アーキテクチャに特定である情報、例えば、特定の命令集合または特定のマイクロアーキテクチャを意味する。
【０３１９】
[00339]  他の特に興味深いアクティビティは、トレース対象マネージド・プログラムのプロセス２０２、８０２の順方向実行および逆方向実行の双方をデバッグすること（２００）である。
【０３２０】
[00340]  他の特に興味深いアクティビティは、少なくとも部分的に広いブレークポイント範囲１４３６を設定する（１４３４）ことによって、ソース・コードに示されるコールにステップインすることである。このコンテキストでは、ブレークポイント範囲が「広い」のは、 トレース４１８において少なくとも１０００の連続アドレスまたは命令を包含するときである。
【０３２１】
[00341]  他の特に興味深いアクティビティは、ライブ・プロセスをデバッグする（２００）間に、トレース対象マネージド・プログラムのライブ・プロセス２０２からのトレース・データーを記録し（４１８）、次いで記録したトレース・データーの少なくとも一部を使用して、ライブ・プロセス上で逆実行デバッギングを実行することである。
【０３２２】
[00342]  尚、他の構成媒体の実施形態も、本明細書において紹介した教示の範囲内に該当することは、当業者には認められよう。具体的には、他の実施形態は、実行時に、クロスレベル・マッピング４０４を実行し、ブレークポイント範囲８３０を使用し、本明細書において提示したが本明細書において記載した特定例から逸脱する他の教示を実施するコードが構成された法定媒体(statutory media)を含んでもよい。本明細書において教示した実行制御の教示の内いずれかを使用して方法を実行するように構成された媒体は、これらが提示される特定例内に入るか(among)否かには関係なく、本開示の範囲内に該当する。
【０３２３】
[00343]  ＪＩＴコードによる例
[00344]  ソース・コードが、以下に示すＣ＃におけるクラスと同様のクラスを含むと仮定する。
【０３２４】
【表４】
2021523444.tif 000010
【０３２５】
[00345]  言語をＣ＋＋のように使用した場合、開発者はＳｑｕｉｄ．Ｓｗｉｍ（）におけるＷｉｇｇｌｅＬｅｇ（）へのコールがこの（アセンブリーのようなコード）のような何かにコンパイルすることを当然期待するであろう。
ＣＡＬＬ  ０ｘ０ｃ８４ｆａｂｄ； ０ｘ０ｃ８４ｆａｂｄは、Ｓｑｕｉｄ：：ＷｉｇｇｌｅＬｅｇ（）のアドレスである。
【０３２６】
[00346]  この場合、０ｘ０ｃ８４ｆａｂｄはＳｑｕｉｄ：：ＷｉｇｇｌｅＬｅｇ（）の実装を開始する。しかし、ランタイム２０４において実行するマネージド・ソフトウェアでは、別のやり方で行われる。ランタイム２０４は、「ジャストインタイム」コンパイル、別名「ＪＩＴされた」コードを実行する。Ｓｑｕｉｄ．ＷｉｇｇｌｅＬｅｇ（）がコールされたのはこれが最初である場合、Ｓｑｕｉｄ．ＷｉｇｇｌｅＬｅｇ（）に対する機械命令１１６はない。これは未だコンパイルされていない。したがって、Ｓｑｕｉｄ．ＷｉｇｇｌｅＬｅｇ（）を実装する機械命令を有するのではなく、０ｘ０ｃ８４ｆａｂｄは、これのように見える何らかの（擬似コードでの）命令を有する。
【０３２７】
【表５】
2021523444.tif 000011
【０３２８】
[00347]  このコードの小さいビットを「プレスタブ」(pre-stub)と呼ぶ。コンパイル・プロセスは長くて複雑であるので、通例、開発者が、アプリケーションをトレースしトレースを使用することによって、アプリケーションを分析またはデバッグしようとするとき、コンパイル・プロセスを詳細に記録することを望まない。しかしながら、トレーシング４１８は、コードをデバッギングしている人にとって、これらのトレース対象命令が全く関心がなさそうであっても、このスタブの少なくとも一部を記録しそうに思われる。ライブ・プロセス・デバッギングでは、このコードの部分は、ランタイムによってステップオーバーされるのが通例である。トレース４１８からのみデバッグするとき、しかしながら、デバッギーのランタイム２０４は実行せず、したがってプレスタブを飛ばすことはできない。代わりに、実施形態は、通常ではダンプ３０２内のデーターを読み取るために使用されるアウトオブプロセス・デバッギング・ユーティリティ(out-of-process debugging utilities)の機能と、ランタイムにおける全てのＪＩＴされたコードのアドレス範囲を発見するために集合的に使用することができる革新的トレース再生機能とを利用することができる。メソッド・コールにステップインするリクエストを受けた後、実施形態はＪＩＴされたコード範囲上に一時的にブレークポイントを設定し（１３１４）、最初のＪＩＴされたコード範囲が読み取られるまで仮想的に順方向に実行する（即ち、順方向に再生する）ことができる。一旦これが読み取られたなら、実施形態はブレークポイントを取り除くことができる。このように、開発者は、この興味のない「スタブ」コードを全て飛ばすことができる。また、ある実施形態は、ブレークポイントのアドレス範囲を丁度Ｓｑｕｉｄ：：ＷｉｇｇｌｅＬｅｇ＿ｉｍｐｌｅｍｅｎｔａｔｉｏｎ（）の範囲となるように絞り込むことによって、このメソッドを最適化する。
【０３２９】
[00348]  いくつかの追加の組み合わせおよび変形
[00349]  コード、データー構造、ロジック、コンポーネント、通信、および／またはそれらの機能的同等物のこれらの組み合わせの内任意のものを、以上で説明したシステムおよびそれらの変形の内任意のものと組み合わせることもできる。プロセスは、本明細書において説明した任意のステップを、動作可能な任意の部分集合または組み合わせまたはシーケンスに含めることもできる。各異形(variant)は、単独で、または他の異形の任意の１つ以上との組み合わせで行われてもよい。各異形は、前述のプロセスの内任意のものとともに行われてもよく、各プロセスは、他のプロセスの任意の１つ以上と組み合わせることもできる。各プロセスまたはプロセスの組み合わせは、異形を含んで、以上で説明した媒体の組み合わせおよび異形の内任意のものと組み合わせることもできる。
【０３３０】
[00350]  ある実施形態では、トレース再生コンポーネントは、トレース・ファイル４２０の位置（例えば、タイムコード４２４によって指定される）とソース・コード２１２における位置（例えば、ライン番号として指定される）との間で、ソース−ＩＬマッピングおよびＩＬ−機械マッピングを使用して変換する。
【０３３１】
[00351]  ある実施形態では、ランタイム機能の一部が、トレース再生コンポーネント４０６に設けられる。しかし、図２にしたがってライブ・プロセスにおいて行うような、デバッガー、ユーザー・コード、およびオペレーティング・システムの間で仲介するランタイムの代わりに、このランタイム機能はデバッガーとトレース・ファイル（１つまたは複数）４２０との間で仲介する。
【０３３２】
[00352]  あるトレース記録プロセスは、２種類のデーターのみを記録する。記録される１つの種類のデーターは、コード命令１１６の実行であり、潜在的に複数のスレッド上で並列に実行される。記録される他の種類のデーターは、実行時間における離散時点で取り込まれたメモリーの特定のブロックのスナップショット３０４であり、例えば、スタックの一部を捕捉するためである。しかしながら、他のトレーシング・プロセスは、図４に示すように、異なる種類のデーターまたは追加の種類のデーターを記録する。場合によっては、トレースが記録された命令の全ての効率的な表現に加えて、それらの入力およびそれらの出力の全ても含むこともある。トレース４１８の記録は、プロセッサー（１つまたは複数）１１０の決定論に頼り、この決定論に基づいて推論できない情報に加えて、トレース４１８に既に記録されているものを主に記録することによって、効率的に行われる。ある実装では、トレース４１８の大部分は、データー、実行されないコード命令であり、このようなデーターは決定論的でないことが多い。トレースは、主に、シード・データー(seed data)および非決定論的情報であってよい。場合によっては、トレースされるプロセッサー（１つまたは複数）のキャッシュに入る情報だけをトレース４１８に記録する。例えば、プロセッサー・キャッシュへの値Ｖの読み込みがトレースに入力されるが、プロセッサーのレジスターからメモリー位置Ｘへの値Ｖの書き込みは、必ずしもトレースに入力されない。このＸへの書き込みが、トレース対象プログラムの挙動において違いを生ずる場合、これは、書き込まれる値がある時点でＸからプロセッサー・レジスターに戻り、この時点において、トレーシングが未だ可能であれば、トレース４１８における入力(entry)を行うことができるからである。
【０３３３】
[00353]  プロセス・トレースからの高レベル・プログラムの実行制御について、本明細書では、例、実例、定義、およびその他の記述資料(descriptive material)を使用して説明した。尚、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）環境を実行するシステム上におけるＥｖｅｎｔ  Ｔｒａｃｉｎｇ  ｆｏｒ  Ｗｉｎｄｏｗｓ（ＥＴＷ）トレーシングまたは「Ｔｉｍｅ  Ｔｒａｖｅｌ  Ｔｒａｃｉｎｇ」（Ｍｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎの商標）、Ｌｉｎｕｘ（登録商標）環境を実行するシステム上におけるＬＴＴｎｇ（登録商標）トレーシング（それぞれＥｆｆｉｃｉｏｓ  Ｉｎｃ．およびＬｉｎｕｓ  Ｔｏｒｖａｌｄｓの商標）、ＵＮＩＸ（登録商標）状環境のためのＤＴｒａｃｅ（登録商標）トレーシング（それぞれＯｒａｃｌｅ  Ａｍｅｒｉｃａ，Ｉｎｃ．およびＸ／Ｏｐｅｎ  Ｃｏｍｐａｎｙ  Ｌｔｓ．  Ｃｏｒｐ．の商標）、ならびに他のトレーシング技術のような技術を使用すれば、機械レベルでプロセスのトレースを作成できることは、当業者には認められよう。次いで、ハードウェアのエミュレーションを使用して、トレースを再生することができる。ときには、このプロセスが、実際にプロセスを実行するためにはランタイム・フレームワークを必要とする高水準言語で書かれることもある。これの例に、共通言語ランタイム（ＣＬＲ）内で実行する．ＮＥＴアプリケーションがある。トレース自体を順方向または逆方向に移動することは、高レベル・プログラムの開発者にとって有益ではない。何故なら、トレースの視点(view)は、高レベル・プログラムではなく、むしろランタイムまたはジャストインタイム・コンパイルされたコードであるからである。この文書は、トレースにおける機械レベル命令をプログラムにおける高レベル動作にマッピングする方法について説明した。これは、高水準言語において、ブレークポイントの設定およびヒット(hitting)ならびに順方向および逆方向のステップ動作を可能にする。
【０３３４】
[00354]  高レベル・ランタイムにおいてコードをステップスルーするプロセスは、複雑さを３つのレイヤに抽象化することによって実装することができる。最も低いレイヤ（レイヤ０）は、プロセス・トレース４１８である。このトレースは、ハードウェア・レベルで記録されたプロセス実行のエミュレーションを可能にするのに十分な情報を含む。
【０３３５】
[00355]  レイヤ１において、適切に構成されたシステムが、トレースを再生するために、何らかの非常に基本的なハードウェア・デバッギング・サポートを適用することができる。このサポートは、プロセスを順方向または逆方向に再生し(play)、プロセス・メモリーを読み取り、スレッド・コンテキストを読み取り（スレッド毎に）、ハードウェア・ブレークポイントを設定し、スレッド毎に１ステップ機械命令を進めることができることから成り立つのでもよい。
【０３３６】
[00356]  レイヤ２において、機械命令の範囲を高レベル仮想機械（ＶＭ）命令または他の種類のコードの範囲にマッピングするために、サポートを与える。レイヤ１における動作は、高レベル・コードをデバッグするために使用することができる。ある構成では、サポートする動作は、順方向実行、逆方向実行、ブレークポイント設定、ステップイン、ステップアウト、およびステップオーバーである。例における各動作の実施に関する詳細を以下に示す。
【０３３７】
[00357]  順方向および逆方向の実行に関して、この例では、これらは高レベルおよび機械レベルのランタイムにおけると同等であり、したがってこれは全体的にレイヤ１において扱われる。
【０３３８】
[00358]  ブレークポイントに関して、この例では、高レベル・ブレークポイントをハードウェア・ブレークポイントにマッピングするためにレイヤ２において定義されたマップを使用することによって、ブレークポイントを設定する。ハードウェア・ブレークポイントにヒットしたとき、実装はこのマッピングを使用して、このハードウェア・ブレークポイントを逆に高レベル・ブレークポイントにマッピングすることができる。
【０３３９】
[00359]  順方向および逆方向のステップアウトに関して、スタック・トレースを使用することによって、実装はハードウェア・ブレークポイントを関数のリターン・アドレスに設定することができる。ステップアウト作業を逆に行うために、リターン・アドレスの前にある命令上にブレークポイントを設定する。
【０３４０】
[00360]  順方向および逆方向のステップオーバーに関して、実行する次の命令を監視する(looking at)ことによってステップオーバーを実施することができる。命令に応じて、実装は、レイヤ１を使用して、１ステップ進めまたはブレークポイントを設定し、それにヒットするまで実行することができる。「コール」命令は、ブレークポイントを必要とする命令の例である。殆どの他の命令はシングル・ステップを使用することができる。いくつかの周知の手法とは異なり、このデバッガー実装の例は、レイヤ２におけるマッピングを使用して、命令ポインターまたはコード実行時点が高レベル・ランタイムにおけるしかるべき停止点となるまで、ステッピング動作を繰り返すことができる。これは、本明細書の他の場所における命令グループ８２２の論述の動機付けになる(motivate)。
【０３４１】
[00361]  逆ステップインに関して、逆ステップインを実行するためには、この実施形態は、レイヤ１において定義したシングル・ステップ動作を使用する。機械が丁度コール命令から戻ったばかりである場合、これを使用すると、実行時点を、直前のコールのリターン命令まで戻すことになる。機械がコールから丁度戻ったばかりでない場合、機械は単に直前の命令にステップバックする。ステップオーバーに関して、実装はレイヤ２におけるマッピングを使用して、いつ実行が停止点にくるか把握し、トレースのソース・コードとの整列１３１８を実行するためには、シングル・ステップを数回余分に実行しなければならない場合もある。
【０３４２】
[00362]  順方向ステップインに関して、順方向ステップインは、この実装では逆ステップインと同様である。しかしながら、高レベル・ランタイムが、実行している高レベル・コードに直接関連がない作業を実行しなければならない場合、困難が生じるおそれがある。いくつかの例には、ランタイムによる何らかの種類の解決(resolution)を必要とする（．ＮＥＴにおける透過型プロキシーはこの解決課題の一例である）ジャストインタイム・コンパイル、ランタイム・ハウスキーピング、およびステップ動作がある。これらの困難に取り組むためには、以下のいずれかまたは双方を実施してもよい。１つの選択肢は、ステップインを開始するとき、ＪＩＴされたコードの全てに非常に広いブレークポイント範囲を設定することである。ステップインした後にこのブレークポイントにヒットした場合、実装は、次の停止点に到達したときに、ステップを完了することができる。他の選択肢は、実装が高レベル・ランタイムにおけるしかるべきポイントにおいてステップを停止することができるように、いつコールをステップオーバーすべきか、そしていつコールをシングル・ステップスルーすべきか(single step through calls)把握できるようにランタイムを十分に理解するロジックをステッピング・エンジン内に実装することである。
【０３４３】
[00363]  ある実施形態では、アウトオブプロセス実行制御(out-of-process-execution-control)は、例えば、再生コンポーネント４０６によって供給される関数、およびＩＬ−アドレス・マップ８１２の使用によって、ＩＬ命令の実行を制御している。実行制御のために再生コンポーネント４０６または他の再生レイヤ・コンポーネント４０２、４０８によって供給される機能(function)には、
全てのスレッドの状態（レジスター値）を得る、
命令を１つ順方向または逆方向に進む、
命令ポインターが指定された１組のアドレスに到達するまで、順方向または逆方向に実行する、
が含まれる。
【０３４４】
[00364]  ＩＬ−アドレス・マップは、プロセスまたはトレースのメモリー・イメージ内に存在し、再生レイヤはそれにアウトオブプロセス実行制御デバッガーを提供することができる。１つの見方では、この例は、ＩＬレベルにおけるデバッギングを機械レベルにおけるデバッギングに変換することを含む。
【０３４５】
[00365]  ある実装は、ソース−ＩＬマッピング８１０、ＩＬ−ネーティブ・マッピング８１２、ネーティブ・スタイル・アウトオブプロセス実行制御、およびトレース４１８全域にわたって順方向および逆方向に進む(travel)能力を使用して、個々の命令を１つずつ進めることによって、または特定の命令アドレスに到達するまでトレース全体を順方向または逆方向に実行することによって、高レベル実行制御をトレースに適用することをサポートする。
【０３４６】
[00366]  ライブ・プロセス・デバッギングを考慮した例の検討
[00367]  トレースに基づく実行制御の他の実例として、特定の実施形態がライブ・デバッギングと同様であってもよい、またはライブ・デバッギングと異なってもよいということについて、いくつかの点で検討する。以下で、様々なコンポーネントを引用するが、当業者は、本明細書において示した他の例とそれらの関係を理解し、特に、実装を理解するためまたは容易にするために、必ずしも本明細書において示した実行制御の教示から逸脱せずに、機能を異なるコンポーネントに類別できることを理解しよう。この例で論じたシステム８００のコンポーネントには、次のものが含まれる。
【０３４７】
[00368]  ユーザー・インターフェース（ＵＩ）  プログラム状態のデバッガーの表現をユーザーに図を用いて表示するユーザー・インターフェース。プログラム状態の例をあげるとすると、スレッドのリスト、各スレッド上において実行する次のソース・コードのライン、スレッド毎のコールスタック、コールスタックの各フレームにおける１組の変数、これらの変数の値等が含まれる。
【０３４８】
[00369]  ソース変換  ランタイム抽象化とソース・コード・レベル抽象化との間で変換を行う役割を果たすソース・コード変換部分。例えば、ＣｌＲランタイムは、バイナリー・ファイル・フォーマットにエンコードされたＩＬ命令を使用してコードを表し、一方Ｃ＃ソース・コードは、テキスト・ステートメントの構文を有する。一例として、このデバッガーのレイヤをランタイムの抽象化レイヤ（実例をあげると、Ｓｔａｎｄａｒｄ  ＥＣＭＡ−３３５  Ｃｏｍｍｏｎ  Ｌａｎｇｕａｇｅ  Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ（ＣＬＩ）第６版（２０１２年６月）またはその後継版において定義されるような）と、Ｃ＃抽象化レイヤ（実例をあげると、Ｃ＃Ｌａｎｇｕａｇｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎバージョン５．０またはその後継において定義されるような）との間で変換することができる。
【０３４９】
[00370]  ランタイム変換  デバッガーのランタイム変換部分は、メモリーおよびレジスターならびにランタイム抽象化というような、低レベルの概念間で変換することを役割とする。ランタイム抽象化の例には、スレッドのリスト、スレッド毎のコールスタック、および次に実行されるＩＬ命令が含まれる。尚、抽象化のランタイム・レイヤにおけるコールスタックは、必ずしも抽象化のソース・コード・レベルにおけるコールスタックと同じではないことを注記しておく。ライブ・デバッギングのみの場合、いくつかのタスクの完了を補助するために、このレイヤはプロセス間通信メカニズムを使用して、デバッグされているプロセス内におけるランタイムが作業を実行することを要求する。例えば、メソッドＦｏｏ、オフセット２８内のＩＬ命令にブレークポイントを設定するために、このレイヤは、ブレークポイントをＦｏｏ、オフセット２８に設定するように求めるメッセージをランタイムに送る。次いで、ランタイム内のスレッドはこのメッセージを受け取り、ＦｏｏＩＬオフセット２８を、メモリー・アドレスに常駐する機械命令０ｘ４５６７１２３５１２３９５に変換し、次いでその位置にブレークポイント命令を書き込む。尚、これらのリクエストを担当する(service)ランタイムの部分は、異なるプロセス内に実装されても、機能的にデバッガーのこのレイヤ内に常駐するものと、常識的に見なすことができよう。
【０３５０】
[00371]  基礎(foundation)  デバッガーの低レベル部分は、カーネル、またはダンプ・ファイル、またはトレースを使用して、ランタイム変換部分によって読み取られるメモリーおよびレジスターを生成する役割を果たす。カーネル・プロセスの場合、これは、ある環境においては、ＲｅａｄＰｒｏｃｅｓｓＭｅｍｏｒｙのようなＡＰＩによって達成される。トレース・ファイルの場合、これは、ファイルの解析、および時点ｔとこの時点において記録されたある１組のメモリーおよびレジスターのコンテンツとの間におけるマッピング構築をサポートする。
【０３５１】
[00372]  これらのコンポーネントを念頭において、ブレークポイントを設定し、それに到達するまでプログラムを順方向に実行する場合について検討する。１つの見方では、ライブ・プロセス・デバッギングのためには、大まかに次のアクションが関与すると考えられる。
【０３５２】
[00373]  アクション１。ユーザー・インターフェース。ユーザーは、ブレークポイントを設定すべき場所を示すために、表示されているソース・コードのライン上でマウスをクリックする。
【０３５３】
[00374]  アクション２。ソース変換。このソースのラインを特定のメソッドおよびＩＬ命令オフセットに変換する。
【０３５４】
[00375]  アクション３。ランタイム変換。メッセージをランタイムに送り、次いでランタイム内において、メソッド＋ＩＬ命令オフセットをメモリー・アドレスに変換する。次いで、そこにブレークポイント・オペコードを書き込む。
【０３５５】
[00376]  アクション４。ユーザー・インターフェース。ユーザーは、ＵＩにおいてボタンをクリックし、プロセスを実行したいことを示す。
【０３５６】
[00377]  アクション５。ソース変換。実行することを求めるリクエストを転送する。
【０３５７】
[00378]  アクション６。ランタイム変換。ランタイム２０４にメッセージを送り、順方向に実行することを要求する。メッセージを受け取ったとき、ランタイムは順方向に実行し、次いで先に設定した特定のメモリー・アドレスにおけるブレークポイントに到達する。ブレークポイントのメモリー・アドレスを逆にメソッドおよびＩＬオフセットに変換し、通知メッセージをデバッガーに返送して、特定のメソッド／ＩＬオフセットにおけるブレークポイントに達したことを示す。
【０３５８】
[00379]  アクション７。ソース変換。ブレークポイントに達したことのメッセージを、メソッドおよびＩＬオフセットから逆にソース・ラインに変換し、このソース・ラインにおけるブレークポイントにヒットしたことの通知をＵＩに回送する(send onwards)。
【０３５９】
[00380]  アクション８。ユーザー・インターフェース。ＵＩは、スレッド毎の現在のコールスタックのような、現在の状態情報をユーザーに表示できるように、プロセスの新たな状態についての他の情報を要求する。
【０３６０】
[00381]  アクション９。ソース変換。コールスタックのソース抽象化を行う(provide)ために、このコンポーネントは、最初に、コールスタックのランタイム抽象化を受け取ることを要求する。
【０３６１】
[00382]  アクション１０。ランタイム変換。コールスタックのランタイム抽象化を行うために、このコンポーネントは、最初に、メモリーおよびレジスターの状態を受け取ることを要求する。
【０３６２】
[00383]  アクション１１。基礎。現時点におけるメモリーおよびレジスターを決定する。
【０３６３】
[00384]  アクション１２。ランタイム変換。メモリーおよびレジスターを使用して、コールスタックのランタイム抽象化を計算する。
[00385]  アクション１３。ソース変換。コールスタックのランタイム抽象化を使用して、コールスタックのソース・コード抽象化を計算する。
【０３６４】
[00386]  アクション１４。ユーザー・インターフェース。コールスタックのソース・コード抽象化を使用して、ＵＩはここでデバッグされたプロセスの現在の状態をユーザーに表示することができる。
【０３６５】
[00387]  ある実施形態では、トレース・アクション３、６、および１１を使用するとき、もはや同じように動作しない。アクション３および６では、ブレークポイントを設定するメッセージも、順方向に実行するメッセージも、ブレークポイントに達したときに通知を返送するメッセージも受け取ることができるプロセスはない。アクション１１では、メモリーまたはレジスターを決定するためにカーネルＡＰＩによって問い合わせることができるプロセスはない。
【０３６６】
[00388]  したがって、ある実施形態では、先のアクション３を実施するために、ソース変換コードは、ランタイム変換コードに、どのメモリー・アドレスＸが、ブレークポイントを設定すべき、所与のメソッド＋ＩＬオフセットの機械コードを有するか示すように要求する。このアドレスＸは、後の使用のために保存される。
[00389]  先のアクション６を実施するために、ある実施形態では、ソース変換コードが直接デバッガーまたは他のツール（１つまたは複数）の低レベル基礎部分に、トレースを新たな時点ｔ’まで進めるように命令する。新たな時点ｔ’とは、アドレスＸにおける機械命令が、シミュレートまたはエミュレートされて実行したであろう次の時点である。アクション６では、実施形態は、ＩＬオフセットからプロセス・メモリー・オフセットに変換するためにダンプ・デバッギングにおいて通常使用されるのと同じプロセスを使用することができる。しかしながら、実施形態は、変換されたメモリー・オフセットを使用して、トレース再生エンジン内に仮想ブレークポイントを設定する。再生エンジンが仮想実行中にそのメモリー・アドレスを読み取ったときに、仮想プロセス（再生実行）は停止する。実際、トレースが１つよりも多いバージョンの同じ関数を含む場合（再ＪＩＴによって）、ランタイム変換は、１つのブレークポイントを扱うために数個のアドレスに対するトレースを要求することができる。これは、トレースにおける異なる時間範囲では異なるアドレスになる可能性があり、更にＪＩＴ関数(jitting function)と同様に、ランタイム変換が関数の新たな再ＪＩＴされた位置を突き止めるための、ランタイム関数のアドレスである可能性もある。
【０３６７】
[00390]  先のアクション１１を実施するために、ライブ・プロセスからの読み取りの代わりに、トレース・ファイル４１８を読み取り、時点ｔ’に対応するメモリーおよびレジスターを用意する。
【０３６８】
[00391]  再生デバッギングのシナリオ
[00392]  デバッギング中に順方向および逆方向双方の実行にアクセスを付与することによって、システム８００はデバッギング効率を高めることができる。例えば、ある実施形態は、以下のようなデバッギングのシナリオをサポートする。
【０３６９】
[00393]  背景として、生産デバッギング(production debugging)が難しいことは、当業者には認められよう。顧客がウェブサイトについての問題を報告すると仮定する。どのようにして開発者はそれをデバッグするか。周知の手法の中には、ログおよびダンプのような情報に頼るものがあるが、これは時点情報(point-in-time information)を与えるに過ぎない。したがって、ログまたはダンプにおいて捕捉された特定の時点において問題が再現または発生しなかった場合、開発者は再度実行の異なる時点において有用な情報を捕捉しようとしなければならず、これは問題を解決するために費やす時間が長くなることを意味する。
【０３７０】
[00394]  代わりに、生産中のアプリケーションにおいて何が起こったか、ライン毎に、環境が正確に開発者に伝えることができると想像する。Ｍｉｃｒｏｓｏｆｔ  Ｔｉｍｅ  Ｔｒａｖｅｌ  Ｄｅｂｕｇｇｉｎｇまたは他の逆実行再生を使用する実施形態は、チーム・メンバーが、アプリケーションの挙動の高忠実度記録を収集することを可能にする。次いで、開発者は、Ｍｉｃｒｏｓｏｆｔ  Ｖｉｓｕａｌ  Ｓｔｕｄｉｏ（登録商標）環境あるいは他のデバッギングまたは統合開発環境のような、一般的に周知の環境において、オフラインでアプリケーションをデバッグすることができる。
【０３７１】
[00395]  具体的な例として、ＳｍａｒｔＨｏｔｅｌｓ３６０ウェブサイトに問題が発生したと仮定する。これはデモ・ウェブサイトであり、そのコードは、Ｍｉｃｒｏｓｏｆｔ  ＣｏｒｐｏｒａｔｉｏｎからＧｉｔＨｕｂドット・コム・サイトを通じて公に入手可能である。このＳｍａｒｔＨｏｔｅｌｓ３６０サイトを運営する会社において、開発者が、最良のホテルを示す機能がもはやデーターを示していないという報告を、ユーザーから受ける。しかしながら、以前は正しく動いており、会社の検査またはステージング環境において問題は再現しなかった。ｏｐｓチームまたは技術チームのメンバーが、欠陥機能を強化する(power)コードを実行したときのアプリケーションの記録（トレーシング４１８）を収集している。コマンド・ライン・ツールによって、トレース４１８をファイル４２０に収集することができ、またはあるメソッドが予想以上に例外を出す(throw)というような、ある条件を満たすときにクラウド環境（Ｍｉｃｒｏｓｏｆｔ  Ａｚｕｒｅ（登録商標）または他のクラウド環境）によって自動的に記録をトリガすることも可能である。
【０３７２】
[00396]  開発者は、デバッガーを開始し(open)、ＳｍａｒｔＨｏｔｅｌｓ３６０コードおよびトレース・ファイル４２０をロードする。最良のホテルを戻すＡＰＩにおけるライン２８にあるブレークポイントにおいて、実行が停止される。ここで、これは記録ファイルであるが、この例では、開発者は、開発者に一般に周知のデバッガーによって、多くの周知のコマンドを使用して、それをナビゲートすることができる。開発者は、このＡＰＩがコールされたときに何が起こったか知ることを望む。開発者は、ライン２８および２９上で実行を停止し、ローカルズ・ウィンドウ(Locals Window)から、ライン２９をステップオーバーした後に、ｂｅｓｔＨｏｔｅｌｓには項目がないことを確認する。デバッガーがデーター・チップをサポートする場合、開発者も、少なくともこの例では、それらも見ることができる。
【０３７３】
[00397]  ここで、開発者は、問題の原因はＢｅｓｔＨｏｔｅｌｓ（）ルーチンにあると断定した。したがって、開発者はＢｅｓｔＨｏｔｅｌｓ（）において何が起こったか調査することを望む。デバッギングに対する異なる手法では、戻って何が起こったか確認するために、開発者は継続にヒットし(hit continue)、再度ブレークポイントにヒットし、ＢｅｓｔＨｏｔｅｌｓ（）の次の呼び出しにステップインすることもできるが、値、オブジェクト、およびメモリー・アドレスは、そこでは、部分的にデバッグされた呼び出しとは異なる場合もある。また、デバッガー状態を再現するのが難しいとき、開発者はアプリケーションを再起動してもよいが、長時間かかる可能性がある。しかし、この例では、環境はタイム・トラベル・デバッギングをサポートする。したがって、開発者は逆継続ボタン（逆方向継続９２０動作を要求する）を使用して、アプリケーションを直前のブレークポイントにおける状態に巻き戻す(rewind)。巻き戻しの１つの結果として、ローカルズ(locals)が、先に注記したステッピング前の、ライン２８におけるそれらの以前の状態にリセットする。ここで、開発者は、部分的にデバッグされた呼び出しからの全ての値、オブジェクト、およびメモリー・アドレスが同一であるということを確信して、Ｌｏａｄ（）ルーチンをステップオーバーし、ＢｅｓｔＨｏｔｅｌｓ（）にステップインすることができる。
【０３７４】
[00398]  この時点において、開発者はＢｅｓｔＨｏｔｅｌｓ（）をステップスルーし、ＧｅｔＢｅｓｔＨｏｔｅｌｓ（）にドリルインする(drill into)ことを決定する。したがって、開発者はライン３６をステップオーバーし、ライン３７にステップインすることを望む。偶然、開発者がステップ・オーバー・ボタンを押し過ぎたと仮定する。タイム・トラベル・デバッギングを用いると、開発者は素早く戻り、ＧｅｔＢｅｓｔＨｏｔｅｌｓ（）において何が起こったか確認することができる。実際、開発者は、Ｓｔｅｐ  Ｂａｃｋ  Ｉｎｔｏボタン（逆方向ステップイン９１４動作を要求する）を使用することができ、実行をＧｅｔＢｅｓｔＨｏｔｅｌｓ（）に持って行き、それを逆方向に再生する(play)。開発者は、ＧｅｔＢｅｓｔＨｏｔｅｌｓ（）の終了時に、ローカル変数ｂｅｓｔＨｏｔｅｌｓがゼロの値（カウントに対応する）を有することを発見する。明らかに、どういう訳か全ての評価が除外されている。
【０３７５】
[00399]  したがって、開発者は全てのホテルの評価がどうであったか確認するためにチェックすることによって、仮説を検査することを決定する。尚、このトレースは生産において起こったものであり、したがってこれらの値は実際の値であることを覚えておかれたい。開発者は、デバッガーのイミディエイト・ウィンドウを使用して、プロセスのライブ・デバッギングによって可能なように、式を評価することができる。開発者は、デバッガーのイミディエイト・ウィンドウにおいて、式「ＡｌｌＨｏｔｅｌｓ．Ｓｅｌｅｃｔ（ｈ→ｈ．ｒａｔｉｎｇ）」を評価し、評価(rating)が浮動小数点であり、一方、コードは、整数４または５に等しい評価値をチェックしていることを発見する。データー型の不一致、生産におけるデーターの形状と、アプリケーションが予期していたものとの間の不一致があった。
【０３７６】
[00400]  ここで、開発者が、説明したばかりのデバッギングを行い終えて、同僚とそれについて論じ、同僚に何が起こったか詳しく示すことを望むと仮定する。開発者は、調査の最初から再度開始することを望み、特定の対象ポイントに素早く戻る方法を望む。したがって、開発者はライン２１においてブレークポイントを設定し、そこに巻き戻す。次いで、再生によって、開発者が再度デバッギング・ステップを全て再現することが可能になる。開発者が最後に飛ぶことを望む場合、開発者は、開発者が設定した最後のブレークポイントまで進み続けるように順方向に継続することができる。
【０３７７】
[00401]  要するに、開発者は、アプリケーションの高忠実度記録４１８を使用し、生産において実際に何が悪かったのかを捕らえて、素早く問題をデバッグすることが可能になった。本明細書において教示したように再生に適応化されたデバッガーのパワーによって、開発者は、周知のデバッガー・ユーザー・インターフェースを使用してデバッグすることが可能になり、更に順方向および逆方向双方にデバッグすることが可能になり、多大な開発時間を節約することができた。
【０３７８】
[00402]  結論
[00403]  本明細書では、特定実施形態について、プロセスとして、構成媒体として、またはシステムとして、明示的に図示および説明したが、１つの種類の実施形態の論述が他の実施形態の種類にも総合的に広がることは認められよう。実例をあげると、図１３および図１４と関連付けたプロセスの説明は、構成媒体を説明するのにも役立ち、更に他の図と関連付けて論じられたものと同様に、システムおよび製造の技術的効果および運用(operation)について説明するのにも役立つ。だからと言って、１つの実施形態からの限定が必ずしも他のものに読み込まれるということにはならない。具体的には、プロセスは、システムおよび構成メモリーのような製品を論じる間に提示されたデーター構造および構成に必ずしも限定されない。
【０３７９】
[00404]  尚、実装の詳細は、特定のＡＰＩ、特定のフィールド、および特定のサンプル・プログラムのような特定のコードに関連があり、したがって全ての実施形態に必ずしも現れる訳ではないことは、当業者には理解されよう。また、詳細を論じるときに使用されたプログラムの識別子および何らかの他の用語は、実装に特定であり、したがって必ずしもあらゆる実施形態に関連がある訳ではないことも、当業者には理解されよう。しかしながら、必ずしもここに提示する必要はないが、このような詳細は、コンテキストを提供することによって、読者を助けることができ、および／または本明細書において論じた技術の多くの可能な実装の内いくつかを例示することができる。
【０３８０】
[00405]  本明細書におけるある特徴Ｘを有する実施形態に対する引用、および本明細書の他の場所におけるある特徴Ｙを有する実施形態に対する引用は、この開示から、特徴Ｘおよび特徴Ｙ双方を有する実施形態を除外することにはならない。但し、そのような除外が本明細書において明示的に述べられる場合を除く。全ての可能な否定的な請求項の限定は、実施形態の一部であると規定された特徴はいずれも、他の実施形態における包含から明示的に除去されてもよいという意味で、その特定の除外が本明細書におけるいずれの例にも示されなくても、本開示の範囲内に該当する。「実施形態」という用語は、本明細書では、該当法規を遵守する形で適用される場合のプロセス、システム、製品、構成コンピューター読み取り可能媒体、および／または本明細書における教示の他の例の、より便利な形態として使用されるに過ぎない。したがって、所与の「実施形態」は、その実施形態が少なくとも１つの請求項と一致するのであれば、本明細書において開示した特徴の任意の組み合わせを含んでもよい。
【０３８１】
[00406]  図に示されるあらゆる品目に対するレスポンスが、必ずしもあらゆる実施形態に存在する訳ではない。逆に、実施形態が、図に明示的に示されない品目（１つまたは複数）を含むこともある。ここでは、本文および図面において、具体的な例によって、いくつかの可能性を示したが、実施形態はこれらの例から逸脱してもよい。実例をあげると、ある例の特定の技術的効果または技術的特徴を、省略する、改名する、異なるグループに分ける、繰り返す、ハードウェアおよび／またはソフトウェアにおいて異なってインスタンス化するのでもよく、あるいはこれらの例の２つ以上に現れる効果または特徴の混合であってもよい。１つの位置において示される機能が、ある実施形態における異なる位置に設けられてもよく、全体的に見て相互作用するモジュールの集合体から所望の技術的効果を必ずしも除外することなく、所与の実装において機能性モジュールを種々の方法で定義できることは、当業者には認められよう。
【０３８２】
[00407]  全体を通じて、参照番号によって図面を参照した。図または本文において、所与の参照番号に関連する言葉遣いにおける明らかな矛盾はいずれも、その参照番号によって参照されるものの範囲を単に広げるものとして理解されてしかるべきである。同じ参照番号が使用されても、所与の参照番号の異なるインスタンスが、異なる実施形態を指すこともある。同様に、所与の参照番号が、動詞、名詞、および／または各々の対応するインスタンスを指すために使用されることもある。例えば、プロセッサー１１０が、命令を実行することによって、それらを処理する（１１０）ことができる。
【０３８３】
[00408]  本明細書において使用する場合、「ａ」および「ｔｈｅ」のような用語は、示される項目またはステップの１つ以上を含むものとする。具体的には、請求項において、ある項目を引用するときは、通常、少なくとも１つのそのような項目が存在することを意味し、そしてあるステップを引用するときは、そのステップの少なくとも１つのインスタンスが実行されることを意味する。
【０３８４】
[00409]  見出しは便宜上に過ぎない。所与の話題についての情報は、見出しがその話題を示す章以外で見出されることもある。
【０３８５】
[00410]  提出された全ての請求項および要約書は、明細書の一部である。
【０３８６】
[00411]  以上、例示的な実施形態について図面に示し以上で説明したが、請求項に明記した原理および概念から逸脱することなく、多数の変更を行うことができること、そしてこのような変更が必ずしも抽象的な概念全体を包含しないことは、当業者には明白であろう。主題について、構造的特徴および／または手順的アクトに特定の文言で説明したが、添付する請求項において定められる主題は、必ずしも、請求項の上で説明した特定の技術的特徴やアクトに限定されないことは理解されよう。所与の定義または例において識別されたあらゆる手段または態様または技術的効果が、あらゆる実施形態に存在することも、あらゆる実施形態において利用されることも必要でない。逆に、説明した特定の特徴およびアクトならびに効果は、請求項を実施するときの考慮のために、例として開示されたまでである。
【０３８７】
[00412]  全体の抽象的な理念を包み込むには足りないが請求項の均等の意味および範囲に該当する全ての変更は、法律によって認められる最大限の範囲まで、それらの範囲内に受け入れられるものとする。
【図１】
2021523444.tif 000012
【図２】
2021523444.tif 000013
【図３】
2021523444.tif 000014
【図４】
2021523444.tif 000015
【図５】
2021523444.tif 000016
【図６】
2021523444.tif 000017
【図７】
2021523444.tif 000018
【図８】
2021523444.tif 000019
【図９】
2021523444.tif 000020
【図１０】
2021523444.tif 000021
【図１１】
2021523444.tif 000022
【図１２】
2021523444.tif 000023
【図１３】
2021523444.tif 000024
【図１４】
2021523444.tif 000025
【国際調査報告】
2021523444.tif 000026
2021523444.tif 000027