JP2016529582A - ネイティブモードでの実行から解釈済みモードでの実行への移行によるネイティブコードのデバッグ - Google Patents

ネイティブモードでの実行から解釈済みモードでの実行への移行によるネイティブコードのデバッグ Download PDF

Info

Publication number
JP2016529582A
JP2016529582A JP2016518389A JP2016518389A JP2016529582A JP 2016529582 A JP2016529582 A JP 2016529582A JP 2016518389 A JP2016518389 A JP 2016518389A JP 2016518389 A JP2016518389 A JP 2016518389A JP 2016529582 A JP2016529582 A JP 2016529582A
Authority
JP
Japan
Prior art keywords
program
code
debugging
debug
native
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2016518389A
Other languages
English (en)
Other versions
JP6573875B2 (ja
Inventor
コルタシェヴ,ミハイル
カンデルワル,ニキル
ガンディー,アクロシュ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2016529582A publication Critical patent/JP2016529582A/ja
Application granted granted Critical
Publication of JP6573875B2 publication Critical patent/JP6573875B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Landscapes

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

Abstract

【課題】ネイティブモードでの実行から解釈済みモードでの実行への移行によるネイティブコードのデバッグを実現する。【解決手段】デュアルモードデバッガは、ネイティブコードまたは解釈済みコードをデバッグすることができる。モードの移行は、定義された脱出条件によりトリガすることができる。プログラムは、デバッガを適用し、デバッガの下でプログラムをネイティブコードにコンパイルすることにより、デバッグすることができる。プログラム内の定義されたポイントで、デバッグをネイティブモードから解釈済みモードに移行させることができる。【選択図】図1d

Description

[0001] コンパイラは、ソースコードを、特定のプロセッサにより実行できるコードにコンパイルすることにより、実行可能コードを作成することができる。この種のプロセッサ固有コードは、「ネイティブコード」と呼ばれる。ネイティブコードは、特定の種類のプロセッサにより実行することは可能だが、任意の種類のプロセッサにより実行することはできないマシン命令である。別の種類のコンパイラは、ソースコードを受け取り、プロセッサに固有ではない中間コードまたは仮想マシンバイトコードを作成することができる。中間コードは、典型的には、中間言語コンパイラ(たとえば、ジャストインタイム(JIT)コンパイラ)によって受け取られ、プログラムを実行する直前にネイティブコードにコンパイルされる。中間コードは、プラットフォームに固有ではない。
[0002] インタープリタは、ソースコードまたは中間コードを読み取り、コードをネイティブコードに翻訳することなくステートメントごとに実行する。典型的には、コードの解釈は、ネイティブコードの実行よりも低速である。コードの解釈は、典型的には、中間コードをネイティブコードにジャストインタイムでコンパイルしてネイティブコードを実行するよりも低速である。
[0003] 解釈済みコードのデバッガの実装は、ネイティブコードのデバッガの実装よりも、典型的には簡単である。しかし、応答時間は、典型的にはネイティブコードのデバッガのほうが解釈済みコードのデバッガよりも高速である。デバッガは、典型的には、関数へのステップインまたはステップアウト、関数のステップオーバ、実行の中断と再開、変数またはスタック位置の現在の値の検査などにより、プログラムの実行を制御する機能をユーザに提供する。
[0004] 本明細書で説明されるデュアルモードデバッガは、プログラムを表すネイティブコードをデバッグすることができる。デバッグされているプログラム内で定義されたデバッグ脱出条件の検出に応じて、デバッガは、プログラムを表すネイティブコードのデバッグを停止し、プログラムを表す対応する解釈済みコードのデバッグに移行することができる。ネイティブモードで、デバッガは、プログラムを表すネイティブコードをデバッグすることができる。プログラム変数および/またはスタック情報の現在の値の検査および/または変更を提供するデバッグ操作は、ネイティブモードで実行することができる。ネイティブモードのデバッグでは、変数がレジスタに保存されるたびに(たとえば、変数がプログラムで定義されるたびに)、値も関数のスタック位置に保存することができる。デバッグされている関数の変数は、デバッグされているプログラム用に予約された、スタックの特定のローカル領域に保存することができる。スタックの同じ領域を、ネイティブコードへのコンパイル中に、スピルに使用することができる(すなわち、ライブ変数がコンピューティングデバイスのレジスタよりも多いとき、変数がレジスタからメモリに「あふれ出る」ことがある)。スタック位置は、デバッガにより変数の値を取得および変更するために使用され得る。
[0005] 脱出条件の検出に応じて、プログラムを表すネイティブコードのデバッグを停止することができる。インタープリタは、デバッグされているネイティブコードに対応する、プログラムを表す解釈済みコードを受け取り、解釈済みモードで実行されている、プログラムの解釈済みコードのデバッグを再開することができる。たとえば、デバッグされているプログラムの実行を制御するデバッグ操作は、解釈済みモードで実行することができる。実装制御操作は、非同期ブレーク、ステップ操作、ブレークポイント、および/または例外操作でのブレークにより実装され得る。インタープリタモードのデバッグを最上位の関数(変数値がスタックの最上位フレームに位置する関数)のデバッグに使用しながら、ネイティブモードを使用してプログラムの他の部分をデバッグすることができる。
[0006] デバッガは、定義された脱出ポイントで、ネイティブモードでのデバッグから解釈済みモードでのデバッグに移行することができる。デバッガに関連する脱出エンジンは、デバッガの下で実行されているネイティブコードの現在の状態を含む脱出レコードを受け取ることができる。脱出エンジンは、インタープリタのインスタンスを作成し、インタープリタのインスタンス用のインタープリタスタックフレームを作成し、インタープリタのインスタンス用に作成されたインタープリタスタックフレームに脱出レコードの変数を追加することができる。プログラムのデバッグは、プログラムの対応する類似の解釈済みコードで再開することができる。デバッグ脱出ポイントは、特定の脱出条件が満たされる場合にネイティブモードのデバッグが解釈済みモードのデバッグに移行し得る、プログラム内の位置である。関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数またはライブラリの呼び出しが戻ったとき、またはデバッガステートメントに遭遇したとき等のデバッグ脱出ポイントを、プログラムに対して定義することができる。デバッグセッションでデバッグ脱出ポイントに遭遇したとき、実行時デバッグフラグの状態と、スタックフレームのスタック深度検査とを使用して、デバッグ脱出条件が満たされるか否かを判断することができる。デバッグ脱出条件が満たされる場合、デバッガの下で実行されているネイティブコードに対応するコードをインタープリタに送り、対応する解釈済みコードでデバッグを進めることができる。
[0007] この発明の概要は、以下の詳細な説明でさらに説明される概念のいくつかを、簡単な形式で紹介するために設けられている。この発明の概要は、特許請求の範囲に記載された主題の主要な特徴または必須の特徴を特定することを意図したものではなく、特許請求の範囲に記載された主題の範囲を限定するために使用されることを意図したものでもない。
[0008]受け取ったドキュメントのページをレンダリングするブラウザアプリケーションを含むシステム100の例を示す図である。 本明細書で開示される主題の態様に基づいて、コンパイル済みコードの実行からコードの解釈に移行できるランタイムエンジンを備えるシステム200の例を示す図である。 本明細書で開示される主題の態様に基づいて、コンパイル済みコードの実行からコードの解釈に移行できるランタイムエンジンを含むシステム300の例を示す図である。 本明細書で開示される主題の態様に基づいて、ネイティブモードから解釈済みモードに移行することによりコードをデバッグできるシステム400の例を示す図である。 本明細書で開示される主題の態様に基づいて、ネイティブコードのデバッグから解釈済みコードのデバッグに移行する方法250の例を示す図である。 本明細書で開示される主題の態様に基づくコンピューティング環境の例のブロック図である。 本明細書で開示される主題の態様に基づく統合開発環境(IDE)の例のブロック図である。
概要
[0009] プログラムは、ネイティブコードにコンパイルし、そのネイティブコードをデバッグすることで、デバッグすることができる。プログラム内の定義済みのポイントで、デバッグをネイティブモードから解釈済みモードに移行させ、デバッグを解釈済みコードで続行することができる。実行制御、すなわち実行の中断、実行の続行、コードのセクションのステップイン、ステップアウト、またはステップオーバ等を含むデバッグ操作は、解釈済みモードで発生させることができる。変数の検査および変更を含むデバッグ操作は、ネイティブモードで発生させることができる。デュアルモードデバッガは、ネイティブモードデバッグの速度と、解釈済みモードデバッグの容易さとを組み合わせることができる。
ネイティブモードでの実行からインタープリタモードでの実行に移行することによるネイティブコードのデバッグ
[0010] 図1aは、本明細書で開示される主題の一部の態様に基づくウェブブラウジング環境100の例を示す。図1aに示すように、環境100は、コンピューティングデバイス102、サーバ104、ネットワーク106、およびブラウザアプリケーション108の1つまたは複数を含むことができる。ウェブブラウジング環境100は、当技術分野で知られている他の構成要素を含み得る。
[0011] コンピューティングデバイス102は、デスクトップコンピュータ(たとえば、パーソナルコンピュータ等)、携帯型コンピュータもしくはコンピューティングデバイス(たとえば、Palm(登録商標)デバイス、RIM Blackberry(登録商標)デバイス、個人用デジタル補助装置(PDA)、ラップトップコンピュータ、ノートブックコンピュータ、タブレットコンピュータ(たとえば、Apple iPad(商標)、ネットブック等)、携帯電話(たとえば、セルラー電話や、Apple iPhone、Google Android(商標)フォン、Microsoft Windows(登録商標)フォン等のスマートフォン)、または他の種類の携帯型デバイスを含む、任意の種類の据置型または携帯型のコンピューティングデバイスであり得る。サーバ104は、1つまたは複数のサーバを含む、1つまたは複数のコンピュータシステムで実装され得る。このコンピュータシステムは、本明細書に記載されるか、または本明細書に記載された対応する機能を実現できることがわかっている、任意の種類のコンピューティングデバイスであり得る。
[0012] コンピューティングデバイス102およびサーバ104は、ネットワーク106により通信可能に連結され得る。ネットワーク106は、PAN(パーソナルエリアネットワーク)、LAN(ローカルエリアネットワーク)、WAN(ワイドエリアネットワーク)、またはインターネットのようなネットワークの組み合わせ等である、1つまたは複数の通信リンクおよび/または通信ネットワークを含むことができる。コンピューティングデバイス102およびサーバ104は、ワイヤードおよび/またはワイヤレスのリンクを含む多様なリンクを使用して、ネットワーク106に通信可能に連結され得る。これらのリンクは、IEEE 802.11ワイヤレスLAN(WLAN)ワイヤレスリンク、ワールドワイドインターオペラビリティフォーマイクロウェーブアクセス(Wi-MAX)リンク、セルラーネットワークリンク、ワイヤレスパーソナルエリアネットワーク(PAN)リンク(たとえば、Bluetooth(登録商標)リンク)、イーサネット(登録商標)リンク、USBリンク等である。
[0013] ブラウザアプリケーション108は、コンピューティングデバイス102で実行できるプログラムであり得る。ブラウザアプリケーション108は、ネットワーク情報リソースの取得、提示、およびトラバースを可能にすることができる。情報リソースまたはオブジェクトは、ブラウザアプリケーション108により、統一リソース識別子(URI)等のネットワークアドレスを使用して取得することができる。情報リソースの例として、ウェブページ、画像、ビデオ、および他の形式のコンテンツがある。情報リソースに存在するハイパーリンクは、ユーザがブラウザで関連リソースに容易に移動することを可能にする。ブラウザアプリケーション108の例として、ワシントン州レドモンドのMicrosoft Corp.により開発されたInternet Explorer(登録商標)、カリフォルニア州マウンテンビューのMozilla Corp.により開発されたMozilla Firefox(登録商標)、カリフォルニア州クパチーノのApple Inc.により開発されたSafari(登録商標)、およびカリフォルニア州マウンテンビューのGoogle(登録商標)Chromeがあるが、これらに限定されない。
[0014] ブラウザアプリケーション108は、ネットワーク106を通じて、サーバ104からドキュメント112を取得することができる。ドキュメント112は、ハイパーテキストマークアップ言語(HTML)、ダイナミックHTML(DHTML)、拡張可能HTML(XHTML)、拡張可能マークアップ言語(XML)等のマークアップ言語のコードを含むウェブドキュメントであり得る。ドキュメント112は、DOM(ドキュメントオブジェクトモデル)オブジェクト114と、1つまたは複数のスクリプト116とを含むことができる。DOMオブジェクト114は、DOM慣例に基づいてドキュメント112で表される1つまたは複数のオブジェクトを含むことができる。DOM慣例は、オブジェクトを表現および対話操作するための、クロスプラットフォームな言語非依存の慣例である。DOMオブジェクト114は、ドキュメント112に直接含まれるオブジェクト、および/またはドキュメント112により参照されサーバ104もしくは他のサーバから独立して取得されるオブジェクトを含む可能性がある。スクリプト116は、DOMオブジェクト114に変更を加えることを可能にする動的言語(たとえば、JavaScript(登録商標)、VBScript、AJAX、Python、Perl等)に基づいて書式設定されたコードを含む。変更は、ユーザ入力、環境条件(たとえば、時刻または他の変数)等の要因に基づく変更を含む。スクリプト116のコードは、サーバ104に戻ることなく、DOMオブジェクト114のオブジェクトにその場でアクセスして変更することができる。
[0015] ブラウザアプリケーション108は、ドキュメント112を受け取る(たとえば、読み込む)ことができる。ブラウザアプリケーション108は、ドキュメント112の情報を書式設定し、書式設定された情報を表示する、ブラウザエンジン(たとえば、レイアウトエンジンまたはレンダリングエンジン)を含むことができる。たとえば、図1aに示すように、ブラウザアプリケーション108は、ドキュメント112に基づいて、コンピューティングデバイス102のディスプレイ110により表示されるページ118を生成することができる。ブラウザアプリケーション108は、ドキュメント112に埋め込まれるか、またはドキュメント112から独立しているがドキュメント112に関連付けられた、1つまたは複数のスクリプト116を実行するように構成され得る。
[0016] 図1bは、本明細書で開示される主題の一部の態様に基づくシステム200のブロック図を示す。システム200は、コンピューティングデバイス102等の1つまたは複数のコンピュータまたはコンピューティングデバイスを含むことができる。コンピューティングデバイス102は、プロセッサ143等の1つまたは複数のプロセッサと、メモリ145と、実行コントローラ309と、インタープリタ311と、JIT(ジャストインタイム)コンパイラ313等のコンパイラと、ストレージ315と、マシンコード実行器317と、脱出エンジン337とを備える。実行コントローラ309、インタープリタ311、JITコンパイラ313等のコンパイラ、ストレージ315、マシンコード実行器317、および脱出エンジン337は、メモリ145に読み込まれたときに1つまたは複数のプロセッサ143等に実行コントローラ309、インタープリタ311、JITコンパイラ313等のコンパイラ、マシンコード実行器317、および脱出エンジン337にそれぞれ帰属する動作を実行させる、1つまたは複数のプログラムモジュールとして実装され得る。システム200は、当技術分野で知られているが図示されていない他の構成要素を含み得る。
[0017] 実行コントローラ309、インタープリタ311、および/またはJITコンパイラ313は、ソースコードから生成されたバイトコードを受け取ることができる。ソースコードは、動的スクリプト言語を含むがこれらに限定されないプログラミング言語で記述された任意のソースコードであり得る。動的スクリプト言語は、JavaScript、VBScript、Python等を含むがこれらに限定されない。ソースコードを解析し、解析されたソースコードからバイトコードを生成することができる。バイトコード325と、プロファイル、ヒューリスティック、または他の情報とに基づいて、実行コントローラ309は、インタープリタ311とJITコンパイラ313のいずれかにバイトコード325を処理させることができる。インタープリタ311は、実行コントローラ309から受信されるインタープリタ制御信号により有効化されたときにバイトコード325を解釈するように構成され得る。JITコンパイラ313は、実行コントローラ309から受信されるコンパイラ制御信号により有効化されたときにバイトコード325をコンパイルするように構成され得る。
[0018] インタープリタ311がインタープリタ制御信号により有効化されると、インタープリタ311は、バイトコード325を解釈して実行することができる。インタープリタ311は、JavaScriptインタープリタ、VBScriptインタープリタ、Pythonインタープリタ、または本明細書に記載されるかもしくは公知である別の動的言語もしくは動的スクリプト言語のインタープリタとして実装され得る。これにより、ソースコードを、インタープリタ311の動作により少なくとも部分的に実行することができる。同様に、有効化のコンパイラ制御信号の受信に応じて、JITコンパイラ313はバイトコード325をコンパイルすることができる。JITコンパイラ313は、JavaScriptコンパイラ、VBScriptコンパイラ、Pythonコンパイラ、または本明細書に記載されるかもしくは公知である別の動的言語もしくは動的スクリプト言語のコンパイラとして実装され得る。JITコンパイラ313は「ジャストインタイム」コンパイラと呼ばれる。これは、バイトコード325の全体を実行前に事前コンパイルするのではなく、コンパイル済みのバイトコードが必要なとき(たとえば、実行が差し迫っているとき)に、特定のバイトコード部分がJITコンパイラ313によりコンパイルされ得るからである。JITコンパイラ313は、マシン実行可能コードまたは命令の形式を備えたコンパイル済みバイトコード333を生成することができる。
[0019] JITコンパイラ313は、上述した仮定に基づいて、コードの最適化を実行することができる。JITコンパイラ313は、生成するコンパイル済みバイトコードに、1つまたは複数の予め定義された脱出ポイントを挿入することができる。脱出ポイントごとに、脱出テーブル303等の脱出テーブルを作成することができる。脱出テーブルには、変数の位置、脱出ポイントの位置に対応するバイトコード325内またはソースコード内の位置、および他の情報を記録することができる。脱出テーブル303等は、スタックまたはレジスタで変数を見つけることができる場所を記述することができる。JITコンパイラ313は、1つまたは複数の脱出テーブルを生成し、それらを(たとえば、マシンコードとしての)最適化されたコンパイル済みバイトコードと共に保存することができる。脱出テーブルは、脱出テーブルの情報を符号化して変数の寿命が不必要に延びるのを避けることにより、最適化することができる。たとえば、変数xの値が定数10であることがわかっている場合、脱出時に、x=10を脱出テーブルで符号化して、値10をメモリまたはレジスタに格納しなくても復活させられるようにすることができる。同様に、複数の変数が同じ値である場合(たとえば、x=y)、その情報が脱出テーブルで符号化されていれば、脱出ポイントで、同じ値のすべての変数に対して脱出テーブルで同じ位置を使用することができる(たとえば、脱出テーブルの同じ位置を、xおよびyに使用できる)。これらの手法により、レジスタの割り当てが効率化される。最適化されたコンパイル済みバイトコードは、ストレージ315にコンパイル済みバイトコード333として格納して、プログラムの以降の実行中にシステム200からアクセスできるようにすることが可能である。
[0020] 最適化されたコンパイル済みバイトコードを実行するときは、最適化されたコンパイル済みバイトコード333がマシンコード実行器317(プロセッサ143等の1つまたは複数のプロセッサであり得る)により受け取られ得る。コンパイル済みバイトコードの実行は、スタック355のコンパイラフレーム341と関連付けることができる。各脱出ポイントで、最適化の基になった仮定が妥当であるか否かを判断することができる。仮定が妥当であるとの判断に応じて、最適化されたコンパイル済みコードを引き続き実行することができる。仮定が妥当でないとの判断に応じて、最適化されたコンパイル済みコードの実行を停止することができる。その脱出ポイントの脱出テーブルを、脱出エンジン337に渡すことができる。脱出エンジン337は、インタープリタが必要とする変数の状態(たとえば、値)を復元することができる。脱出エンジンは、スタック335の新しいフレーム(たとえば、インタープリタフレーム339)を作成することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン337は、変数の状態を非アクティブからアクティブに変更することにより、変数を復活させることができる。脱出エンジン337は、インタープリタ311のインスタンスを作成し、最適化されたコンパイル済みコードの脱出ポイントに対応するバイトコード内の位置と、すべての復元されたアクティブ変数の値を含む新たに作成されたインタープリタフレームとを、インタープリタに渡すことができる。よって、バイトコード325の生成元のソースコードをJITコンパイラ313およびマシンコード実行器317の動作により部分的に実行し、インタープリタ311により部分的に実行することができる。
[0021] 図1cは、本明細書で開示される主題の態様に基づくシステムの別の例である、システム300を示す。システム300は、コンピューティングデバイス102等のコンピューティングデバイスを含むことができる。コンピューティングデバイス102は、プロセッサ142等の1つまたは複数のプロセッサと、メモリ144と、ランタイムエンジンとを備える。ランタイムエンジンは、エンジンインターフェイス302、パーサ304、バイトコード生成器306、実行コントローラ308、インタープリタ310、JIT(ジャストインタイム)コンパイラ312等であるがこれに限定されないコンパイラ、ストレージ314、マシンコード実行器316、脱出エンジン336、およびスクリプトライブラリ318の1つまたは複数を備える。システム300は、当技術分野で知られているが図示されていない他の構成要素を含み得る。
[0022] 図1cに示すように、エンジンインターフェイス302は、スクリプトソースコード208を受け取ることができる。エンジンインターフェイス302は、存在していても、存在していなくてもよい。エンジンインターフェイス302が存在する代わりに、パーサ304をランタイムエンジンのインターフェイスとして構成することができる。存在する場合、エンジンインターフェイス302は、ホストを図1cのランタイムエンジンに結び付けるための1つまたは複数の方法を提供する通信インターフェイスであり得る。本明細書で開示される主題の一部の態様によると、エンジンインターフェイス302は、ワシントン州レドモンドのMicrosoft Corporationにより開発されたIActiveScriptに基づいて実装され得る。エンジンインターフェイス302は、ソースコード208をパーサ304に提供することができる。
[0023] パーサ304は、ソースコード208を受け取って解析することができる。パーサ304は、ソースコード208に対してトークン生成または字句解析を実行して、ソースコード208をシンボルまたはトークンとして書式設定することができる。パーサ304は、トークンのエラー検査を実行して、許容可能な式が形成されているか、構文エラーが存在しないか等を判断することができる。パーサ304は、解析されたソースコードを解析済みソースコード(図示せず)として出力することができる。解析済みソースコードは、任意の適切な形式を備えることができる。これには、パーサ304によりAST(抽象構文ツリー)コードとして生成された形式が含まれる。ASTコードは、当業者であればわかるように、ソースコード208の抽象構文構造のツリー表現を含む。
[0024] バイトコード生成器306は、解析済みソースコードを受け取ることができる。バイトコード生成器306は、解析済みソースコードをバイトコードに変換するように構成され得る。バイトコードは、インタープリタによる効率的な実行と、マシンコードへのさらなるコンパイルとを可能にするように構成された命令セットを含む。生成されたバイトコードは、解析済みソースコードを、数値コードおよび対応する任意選択のパラメータとして表すことができる。バイトコード生成器306は、生成されたバイトコード(図示せず)を出力することができる。バイトコードは、任意の適切な形式を備えることができる。これには、当業者であればわかるように、バイトコード生成器306によりpコード(移植可能コード)のかたちで生成された形式が含まれる。
[0025] 実行コントローラ308、インタープリタ310、およびJITコンパイラ312は、生成されたバイトコードをそれぞれ受け取ることができる。インタープリタ310またはマシンコード実行器316は、プロファイル生成器204を含むことができる。プロファイル生成器204は、生成されたバイトコードを分析してソースコード208に関する統計情報および追加の情報を収集するように構成され得る。プロファイル生成器204は、プロファイル情報320を生成することができる。プロファイル情報320は、収集された情報を含むことができ、ストレージ314に格納することができる。
[0026] 実行コントローラ308は、プロファイル情報320にアクセスすることができ、インタープリタ310およびJITコンパイラ312に通信可能に連結され得る。生成されたバイトコードおよびプロファイル情報320に基づき、実行コントローラ308はインタープリタ310およびJITコンパイラ312のいずれかを有効にして、生成されたバイトコードを処理させることができる。インタープリタ310は、実行コントローラ308から受信されるインタープリタ制御信号により有効化されたときに、生成されたバイトコードを解釈するように構成され得る。JITコンパイラ312は、実行コントローラ308から受信されるコンパイラ制御信号により有効化されたときに、生成されたバイトコードをコンパイルするように構成され得る。たとえば、ソースコード208の最初の実行時に、プロファイル情報320はまだ存在しない可能性がある。そのような場合、実行コントローラ308は、インタープリタ310を有効にして、生成されたバイトコードを解釈し、プロファイル情報320を生成することができる。ソースコード208の以降の実行時(たとえば、ソースコード208の最初の実行時の以降の時点、および/またはソースコード208の以降の実行時)に、実行コントローラ308は、プロファイル情報320に基づき、インタープリタ310を有効にしてソースコード208の一部を解釈し、JITコンパイラ312を有効にしてソースコード208の他の部分をコンパイルすることができる。
[0027] インタープリタ310がインタープリタ制御信号により有効化されると、インタープリタ310は、生成されたバイトコードを解釈して実行することができる。インタープリタ310は、JavaScriptインタープリタ、VBScriptインタープリタ、Pythonインタープリタ、または本明細書に記載されるかもしくは公知である他の動的言語のインタープリタとして実装され得る。これにより、ソースコード208を、インタープリタ310の動作により少なくとも部分的に実行することができる。
[0028] JITコンパイラ312がコンパイラ制御信号により有効化されると、JITコンパイラ312は、生成されたバイトコードをコンパイルすることができる。JITコンパイラ312は、JavaScriptコンパイラ、VBScriptコンパイラ、Pythonコンパイラ、または本明細書に記載されるかもしくは公知である別の動的言語のコンパイラとして実装され得る。JITコンパイラ312は「ジャストインタイム」コンパイラと呼ばれる。これは、バイトコードの全体を実行前に事前コンパイルするのではなく、コンパイル済みのバイトコードが必要なとき(たとえば、実行が差し迫っているとき)に、特定のバイトコード部分がJITコンパイラ312によりコンパイルされ得るからである。JITコンパイラ312は、マシン実行可能コードまたは命令の形式を備え得るコンパイル済みバイトコード332を生成することができる。
[0029] JITコンパイラ312は、上述した仮定に基づいて、コードの最適化を実行することができる。JITコンパイラ312は、生成するコンパイル済みバイトコードに、1つまたは複数の予め定義された脱出ポイントを挿入することができる。脱出ポイントごとに、脱出テーブル303等の脱出テーブルを作成することができる。脱出テーブルには、変数の位置、脱出ポイントの位置に対応する生成されたバイトコード内の位置等を記録することができる。脱出テーブルは、スタックまたはマシンコードのレジスタで変数を見つけることができる場所を記述することができる。JITコンパイラ312は、テーブルを生成し、最適化されたコンパイル済みバイトコード332(たとえば、マシンコード)と共に保存することができる。最適化されたコンパイル済みバイトコード332は、ストレージ314にコンパイル済みバイトコード332として格納して、プログラムの以降の実行中にシステム300からアクセスできるようにすることが可能である。
[0030] 最適化されたコンパイル済みバイトコードを実行するときは、最適化されたコンパイル済みバイトコード332がマシンコード実行器316(プロセッサ142等の1つまたは複数のプロセッサであり得る)により受け取られ得る。各脱出ポイントで、最適化の基になった仮定が妥当であるか否かを判断することができる。仮定が妥当であるとの判断に応じて、最適化されたコンパイル済みバイトコード332を引き続き実行することができる。仮定が妥当でないとの判断に応じて、最適化されたコンパイル済みコードの実行を停止することができる。その脱出ポイントの脱出テーブルを、脱出エンジン336に渡すことができる。脱出エンジン336は、インタープリタが必要とする変数の状態(たとえば、値)を復元することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン336は、変数の状態を非アクティブからアクティブに変更することにより、変数を復活させることができる。脱出エンジン336は、インタープリタ310のインスタンスを作成し、最適化されたコンパイル済みコードの脱出ポイントに対応するバイトコード内の位置と、変数およびその位置とを、インタープリタに渡すことができる。よって、バイトコードの生成元のソースコードをJITコンパイラ312およびマシンコード実行器316の動作により部分的に実行し、インタープリタ310により部分的に実行することができる。
[0031] 脱出を使用することで、複数の最適化が可能となる。多くの動的プログラミング言語における変数は、日付、文字列、配列、整数等であり得る。一部の動的言語では、変数用のオブジェクトが作成され、レジスタおよび後にテーブルに格納される位置が、オブジェクトへのポインタを含む。オブジェクト自体は、オブジェクトの説明およびオブジェクトのデータを格納することができる。よって、変数aが文字列である場合、その文字列のオブジェクトを作成し、オブジェクトへのポインタを格納し、オブジェクト自体で変数aが文字列であることを特定し、文字列自体(たとえば、「Hello World」)を指定することができる。変数がプロファイルデータに基づいて整数であると仮定される場合、この方式の最適化の1つは、整数用に作成されたオブジェクトへのポインタ、またはその整数オブジェクトを表現および記述する符号化された値ではなく、整数自体を変数に格納することである。整数オブジェクトを直接符号化する方式の1つは、単語のビットの1つを使用して、値が整数であることを示すインジケータを格納することである。よって、32ビットプロセッサの場合、32ビットのうちの1ビットで、残りの31ビットの内容が整数値を表していることを示すか、または残りの31ビットの内容が整数値を表していないことを示すことができる。
[0032] 図1dは、本明細書で開示される主題の態様に基づいて、ネイティブモードでの実行から解釈済みモードでの実行に移行することによりネイティブコードをデバッグできるシステム400の例を示す。システム400のすべてまたは一部は、図3に関連して以下に説明するコンピュータ等の、1つまたは複数のコンピュータまたはコンピューティングデバイスに存在し得る。システム400は、本明細書に記載されたデバッガ等が追加された図1bおよび/または図1cに示すシステムを含むことができる。システム400またはその一部は、スタンドアロンシステム、またはプラグインもしくはアドインとして提供され得る。システム400は、図4に関連して説明するソフトウェア開発コンピュータなどのソフトウェア開発コンピュータで全体的または部分的に実行され得る。システム400のすべてまたは一部は、プログラム開発ツールにより操作され得る。たとえば、システム400のすべてまたは一部は、図4に関連して詳細に説明する統合開発環境(IDE)や別のIDE等のIDE内で実行され得る。システム400は、IDEの外部で全体的または部分的に実行することができる。システム400は、Microsoft Internet Explorer(登録商標)、MozillaのFirefox、または既知もしくは将来開発される任意のブラウザ等のブラウザ内で動作するか、またはそれらのブラウザに関連付けられ得る。システム400はブラウザ内での動作またはブラウザとの関連付けに限定されないことが理解される。
[0033] システム400またはその一部は、(たとえば、クラウド内の)サービスから取得した情報を含み得るか、またはクラウドコンピューティング環境で動作し得る。クラウドコンピューティング環境は、コンピューティングサービスが所有されるのではなくオンデマンドで提供される環境であり得る。たとえば、情報はネットワーク化されたクラウドの複数のデバイスに存在する可能性があり、および/またはデータをクラウド内の複数のデバイスに保存することができる。
[0034] システム400は、プロセッサ142等の1つまたは複数のプロセッサと、メモリ144と、言語コンパイラ404、JITコンパイラ408、脱出エンジン414、デバッガ416、インタープリタ418、および/またはデバッグ情報を表示できるデバッガディスプレイ420の1つまたは複数とを含むことができる。言語コンパイラ404、JITコンパイラ408、脱出エンジン414、デバッガ416、およびインタープリタ418は、メモリ144に読み込まれたときに1つまたは複数のプロセッサ142等に言語コンパイラ404、JITコンパイラ408、脱出エンジン414、デバッガ416、および/またはインタープリタ418にそれぞれ帰属する動作を実行させる、1つまたは複数のプログラムモジュールとして実装され得る。システム400は、当技術分野で知られているが図示されていない他の構成要素を含み得る。
[0035] 図1dに示すように、システム400は、言語コンパイラ404等の言語コンパイラを含むことができる。言語コンパイラ404は、特定のプログラミング言語で記述されたソースコードを受け取り、そのソースコードから中間言語(IL)406等の中間言語を生成することができるコンパイラであり得る。ソースコードの一部またはすべてを言語コンパイラ404で処理して、IL406等の中間言語を生成することができる。言語コンパイラ404は、ソースコード402等のソースコードまたはその一部を受け取ることができる。ソースコード402は、任意のプログラミング言語で記述することができる。ソースコード402またはその一部は、ソースコード402をインタープリタ418に送ることで解釈することができる。よって、ソースコード402の一部がコンパイルされ得る。ソースコード402の一部が解釈され得る。プログラム部分がコンパイルされるか解釈されるかは、パフォーマンスのヒューリスティックに基づき得る。特定のプログラム部分がネイティブモードでより速く実行される場合、そのプログラム部分はネイティブモードにコンパイルされ得る。特定のプログラム部分が解釈済みモードでより速く実行される場合、そのプログラム部分は解釈され得る。
[0036] 図1dに示すように、システム400は、JITコンパイラ408等のJITコンパイラを含むことができる。JITコンパイラ408は、IL406等の中間言語を受け取り、その中間言語からネイティブコード410等のネイティブコードを生成することができる。ネイティブコード410は、実行のためにプロセス412等のプロセスに読み込まれ得る。JITコンパイラ408は、JavaScriptコンパイラ、VBScriptコンパイラ、Pythonコンパイラ、または本明細書に記載されるかもしくは公知である別の動的言語もしくは動的スクリプト言語のコンパイラとして実装され得る。JITコンパイラ408は「ジャストインタイム」コンパイラと呼ばれる。これは、ネイティブコード全体を実行前に事前コンパイルするのではなく、コンパイル済みのネイティブコードが必要なとき(たとえば、実行が差し迫っているとき)に、特定のプログラム部分がJITコンパイラ408によりコンパイルされ得るからである。JITコンパイラ408は、マシン実行可能コードまたは命令の形式を備えたコンパイル済みネイティブコードを生成することができる。
[0037] JITコンパイラ408は、上述した仮定に基づいて、コードの最適化を実行することができる。JITコンパイラ408は、生成したコンパイル済みコードに、1つまたは複数の定義済みのデバッグ脱出ポイントを挿入することができる。デバッグ脱出ポイントは、特定のデバッグ脱出条件が満たされる場合にネイティブモードのデバッグが解釈済みモードのデバッグに移行し得る、プログラム内の位置である。関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数またはライブラリの呼び出しが戻ったとき、またはデバッガステートメントに遭遇したとき等のデバッグ脱出ポイントを、プログラムに対して定義することができる。デバッグ脱出が発生したとき、ネイティブコードの実行を停止することができる。ネイティブコードで実行されているプログラムの現在の状態を、デバッグ脱出レコードにキャプチャすることができる。デバッグ脱出レコードは、現在の実行ポイント、デバッグ脱出ポイントの位置に対応するソースコード402内の位置、変数値、ならびに変数値がレジスタのどこに配置されているかおよび/もしくは変数値がスタックのどこに配置されているかを記録することができる。そのデバッグ脱出ポイントのデバッグ脱出レコードを、脱出エンジンに渡すことができる。
[0038] 図1dに示すように、システム400は、脱出エンジン414等の脱出エンジンを含むことができる。脱出エンジン412は、1つまたは複数のデバッグ脱出レコードを受け取ることができる。脱出エンジン414は、インタープリタが必要とする変数の状態(たとえば、値)を復元することができる。脱出エンジン414は、スタックの新しいフレームを作成することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン414は、変数の状態を非アクティブからアクティブに変更することにより、非アクティブな変数を復活させることができる。脱出エンジン414は、インタープリタ418のインスタンスを作成し、ネイティブコードのデバッグ脱出ポイントに対応するソースコード内の位置と、すべての復元されたアクティブ変数の値を含む新たに作成されたインタープリタフレームとを、インタープリタに渡すことができる。デバッグ脱出位置が関数等のコードセクション内に位置している場合、デバッグが解釈済みモードで再開するポイントは、そのコードセクションの先頭であり得る(たとえば、デバッガは、デバッグ脱出ポイントに遭遇したポイントではなく、関数の先頭で再開することができる)。
[0039] デバッグ脱出がトリガされたとき、ネイティブコードのデバッグを停止することができる。ネイティブコードの実行を停止することができる。状態をデバッグ脱出レコードにキャプチャすることができる。デバッグ脱出レコードは、現在の実行ポイント、変数値、および変数値が配置されている場所を記録する。変数値は、CPUのレジスタに格納するか、またはネイティブスタックに格納することができる。その脱出ポイントのデバッグ脱出レコードを、脱出エンジン414に渡すことができる。脱出エンジン414は、インタープリタ用に作成されたスタックで、インタープリタが必要とする変数の状態(たとえば、値)を復元することができる。脱出エンジン414は、スタックの新しいインタープリタフレームを作成することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン414は、変数の状態を非アクティブからアクティブに変更することにより、変数を復活させることができる。脱出エンジン414は、インタープリタ418のインスタンスを作成し、ネイティブコード内のデバッグ脱出ポイントに対応するソースコード内の位置と、すべての復元されたアクティブ変数の値を含む新たに作成されたインタープリタフレームとを、インタープリタに渡すことができる。
[0040] 図1dに示すように、デバッガ416等のデバッガは、ネイティブコードをデバッグ用に受け取ることができる。本明細書に記載されるデバッガは、ネイティブモードで実行することができる。つまり、デバッガは、ネイティブコードでデバッグ操作を実行することができる。本明細書で開示される主題の一部の態様に基づくデバッガは、プログラム変数の現在の値とスタック情報とを、デバッグディスプレイでの表示用に提供することができる。変数の検査、式の評価、および変数の変更を含むデバッグ操作では、呼び出しスタックのネイティブフレームを使用することができる。変数がレジスタに保存される(たとえば、変数がプログラムで定義される)たびに、値も関数のスタック位置に保存することができる。特定のローカル変数の値の位置を追跡するために、本明細書に記載される主題の態様に基づいて、ローカル変数が定義される(すなわち、ローカル変数に値が割り当てられる)たびに、そのローカル変数をスタック位置に書き込むことができる。関数のローカル変数に使用されるスタック位置は、グループにまとめて、関数のローカル変数を1つのスタック領域で見つけられるようにすることが可能である。よって、特定の関数の任意のローカル変数の現在の値は、たとえネイティブコードがその変数にレジスタを使用していても、対応するスタック位置に常に存在する。スタックの同じ領域を、スピルに使用することができる(すなわち、ライブ変数がコンピューティングデバイスのレジスタよりも多いとき、変数がレジスタからメモリに「あふれ出る」ことがある)。スタック位置は、デバッガにより変数の値を取得および変更するために使用され得る。デバッガでの変数の変更をサポートするために、ローカル変数が格納されているスタックの領域に隣接して、インジケータを配置することができる。インジケータは、設定された場合に、デバッグされている関数のローカル変数がユーザによって変更されたことを示すフラグであり得る。デバッグされる関数は、最上位のスタックフレームの関数または下位のスタックフレームの関数であり得る。たとえば、ブレークポイントに遭遇したと仮定する。ユーザは、現在のスタックフレームではないスタックフレームに関連付けられた関数をネイティブモードで実行しながら、その関数に属するローカル変数の値を変更することができる。関数のローカル変数が変更されたことを示すフラグが、ユーザによりローカル変数が変更された関数に関連付けられたスタックフレームに設定される。
[0041] 関数メタデータは、関数で使用されるローカル変数の数に関する情報を含む。本明細書で開示される主題の一部の態様に基づき、ローカル変数の値を取得するために、デバッガは、ローカル変数の識別子と等価であるスタックの開始位置からのオフセットに存在するスタック位置の値を読み取ることで、ローカル変数の値を判断することができる。ローカル変数の値を変更するために、デバッガは、新しい値を対応するスタック位置に書き込み、変更済みローカル変数フラグ(スタックのローカル変数を格納できる領域に隣接して配置される)を設定して、関数のローカル変数が変更されたことを示すことができる。
[0042] ネイティブモードで実行されている関数に実行が戻ると、脱出エンジンは、変更済みローカル変数フラグを検査することができる。実行が戻った関数に対応するスタックフレームに対してローカル変数値が変更された場合、フラグが設定され、解釈済みモードへの脱出がトリガされる。脱出時に、ローカル変数の値を(レジスタからではなく)スタック位置から復元することができ、解釈済みモードで実行されているデバッガは、変更されたローカル変数の変更後の値を受け取る。
[0043] デバッガは、デバッグ脱出ポイントと呼ばれる、プログラム内の定義されたポイントで、ネイティブモードでの実行から解釈済みモードでの実行に移行することができる。デバッグ脱出ポイントは、関数の先頭、ループのバックエッジ(たとえば、カウンタがインクリメントされ、カウンタが範囲外であるか検査された後)、関数の呼び出しから戻ったとき、ライブラリの呼び出しから戻ったとき、ヘルパ関数の呼び出しから戻ったとき、デバッガ言語ステートメントに遭遇したとき等を含むが、これらに限定されない。本明細書に記載されるデバッガは、解釈済みモードで実行することができる。解釈済みモードで、デバッガは解釈済みコードをデバッグすることができる。たとえば、デバッグされているプログラムの実行を制御するデバッグ操作は、解釈済みモードで実行することができる。実行制御操作は、非同期ブレーク、ステップ操作、ブレークポイント、および/または例外操作でのブレークを通じて実装され得る。
[0044] 非同期ブレークは、たとえば、デバッグセッションのユーザが(たとえば、デバッガユーザインターフェイスで中断オプションをアクティブ化することにより)実行を中断したときに発生し得る。中断は、任意のタイミングで発生し得る。デバッガは、ユーザ操作から妥当な時間が経過した後に、プログラムの実行をブレークすることが予想される。関数の先頭、ループ等を含むがこれらに限定されないコード内の位置に検査を挿入することにより、ユーザ操作に対してタイムリーな応答を提供することができる。これに応じて、デバッガは、設定されたときにネイティブモードのデバッグから解釈済みモードのデバッグへの移行を強制する移行フラグを設定することができる。プロセスのスレッドごとに1つの移行フラグが提供され得る。ネイティブコードの実行が関数に入るか、またはループの先頭に移動したときに、移行フラグを調べることができる。移行フラグが設定されている場合、デバッグの脱出をトリガすることができ、実行をネイティブモードのデバッグから解釈済みモードのデバッグに移行することができる。関数に類似するソースコードを取得し、インタープリタに送ることができる。デバッガは、非同期ブレークを検出し、移行フラグをクリアすることができる。非同期ブレークは、実行をブレーク(停止)し、現在のプログラム状態をデバッガディスプレイに表示することにより、完了することができる。
[0045] ステップ操作は、関数にステップインするか、関数からステップアウトするか、または関数もしくは命令をステップオーバする、ユーザ指示の動作であり得る。各ステップデバッグ操作の開始時に、デバッガはステップ種類フラグとステップフレームベースフラグとを設定することができる。ステップフレームベースフラグは、現在の関数スタックフレームベースに設定することができる。ステップフレームフラグは、スタック深度を調べて再帰を検出するために使用することができる。本明細書で開示される主題の一部の態様に基づき、インタープリタモードへの移行は、実行によってステップ操作が開始されたときと同じ関数がスタックの上位のフレームに残るときは行われない。たとえば、現在の位置が関数Aであり、ユーザがステップアウトを実行し、それによって関数Aの呼び出し元である関数Bに戻ると仮定する。関数Aが、関数Aまたは関数Bであり得る別の関数を呼び出す場合、ステップが開始されたときの関数Aの最初のスタックフレームが依然としてスタックに存在する間に制御が関数A、関数B、または別の関数に戻ったときに、デバッグ脱出はトリガされない。
[0046] ステップアウト操作の場合、デバッガは、ステップ種類フラグをステップアウトに設定することができる。プログラムの実行は再開することができる。実行が現在の関数からネイティブモードで実行している別の関数に戻るとき、脱出エンジンは、ステップ種類フラグおよびステップフレームフラグが設定されているか否かを判断することができる。設定されている場合、現在のスタックフレームベースを、ステップフレームフラグに格納された値と比較することができる。現在のスタックフレームベースがステップフレームフラグに格納された値よりも大きい場合、スタックが小さいアドレスに向かって成長すると仮定すると、スタック深度が減少している。スタック深度の減少に応じて、インタープリタモードへの脱出をトリガすることができる。デバッガは、解釈済みコードのデバッグに移行することができる。実行を停止し、現在のプログラム状態をデバッガディスプレイに表示することができる。
[0047] ネイティブコードがネイティブモードで実行されている別の関数に入ったとき、またはステップイン操作が関数の最後のステートメントで行われて関数から戻る場合、これらのフラグの脱出検査が発生し、インタープリタモードデバッグへの脱出がトリガされる。デバッガは解釈済みモードで動作し、現在のプログラム状態をデバッガディスプレイに表示することができる。
[0048] ステップオーバデバッグ操作の場合、ステップオーバする関数は、インタープリタモードでの実行を強制されず、通常はネイティブモードで実行される。脱出は、ステップ操作が現在の関数の最後のステートメントで行われ、関数からの戻りにつながるときにのみ、トリガされ得る。スタック深度の減少に応じて、インタープリタモードのデバッグへの脱出がトリガされる。デバッガは、現在のプログラム状態をデバッガディスプレイに表示することができる。
[0049] ユーザが関数にブレークポイントを設定すると、デバッガは関数のブレークポイントの数を追跡するカウンタをインクリメントすることにより、関数メタデータを更新することができる。関数が実行されると(関数の実行が開始されるか、または関数が別の関数を呼び出し、呼び出された関数が呼び出した関数に戻ると)、デバッグ脱出をトリガする条件が検査される。現在の関数のブレークポイントカウントがゼロより大きい場合、デバッグ脱出をトリガすることができ、デバッガは解釈済みモードでの実行に移行することができる。デバッガは、ブレークポイントが設定されたステートメントで停止し、現在の実行ポイントをデバッガディスプレイに表示することができる。
[0050] 例外/例外後の続行のブレークポイントに遭遇した場合、デバッガの下で実行されているプログラムは、例外イベントをデバッガに通知し、例外を発生させたステートメントの後ろの次のステートメントから実行を続行するか、または実行を特定のステートメントで再開するように設定し、そのステートメントから続行することができる。デバッガに通知するために、ネイティブコードは「スローイングヘルパ」関数を使用し、すべてのスローがその関数を通じて転送されるようにすることができる。デバッガは、例外をスローしたステートメントで停止し、変数の値をデバッガディスプレイに表示することができる。
[0051] (例外がスローされたときにプログラムがネイティブモードで実行されていた場合に)次のステートメントに続行するために、コンパイラは、プログラム内の例外が発生し得るすべての場所を特定することができる。例外は、ヘルパ関数の呼び出しが行われたとき、またはライブラリ関数の呼び出しが行われたときに、明示的なスローステートメントによりスローされ得る。たとえば、オブジェクトからプロパティを削除するJavaScriptのdeleteステートメントは、オブジェクトがnullであるか、または未定義であるときに、例外をスローすることができる。この例外がスローされるのは、nullまたは未定義のオブジェクトは、いかなるプロパティも持たないからである。ここで、「ヘルパ」とは、典型的にはネイティブコードを使用して言語で(たとえば、JavaScriptエンジンで)実装された関数を意味し、オブジェクトからのプロパティの削除など、何らかの操作または言語コンストラクトを実行するために使用される。「ライブラリ関数」とは、ライブラリルーチンを実装する関数を意味する。たとえば、JavaScriptには、「string」など、複数のライブラリオブジェクトがある。「string」オブジェクトは、string.concatなど、複数の操作を含む。string.concatは、純粋な言語ルーチンではない。言語によっては、ライブラリ関数とヘルパ関数とを区別するのは合理的でないこともある。しかし、JavaScriptを含むがこれに限定されない一部の言語では、ライブラリの呼び出しは技術的にはスクリプト(すなわち、ユーザ)関数の呼び出しと同じであり、よってインターセプトされ得るという点で、ライブラリ関数とヘルパ関数は異なる。たとえば、ユーザはスクリプト関数をstring.concatに割り当てることができる。string.concatが次回呼び出されたとき、エンジンは元のstring.concat関数ではなく、新たに割り当てられたユーザ関数を呼び出す。ヘルパ関数はインターセプトされることはなく、典型的にはネイティブ/コンパイル済みコードで直接呼び出される。
[0052] ネイティブコードで例外が発生した後に続行するために、各ヘルパ呼び出しおよび各ライブラリ呼び出しを、try−catchステートメントブロックで囲むことができる。try−catchブロックの「try」部分で、ヘルパ関数を呼び出すことができる。元のヘルパ関数により返された値は、ローカル変数に保存することができる。try−catchブロックの「catch」部分で、解釈済みモードのデバッガで「例外の後に続行」オプションが有効になっている場合、例外続行フラグを設定することができる。try−catchブロックの「catch」部分の後、元のヘルパの値を返すことができる。例外の後に続行するためのデバッガ脱出検査を、ヘルパ関数の各呼び出しからの各戻りの後、またはライブラリの呼び出しからの各戻りの後に、挿入することができる。デバッグ脱出検査では、例外続行フラグを検査し、フラグが設定されている場合に、インタープリタモードへのデバッグ脱出をトリガすることができる。デバッガは、インタープリタモードに移行して、デバッガ内で続行のための実行制御を行えるようにすることができる。たとえば、「例外でブレーク」へのユーザ応答が命令のステップオーバである場合、デバッガは次のステートメントにステップする。「例外でブレーク」へのユーザ応答が続行である場合、デバッガは関数の残りの部分の実行を解釈済みモードで続行する。
[0053] デバッガは、デバッガディスプレイ420等のデバッガディスプレイデバイスに、デバッグ情報を表示することができる。デバッガは、呼び出しスタックからの情報、ローカル変数の値等をデバッガディスプレイに表示することができる。
[0054] 図2は、本明細書で開示される主題の態様に基づいて、ネイティブモードのデバッグから解釈済みモードのデバッグに移行することができる方法250を示す。図2に示す方法は、図1dに関連して説明したシステムを含むがこれに限定されないシステムにより実行することができる。方法250は順番に実行される一連の操作を示しているが、方法250は順序によって限定されないことが理解される。たとえば、一部の操作は、図示された順序とは異なる順序で発生し得る。加えて、ある操作が、別の操作と同時に発生することがあり得る。一部の例では、図示されたすべての操作が実行されるとは限らない。
[0055] 動作時に、図1dに示すシステム等のシステムは、以下のように動作することができる。操作251で、デバッグ脱出ポイントをプログラムに対して定義することができる。デバッグ脱出ポイントは、ネイティブモードのデバッグから解釈済みモードのデバッグへの移行が発生し得る、プログラム内のポイントである。デバッグ脱出ポイントは、関数の先頭、ループのバックエッジ(たとえば、カウンタがインクリメントされ、カウンタが範囲外であるか確認された後)、関数の呼び出しから戻ったとき、ライブラリの呼び出しから戻ったとき、ヘルパ関数の呼び出しから戻ったとき、デバッガ言語ステートメントに遭遇したとき等を含むが、これらに限定されない。プログラムがコンパイルされるときに、デバッグ脱出ポイントでデバッグ処理を挿入することができる。
[0056] 操作252で、デバッグセッションを開始することができる。デバッグセッションが開始されると、デバッガがアタッチされたプロセスで実行されているプログラムに対して以前に生成されたネイティブコードをすべて破棄することができる。操作254で、デバッグモードのネイティブコードを、デバッガがアタッチされたプログラムから生成することができる。デバッグモードのネイティブコードは、ネイティブコードのデバッグから解釈済みコードのデバッグへの移行に関連する処理を含み得る。デバッグモードのネイティブコードは、プロセスに読み込むことができる。関数がデバッグモードでネイティブコードにコンパイルされるとき、関数の各脱出ポイントで、1つまたは複数の脱出条件検査をネイティブコードに挿入することができる。脱出条件検査は、プログラムの内部ネイティブ表現を生成するコンパイル段階で挿入することができる。脱出条件検査は、脱出レコードのデータがキャプチャされるときに、コードに挿入することができる。脱出条件検査は、デバッガにより制御される多様なフラグまたはインジケータの状態(設定または未設定)もしくは値の検査を含み得る。
[0057] デバッグ脱出のインジケータまたはフラグは、設定された場合にデバッガがネイティブモードから解釈済みモードに移行することを示すインジケータ、設定された場合に関数にブレークポイントが含まれていることを示すインジケータ、再帰を検出するためのスタックアドレスを指定するインジケータ、実行されるステップ操作の種類を示すインジケータ、設定された場合にデバッガが実行しているステップ(ステップイン、ステップアウト、ステップオーバ)操作の種類を示すインジケータ、設定された場合に現在のスタックフレームでフィールドが変更されたこと示すスタックのインジケータ、および設定された場合に明示的な無条件の脱出を注入するために使用されるインジケータを含み得るが、これらに限定されない。
[0058] 操作256で、ネイティブコードをデバッグモードで実行することができる。実行がデバッグ脱出ポイントに到達したとき、多様な脱出条件を検査することができる。ある種類のデバッグ脱出シナリオで検査される脱出条件は、他の種類の脱出で検査される脱出条件と異なる可能性がある。たとえば、ユーザがデバッガの下で実行されているプログラムの実行を、関数の先頭またはループのバックエッジ(ループのカウンタがインクリメントされ、カウンタが範囲内であるか検査されるとき)で中断したと仮定する。デバッガは、関数の先頭またはループのバックエッジに挿入されたネイティブコードがネイティブコードをインタープリタモードに脱出させるフラグが設定されているか確認する場合に、ネイティブコードをインタープリタモードに脱出させるフラグを設定することができる。一方、ユーザがデバッガのUIで、関数にステップインするオプションを選択したと仮定する。デバッガは、要求されたステップ操作の種類を示すステップフラグを設定することができる。ネイティブコードにより実行される検査は、ステップフラグの値が「ステップイン」に設定されているとの判断に応じた脱出であり得る。ユーザ操作により、関数のどこかにブレークポイントが配置されたと仮定する。デバッガは、関数のブレークポイントの数を追跡するフラグをインクリメントすることができる。現在の関数のブレークポイントカウントがゼロより大きい場合、脱出がトリガされ、実行が解釈済みモードに移行する。
[0059] 実行がブレークポイントを含むフレームに到達すると、ネイティブコードでのプログラムの実行が停止し、脱出エンジンがデバッグ脱出レコードを受け取り、関数がインタープリタに送られ、解釈された関数のデバッグが関数の先頭から続行される。操作260で、少なくとも1つの脱出条件が操作258で満たされたとの判断に応じて、ネイティブモードでのデバッグを停止し、デバッグを解釈済みモードに移行することができる。ネイティブコードのデバッグから対応する解釈済みコードへの移行は、ユーザが開始した操作によりトリガされ得り、または明示的な無条件の脱出に遭遇したときにトリガされ得る。
[0060] 操作262で、インタープリタ変数を脱出レコードから復元することができる。いずれかの脱出条件が満たされる場合、実行状態(変数の位置および値、一時変数の位置および値、ならびにスタック値のスナップショットを作成し、デバッグ脱出レコードに保存することができる。デバッグ脱出レコードは、脱出エンジンに送ることができる。脱出エンジンは、インタープリタのインスタンスを作成し、インタープリタのインタープリタスタックフレームを設定することができる。操作264で、デバッグを解釈済みモードで再開することができる。操作258で脱出条件が検出されなかった場合、操作266で、ネイティブモードでのデバッグを続行することができる。
適切なコンピューティング環境の例
[0061] 本明細書で開示される主題の多様な態様のコンテキストを提供するために、図3および以下の説明は、本明細書で開示される主題の多様な実施形態が実装され得る適切なコンピューティング環境510について簡単に概説することを目的としている。本明細書で開示される主題について、1つもしくは複数のコンピュータまたは他のコンピューティングデバイスにより実行されるプログラムモジュール等のコンピュータ実行可能命令の文脈で説明するが、当業者は、本明細書で開示される主題の一部が他のプログラムモジュールとの組み合わせおよび/またはハードウェアとソフトウェアの組み合わせでも実装され得ることを理解する。一般に、プログラムモジュールは、特定のタスクを実行するか、または特定のデータ型を実装する、ルーチン、プログラム、オブジェクト、物理的アーチファクト、データ構造等を含む。典型的には、プログラムモジュールの機能は、多様な実施形態で必要に応じて組み合わされるか、または分散され得る。コンピューティング環境510は、適切な動作環境の一例に過ぎず、本明細書で開示される主題の使用または機能の範囲を限定することを意図したものではない。
[0062] 図3を参照すると、コンピュータ512の形式のコンピューティングデバイスが示されている。コンピュータ512は、少なくとも1つの処理ユニット514と、システムメモリ516と、システムバス518とを備え得る。少なくとも1つの処理ユニット514は、システムメモリ516等であるがこれに限定されないメモリに格納された命令を実行することができる。処理ユニット514は、利用できる多様なプロセッサのいずれかであり得る。たとえば、処理ユニット514は、グラフィック処理ユニット(GPU)であり得る。命令は、上述した1つまたは複数の構成要素またはモジュールにより実行される機能を実装する命令、または上述した1つまたは複数の方法を実行する命令であり得る。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャを処理ユニット514として利用することもできる。コンピュータ512は、ディスプレイ画面でのグラフィックのレンダリングをサポートするシステムで使用され得る。別の例では、コンピューティングデバイスの少なくとも一部は、グラフィック処理ユニットを備えたシステムで使用され得る。システムメモリ516は、揮発性メモリ520と、不揮発性メモリ522とを含み得る。不揮発性メモリ522は、読み取り専用メモリ(ROM)、プログラム可能ROM(PROM)、電気的プログラム可能ROM(EPROM)、またはフラッシュメモリを含み得る。揮発性メモリ520は、外部キャッシュメモリとして機能し得るランダムアクセスメモリ(RAM)を含み得る。システムバス518は、システムメモリ516を含むシステムの物理的アーチファクトを処理ユニット514に連結する。システムバス518は、メモリバス、メモリコントローラ、周辺機器バス、外部バス、またはローカルバスを含む複数の種類のいずれかであり得り、利用可能なバスアーキテクチャの任意の種類を使用し得る。コンピュータ512は、処理ユニット514によりシステムバス518を通じてアクセスされ得るデータストアを含み得る。データストアは、グラフィックレンダリングのための実行可能命令、3Dモデル、マテリアル、テクスチャ等を含み得る。
[0063] コンピュータ512は、典型的には、揮発性媒体、不揮発性媒体、リムーバブル媒体、非リムーバブル媒体等の多様なコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、その他のデータ等の情報を格納するための任意の方法または技術で実装され得る。コンピュータ可読媒体は、コンピュータ可読記憶媒体(コンピュータ記憶媒体とも呼ばれる)および通信媒体を含む。コンピュータ記憶媒体は、所望のデータを格納でき、コンピュータ512によりアクセスできる、RAM、ROM、EEPROM、フラッシュメモリもしくは他のメモリ技術、CDROM、デジタル多用途ディスク(DVD)もしくは他の光学ディスクストレージ、磁気カセット、磁気テープ、および磁気ディスクストレージもしくは他の磁気ストレージデバイスを含むがこれらに限定されない物理(有形)媒体を含む。通信媒体は、所望の情報を伝えるために使用でき、コンピュータ512によりアクセスできる、通信信号、変調搬送波、または任意の他の無形媒体を含むがこれらに限定されない媒体を含む。
[0064] 図3は、ユーザとコンピュータリソースとの間の仲介として機能することができるソフトウェアを示していることが理解される。このソフトウェアは、ディスクストレージ524に格納することができ、コンピュータ512のリソースを割り当てることができる、オペレーティングシステム528を含み得る。ディスクストレージ524は、インターフェイス526等の非リムーバブルメモリインターフェイスを通じてシステムバス518に接続されるハードディスクドライブであり得る。システムアプリケーション530は、システムメモリ516またはディスクストレージ524に格納されたプログラムモジュール532およびプログラムデータ534を通じて、オペレーティングシステム528によるリソースの管理を利用する。コンピュータは多様なオペレーティングシステムまたはオペレーティングシステムの組み合わせにより実装され得ることが理解される。
[0065] ユーザは、入力デバイス536を通じて、命令または情報をコンピュータ512に入力することができる。入力デバイス536は、マウス、トラックボール、スタイラス、タッチパッド等のポインティングデバイス、キーボード、マイク、音声認識システム、ジェスチャ認識システム等を含むが、これらに限定されない。これらの入力デバイスおよび他の入力デバイスは、インターフェイスポート538経由でシステムバス518を通じて処理ユニット514に接続される。インターフェイスポート538は、シリアルポート、パラレルポート、ユニバーサルシリアルバス(USB)等を表し得る。出力デバイス540は、入力デバイスと同じ種類のポートを使用し得る。モニタ、スピーカ、プリンタなど、特定のアダプタを必要とする出力デバイス540が存在することを示すために、出力アダプタ542が提供されている。出力アダプタ542は、出力デバイス540とシステムバス518との間の接続を提供するビデオカードおよびサウンドカードを含むが、これらに限定されない。他のデバイスおよび/もしくはシステム、またはリモートコンピュータ544等のデバイスは、入力機能と出力機能の両方を備え得る。
[0066] コンピュータ512は、リモートコンピュータ544等の1つまたは複数のリモートコンピュータへの論理接続を使用したネットワーク環境で動作することができる。リモートコンピュータ544は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイスまたは他の共通ネットワークノードであり得る。図3ではメモリストレージデバイス546のみが示されているが、リモートコンピュータ544は、典型的には、コンピュータ512に関連して上述した要素の多数またはすべてを含む。リモートコンピュータ544は、通信接続550を介して論理的に接続され得る。ネットワークインターフェイス548は、ローカルエリアネットワーク(LAN)やワイドエリアネットワーク(WAN)などの通信ネットワークを包含するが、他のネットワークも含み得る。通信接続550は、ネットワークインターフェイス548をバス518に接続するために利用されるハードウェア/ソフトウェアを示す。通信接続550は、コンピュータ512に対して内的または外的であり得り、モデム(電話、ケーブル、DSL、およびワイヤレス)、ISDNアダプタ、イーサネットカード等の内的および外的な技術を含む。
[0067] 図示されたネットワーク接続は単なる例であり、コンピュータ間の通信リンクを確立する他の手段が使用され得ることが理解される。当業者は、コンピュータ512または他のクライアントデバイスをコンピュータネットワークの一部として展開できることを理解することができる。これに関し、本明細書で開示される主題は、任意の数のメモリまたはストレージユニットと、任意の数のストレージユニットまたはボリュームで発生する任意の数のアプリケーションおよびプロセスとを備えた任意のコンピュータシステムに関し得る。本明細書で開示される主題の態様は、サーバコンピュータおよびクライアントコンピュータがネットワーク環境で展開され、リモートまたはローカルのストレージが含まれる環境に当てはまり得る。本明細書で開示される主題の態様は、プログラミング言語機能、解釈機能、および実行機能を備えたスタンドアロンのコンピューティングデバイスにも当てはまり得る。
[0068] 図4は、統合開発環境(IDE)600と、共通言語ランタイム環境602とを示す。IDE600は、ユーザ(たとえば、開発者、プログラマ、設計者、コーダ等)が、プログラム、一群のプログラム、ウェブサイト、ウェブアプリケーション、およびウェブサービスをコンピュータシステムで設計、コーディング、コンパイル、テスト、実行、編集、デバッグ、またはビルドすることを可能にし得る。ソフトウェアプログラムは、1つまたは複数のソースコード言語(たとえば、Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等)で作成されたソースコード(構成要素610)を含み得る。IDE600は、ネイティブコード開発環境を提供するか、仮想マシンで実行されるマネージコード開発を提供するか、またはそれらの組み合わせを提供し得る。IDE600は、Microsoft.NET(商標)Frameworkを使用したマネージコード開発環境を提供し得る。ソースコード構成要素610およびネイティブコード構成要素611から、モデリングツール652およびモデルストア653を使用する言語固有のソースコンパイラ620を使用して、中間言語構成要素650が作成され得り、アプリケーションの実行時に、中間言語構成要素650から、中間言語コンパイラ660(たとえば、ジャストインタイム(JIT)コンパイラ)を使用して、ネイティブコード構成要素611(たとえば、マシン実行可能命令)が作成される。つまり、中間言語(IL)アプリケーションが実行されると、中間言語(IL)アプリケーションは実行されているプラットフォームの適切なマシン語に実行中にコンパイルされる。よって、コードは複数のプラットフォームに移植可能となる。代替で、他の実施形態では、プログラムは目的のプラットフォームの適切なネイティブコードマシン語(図示せず)にコンパイルされ得る。
[0069] ユーザは、IDE600のユーザインターフェイス640およびソースコードエディタ651を使用して、既知のソフトウェアプログラミング手法と、特定のソース言語に関連する固有の論理的および構文的ルールとに基づき、ソースコード構成要素を作成および/または編集することができる。その後、ソースコンパイラ620を介してソースコード構成要素610をコンパイルすることができ、それによってアセンブリ630等のプログラムの中間言語表現が作成され得る。アセンブリ630は、中間言語構成要素650と、メタデータ642とを含み得る。アプリケーション設計を展開前に検証することが可能となり得る。
[0070] 本明細書に記載された多様な手法は、ハードウェアもしくはソフトウェアと関連して、または必要に応じてそれらの組み合わせと関連して、実装され得る。よって、本明細書に記載された方法および装置、またはそれらの方法および装置の特定の態様もしくは部分は、フロッピー(登録商標)ディスク、CD−ROM、ハードドライブ、任意の他のマシン可読記憶媒体等の有形の媒体に埋め込まれたプログラムコード(すなわち、命令)の形態をとり得る。このプログラムコードがコンピュータ等のマシンに読み込まれて実行されると、そのマシンが本明細書で開示される主題の態様を実行する装置となる。本明細書で使用される「マシン可読記憶媒体」という用語は、任意の形態の伝搬信号を提供する(すなわち、格納および/または送信する)すべての機構を除外すると解釈されるべきである。プログラム可能なコンピュータでプログラムコードを実行する場合、コンピューティングデバイスは、通常、プロセッサと、プロセッサにより読み取ることができる記憶媒体(揮発性および不揮発性のメモリおよび/またはストレージ要素を含む)と、少なくとも1つの入力デバイスと、少なくとも1つの出力デバイスとを備える。たとえばデータ処理API等の使用を通じて、領域固有のプログラミングモデル態様の作成および/または実装を利用できる1つまたは複数のプログラムは、コンピュータシステムとやり取りする高水準の手続き型またはオブジェクト指向型のプログラミング言語で実装され得る。ただし、プログラムは、必要に応じて、アセンブリまたはマシン語で実装され得る。いずれの場合も、言語はコンパイル形式またはインタープリタ形式の言語であり得り、ハードウェア実装と組み合わせられ得る。
[0071] 主題について構造的特徴および/または方法的行為に特有の文言で説明したが、添付の特許請求の範囲で定義される主題は、上述した特定の特徴または行為に必ずしも限定されないことを理解されたい。

Claims (10)

  1. コンピューティングデバイスの少なくとも1つのプロセッサと、
    前記コンピューティングデバイスのメモリと、
    前記メモリに読み込まれる少なくとも1つのプログラムモジュールを含むデバッガと
    を含み、前記プログラムモジュールが、前記少なくとも1つのプロセッサに、
    デバッグ脱出条件が満たされたことの検出に応じて、プログラムを表すネイティブコードのデバッグから、前記プログラムを表す対応する解釈済みコードのデバッグに移行させる、システム。
  2. 前記メモリに読み込まれる少なくとも1つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも1つのプロセッサに、
    前記デバッガの下で実行される前記ネイティブコードの現在の状態を受け取らせ、
    インタープリタのインスタンスを作成させ、
    前記インタープリタの前記インスタンス用のインタープリタスタックフレームを作成させ、
    前記インタープリタの前記インスタンス用の前記インタープリタスタックフレームに前記ネイティブコードの前記現在の状態を追加させる、請求項1に記載のシステム。
  3. 前記メモリに読み込まれる少なくとも1つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも1つのプロセッサに、
    関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数の呼び出しが戻ったとき、ライブラリの呼び出しが戻ったとき、またはデバッガステートメントに遭遇したときの少なくとも1つを含む、前記プログラムの定義済みの脱出位置を受け取らせる、請求項1に記載のシステム。
  4. 前記メモリに読み込まれる少なくとも1つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも1つのプロセッサに、
    実行制御操作を受け取ったことに応じて、前記プログラムを表す前記対応する解釈済みコードのデバッグに移行させる、請求項1に記載のシステム。
  5. 前記メモリに読み込まれる少なくとも1つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも1つのプロセッサに、
    変数の現在の値を変更するデバッグ操作を、前記プログラムを表す前記ネイティブコードのデバッグを含むネイティブモードで実行させる、請求項1に記載のシステム。
  6. コンピューティングデバイスのプロセッサにより、プログラムの少なくとも1つのデバッグ脱出位置を受け取るステップであって、前記少なくとも1つのデバッグ脱出位置が、前記プログラムから生成されたネイティブコード内の位置を含み、前記位置が、デバッグ脱出条件が満たされたとの判断に応じて、デバッグが前記ネイティブコードのデバッグから前記プログラムの対応する解釈済みコードのデバッグに移行する位置を含む、受け取るステップと、
    前記プログラムのデバッグセッションを開始するステップと、
    前記プログラムの以前に生成されたネイティブコードを破棄するステップと、
    ネイティブコードのデバッグから対応する解釈済みコードのデバッグへの移行に関連する処理を含む、デバッグ用のネイティブコードを生成するステップと、
    生成された前記ネイティブコードをデバッガの下で実行するステップと、
    前記デバッグ脱出条件が満たされたとの判断に応じて、前記デバッガの下で前記ネイティブコードの実行を解釈済みモードで続行するステップと、
    実行されている生成された前記ネイティブコードに関連する変数に対応するインタープリタ変数を復元するステップと、
    実行されている生成された前記ネイティブコード内の前記ネイティブコードのデバッグが停止したポイントに対応する前記解釈済みコード内のポイントで、前記プログラムのデバッグを解釈済みモードで再開するステップと
    を含む方法。
  7. 前記プログラムの前記少なくとも1つのデバッグ脱出位置を受け取るステップをさらに含み、前記少なくとも1つのデバッグ脱出位置が、関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数の呼び出しが戻ったとき、ライブラリが戻ったとき、または前記ネイティブコードでデバッガステートメントに遭遇したときのいずれかを含む、請求項6に記載の方法。
  8. 非同期ブレーク操作、ステップ操作、ブレークポイント、または例外操作でのブレークのいずれかを含む実行制御操作を含むデバッグ操作の受け取りに応じて、解釈済みモードのデバッグに移行するステップ
    をさらに含む、請求項6に記載の方法。
  9. 前記プログラムに関連するスタックのスタック深度を判断することにより、デバッグ脱出条件が満たされたと判断するステップ
    をさらに含む、請求項6に記載の方法。
  10. 実行されたときに、コンピューティングデバイスの少なくとも1つのプロセッサに、
    実行制御操作の受け取りを含む脱出デバッグ条件が満たされたとの判断に応じて、プログラムを表すネイティブコードのデバッグから、前記プログラムを表す対応する解釈済みコードのデバッグに移行させる
    コンピュータ実行可能命令を含むコンピュータ読取可能な記憶媒体。
JP2016518389A 2013-06-06 2014-06-03 ネイティブモードでの実行から解釈済みモードでの実行への移行によるネイティブコードのデバッグ Active JP6573875B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/911,108 2013-06-06
US13/911,108 US10127138B2 (en) 2013-06-06 2013-06-06 Debugging native code by transitioning from execution in native mode to execution in interpreted mode
PCT/US2014/040581 WO2014197406A1 (en) 2013-06-06 2014-06-03 Debugging native code by transitioning from execution in native mode to execution in interpreted mode

Publications (2)

Publication Number Publication Date
JP2016529582A true JP2016529582A (ja) 2016-09-23
JP6573875B2 JP6573875B2 (ja) 2019-09-11

Family

ID=51033543

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016518389A Active JP6573875B2 (ja) 2013-06-06 2014-06-03 ネイティブモードでの実行から解釈済みモードでの実行への移行によるネイティブコードのデバッグ

Country Status (11)

Country Link
US (1) US10127138B2 (ja)
EP (1) EP3005121B1 (ja)
JP (1) JP6573875B2 (ja)
KR (1) KR102171050B1 (ja)
CN (1) CN105683924B (ja)
AU (1) AU2014275115B9 (ja)
BR (1) BR112015030302B1 (ja)
CA (1) CA2913730A1 (ja)
MX (1) MX2015016740A (ja)
RU (1) RU2668973C2 (ja)
WO (1) WO2014197406A1 (ja)

Families Citing this family (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8732670B1 (en) 2010-06-29 2014-05-20 Ca, Inc. Ensuring determinism during programmatic replay in a virtual machine
US8909990B2 (en) 2012-08-04 2014-12-09 Microsoft Corporation Historical software diagnostics using lightweight process snapshots
CN103678340B (zh) * 2012-09-07 2016-09-14 腾讯科技(深圳)有限公司 浏览器引擎的运行方法、装置、浏览器及终端
US10289411B2 (en) * 2013-11-18 2019-05-14 Microsoft Technology Licensing, Llc Diagnosing production applications
US9612939B2 (en) 2014-10-29 2017-04-04 Microsoft Technology Licensing, Llc. Diagnostic workflow for production debugging
US9632915B2 (en) 2014-10-29 2017-04-25 Microsoft Technology Licensing, Llc. Historical control flow visualization in production diagnostics
US10089259B2 (en) * 2015-07-21 2018-10-02 BigStream Solutions, Inc. Precise, efficient, and transparent transfer of execution between an auto-generated in-line accelerator and processor(s)
US9772925B2 (en) * 2015-10-22 2017-09-26 Microsoft Technology Licensing, Llc Storage access debugging with disassembly and symbol entries
KR101769848B1 (ko) * 2015-12-30 2017-08-22 (주)비아이매트릭스 상용 인터프리터를 이용한 스크립트 기반 데이터 처리 시스템
CN107885650A (zh) * 2016-09-30 2018-04-06 联芯科技有限公司 一种程序调试方法及系统
EP3330859A1 (en) * 2016-12-05 2018-06-06 Universiteit Gent Self-debugging
US10169193B2 (en) 2016-12-13 2019-01-01 International Business Machines Corporation Common debug scripting framework for driving hybrid applications consisting of compiled languages and interpreted languages
US10846211B2 (en) * 2018-03-21 2020-11-24 Microsoft Technology Licensing, Llc Testing kernel mode computer code by executing the computer code in user mode
US10747645B2 (en) * 2018-04-27 2020-08-18 Microsoft Technology Licensing, Llc Selectively tracing portions of computer process execution
WO2020146011A1 (en) 2019-01-10 2020-07-16 Mentor Graphics Corporation Software checkpoint-restoration between distinctly compiled executables
US11150926B2 (en) 2019-02-22 2021-10-19 International Business Machines Corporation Native code generation for cloud services
CN110347570B (zh) * 2019-07-02 2021-08-10 昆明理工大学 一种ide环境下代码自动生成工具分析方法
CN112395185B (zh) * 2019-08-15 2024-04-12 腾讯科技(深圳)有限公司 一种程序测试的方法及相关装置
CN110597502B (zh) * 2019-08-20 2023-05-23 北京东方国信科技股份有限公司 一种基于java实现PL/SQL语言的单步调试方法
CN110569039A (zh) * 2019-09-10 2019-12-13 浪潮软件股份有限公司 一种java在平台优化运行的方法
CN110865940B (zh) * 2019-11-11 2022-04-05 腾讯科技(深圳)有限公司 一种程序卡顿定位的方法以及相关装置
US11748233B2 (en) * 2020-04-30 2023-09-05 Red Hat, Inc. Debugging a native compiled application from an integrated development environment
GB2594977B (en) * 2020-05-14 2022-10-05 Advanced Risc Mach Ltd Technique for collecting state information of an apparatus
US11226799B1 (en) * 2020-08-31 2022-01-18 International Business Machines Corporation Deriving profile data for compiler optimization
CN114237763B (zh) * 2021-12-23 2023-06-02 建信金融科技有限责任公司 提高组件首次加载速度的方法、装置、设备、介质及产品
CN114327776A (zh) * 2021-12-30 2022-04-12 支付宝(杭州)信息技术有限公司 用于智能合约的调试方法、调试设备和调试系统
CN116775501B (zh) * 2023-08-25 2023-12-12 荣耀终端有限公司 一种软件测试方法、服务器、可读存储介质及芯片系统

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62113244A (ja) * 1985-11-12 1987-05-25 Omron Tateisi Electronics Co プログラムテスト装置
JPH0434625A (ja) * 1990-05-30 1992-02-05 Yokogawa Electric Corp デバッグ・サポート装置
JPH08286896A (ja) * 1995-04-14 1996-11-01 Mitsubishi Electric Corp ソフトウェア開発方法及びソフトウェア開発システム
JPH10187489A (ja) * 1996-12-27 1998-07-21 Fujitsu Ltd 会話型デバッグ装置
JP2009252113A (ja) * 2008-04-09 2009-10-29 Canon Inc 情報処理装置、その制御方法及びコンピュータプログラム
EP2204739A1 (en) * 2008-12-30 2010-07-07 Sap Ag Defining a conditional breakpoint
US20110154300A1 (en) * 2009-12-18 2011-06-23 Microsoft Corporation Debugging From A Call Graph

Family Cites Families (40)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5058052A (en) * 1989-10-16 1991-10-15 Ge Fanuc Automation North America, Inc. Method for checking the syntax of an instruction list program to determine if the program is expressible as a relay ladder diagram by a programmable logic controller
EP0490478A2 (en) * 1990-12-14 1992-06-17 Tektronix Inc. Automatic compilation of model equations into a gradient based analog simulator
US5450575A (en) * 1991-03-07 1995-09-12 Digital Equipment Corporation Use of stack depth to identify machine code mistakes
US5339422A (en) * 1991-03-07 1994-08-16 Digital Equipment Corporation System and method for jacketing cross-domain calls in a multi-code execution and debugging system within a multi-architecture environment
US5956479A (en) * 1995-11-13 1999-09-21 Object Technology Licensing Corporation Demand based generation of symbolic information
US6158045A (en) * 1995-11-13 2000-12-05 Object Technology Licensing Corporation Portable debugging services utilizing a client debugger object and a server debugger object with flexible addressing support
US5732210A (en) * 1996-03-15 1998-03-24 Hewlett-Packard Company Use of dynamic translation to provide fast debug event checks
US5889981A (en) * 1996-05-07 1999-03-30 Lucent Technologies Inc. Apparatus and method for decoding instructions marked with breakpoint codes to select breakpoint action from plurality of breakpoint actions
US6275868B1 (en) * 1997-03-12 2001-08-14 Microsoft Corporation Script Engine interface for multiple languages
US5901315A (en) * 1997-06-13 1999-05-04 International Business Machines Corporation Method for debugging a Java application having native method dynamic load libraries
US6249907B1 (en) 1998-03-24 2001-06-19 International Business Machines Corporation Method system and article of manufacture for debugging a computer program by encoding user specified breakpoint types at multiple locations in the computer program
US6434741B1 (en) * 1998-04-30 2002-08-13 Hewlett-Packard Company Method and apparatus for debugging of optimized code using emulation
GB9825102D0 (en) 1998-11-16 1999-01-13 Insignia Solutions Plc Computer system
US7020879B1 (en) * 1998-12-16 2006-03-28 Mips Technologies, Inc. Interrupt and exception handling for multi-streaming digital processors
GB2358261B (en) 2000-01-17 2004-06-09 Advanced Risc Mach Ltd Data processing with native and interpreted program instruction words
US7080359B2 (en) * 2002-01-16 2006-07-18 International Business Machines Corporation Stack unique signatures for program procedures and methods
US7124407B1 (en) * 2000-08-16 2006-10-17 Sun Microsystems, Inc. Method and apparatus for caching native code in a virtual machine interpreter
US20020138821A1 (en) * 2001-01-23 2002-09-26 Vadim Furman Method and apparatus for seamless porting of object code between operating system environments
US6826746B2 (en) * 2001-03-08 2004-11-30 International Business Machines Corporation Debugger probe for object oriented programming
US7370320B1 (en) * 2001-07-24 2008-05-06 Adobe Systems Incorporated System and method for debugging programs run in a variety of environments
US6996814B2 (en) 2001-11-14 2006-02-07 Sun Microsystems, Inc. Method and apparatus for dynamically compiling byte codes into native code
US20030204838A1 (en) * 2002-04-30 2003-10-30 Eric Caspole Debugging platform-independent software applications and related code components
US7299454B2 (en) * 2003-02-26 2007-11-20 Bea Systems, Inc. Method for multi-language debugging
US7401323B2 (en) * 2003-04-21 2008-07-15 Microsoft Corporation Just-My-Code debugging
US20040267766A1 (en) * 2003-06-26 2004-12-30 Andreas Marek Defining user-defined data types and/or user-defined methods using an interpreted programming language
US7484209B2 (en) * 2003-08-12 2009-01-27 Hewlett-Packard Development Company, L.P. Instrumenting java code by modifying bytecodes
US7882492B2 (en) * 2004-09-17 2011-02-01 Oracle America, Inc. Intelligent computer program debugger, and system and method for implementing the same
US20060161896A1 (en) * 2005-01-14 2006-07-20 International Business Machines Corporation Performing debug requests that are within the debug domain of a class loader
DE102005045852A1 (de) * 2005-09-26 2007-04-05 Siemens Ag Verfahren und System zum Schutz von Quellcode
US8091071B2 (en) * 2006-08-21 2012-01-03 Sap, Ag Method and system for template-based code generation
CN101515248A (zh) 2008-02-21 2009-08-26 国际商业机器公司 面向对象程序的跟踪方法和系统
US8291389B2 (en) * 2008-08-21 2012-10-16 International Business Machines Corporation Automatically detecting non-modifying transforms when profiling source code
RU2390821C1 (ru) 2008-10-23 2010-05-27 Корпорация "САМСУНГ ЭЛЕКТРОНИКС Ко., Лтд." Способ динамической инструментации
US8997049B1 (en) * 2010-05-21 2015-03-31 Cadence Design Systems, Inc. Method and system for debugging of compiled code using an interpreter
US8484641B2 (en) * 2010-07-12 2013-07-09 International Business Machines Corporation Implementing a versioned virtualized application runtime environment
US20120117041A1 (en) 2010-11-08 2012-05-10 Verisign, Inc. Debugging a stored procedure in a database
US8572438B2 (en) * 2011-06-24 2013-10-29 Microsoft Corporation N-way runtime interoperative debugging
CN102855179A (zh) * 2011-06-30 2013-01-02 国际商业机器公司 虚拟机环境下的程序调试方法和系统
US8539463B2 (en) 2011-07-28 2013-09-17 Qualcomm Innovation Center, Inc. Apparatus and method for improving the performance of compilers and interpreters of high level programming languages
US20130132063A1 (en) * 2011-11-18 2013-05-23 Michael J. Rieschl Systems and methods for debugging just-in-time static translation in an emulated system

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62113244A (ja) * 1985-11-12 1987-05-25 Omron Tateisi Electronics Co プログラムテスト装置
JPH0434625A (ja) * 1990-05-30 1992-02-05 Yokogawa Electric Corp デバッグ・サポート装置
JPH08286896A (ja) * 1995-04-14 1996-11-01 Mitsubishi Electric Corp ソフトウェア開発方法及びソフトウェア開発システム
JPH10187489A (ja) * 1996-12-27 1998-07-21 Fujitsu Ltd 会話型デバッグ装置
JP2009252113A (ja) * 2008-04-09 2009-10-29 Canon Inc 情報処理装置、その制御方法及びコンピュータプログラム
EP2204739A1 (en) * 2008-12-30 2010-07-07 Sap Ag Defining a conditional breakpoint
US20110154300A1 (en) * 2009-12-18 2011-06-23 Microsoft Corporation Debugging From A Call Graph

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
BENJAMIN B. CHASE: "Selective Interpretation as a Technique for Debugging Computationally Intensive Programs", SIGPLAN'87, JPN7018002319, 24 June 1987 (1987-06-24), pages 113 - 124, XP055032070, ISSN: 0003990701 *
KERNEL DEBUGGING WITH WINDBG, JPN6018025901, 7 January 2013 (2013-01-07), ISSN: 0003990703 *
UXソフトウェア プログラミング環境 MKSPACEリファレンス (C言語版), vol. 第3版, JPN6018025903, 31 January 1995 (1995-01-31), pages 76 - 77, ISSN: 0003990702 *

Also Published As

Publication number Publication date
CA2913730A1 (en) 2014-12-11
CN105683924B (zh) 2019-03-19
US20140366007A1 (en) 2014-12-11
RU2015152048A3 (ja) 2018-05-17
KR102171050B1 (ko) 2020-10-28
AU2014275115B2 (en) 2019-07-11
AU2014275115A1 (en) 2015-12-10
RU2015152048A (ru) 2017-06-07
US10127138B2 (en) 2018-11-13
EP3005121A1 (en) 2016-04-13
AU2014275115B9 (en) 2019-07-25
JP6573875B2 (ja) 2019-09-11
BR112015030302B1 (pt) 2022-04-19
WO2014197406A1 (en) 2014-12-11
KR20160018522A (ko) 2016-02-17
CN105683924A (zh) 2016-06-15
MX2015016740A (es) 2016-08-03
BR112015030302A2 (pt) 2017-07-25
RU2668973C2 (ru) 2018-10-05
EP3005121B1 (en) 2019-03-06

Similar Documents

Publication Publication Date Title
JP6573875B2 (ja) ネイティブモードでの実行から解釈済みモードでの実行への移行によるネイティブコードのデバッグ
EP3788490B1 (en) Execution control with cross-level trace mapping
JP5415557B2 (ja) デバッギングのためのユーザ・スクリプト・コードの変換
US8621435B2 (en) Time debugging
US8972955B2 (en) Reducing network trips for remote expression evaluation
US20130205282A1 (en) Transferring program execution from compiled code to interpreted code
US9928156B2 (en) Missing include suggestions for external files
US8924437B2 (en) Memory usage data collection and analysis for dynamic objects
US8261243B2 (en) Selective execution of trace mechanisms for applications having different bit structures
CN112882925A (zh) 用于生产调试的诊断工作流程
JP2015524126A (ja) 適応的に移植性を有したライブラリ
Bouraqadi et al. Test-driven development for generated portable Javascript apps
US8875089B2 (en) Workspace model for interrelated projects
Risberg Alaküla et al. Property Probes: Source Code Based Exploration of Program Analysis Results
Alaküla et al. Property Probes
Olsson et al. Investigation of High-Level Language Support in a Resource-Constrained Embedded Environment

Legal Events

Date Code Title Description
A529 Written submission of copy of amendment under article 34 pct

Free format text: JAPANESE INTERMEDIATE CODE: A529

Effective date: 20160119

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170428

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180531

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180705

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180928

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190305

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190529

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

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20190718

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190814

R150 Certificate of patent or registration of utility model

Ref document number: 6573875

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250