(58)【調査した分野】(Int.Cl.,DB名)
前記デバッグ情報が前記ソフトウェアプログラムのコンパイル中に準備され、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックで使用されるデータのタイプ又は構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする請求項1に記載の装置。
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こすことが、コード分解モジュールとともに行われ、前記メモリ分析モジュールは前記メモリ破損で使用されるレジスタを少なくとも示すクラッシュログを受信し、前記メモリ分析モジュールは、前記メモリ破損から、前記ランタイムプログラム制御フロートレースにおいて前記コード分解モジュールにより逆探知を行い又は逆探知を引き起こし、前記メモリ破損で使用されるレジスタにロードし且つ前記レジスタで使用されるデータのタイプ又は構造と同じデータ又はタイプを使用する少なくとも1つの保存命令を、前記保存命令のセットの中で識別し、前記少なくとも1つの保存命令を、前記保存命令候補として識別する
ことを特徴とする請求項1に記載の装置。
前記保存命令候補及び前記リンクを返すことが、前記保存命令候補及び前記リンクを、インストルメンテーションモジュールに渡すことを含み、前記インストルメンテーションモジュールは、将来のデバッグ情報における保存命令候補を識別するために前記ソフトウェアプログラムを計測する
ことを特徴とする請求項1に記載の装置。
前記ランタイムプログラム制御フロートレースは、前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、プロセッサトレースモジュールから取得される
ことを特徴とする請求項1に記載の装置。
前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含む
ことを特徴とする請求項6に記載の装置。
前記デバッグ情報が前記ソフトウェアプログラムのコンパイル中に準備され、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックで使用されるデータのタイプ又は構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする請求項10に記載の方法。
前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、プロセッサトレースモジュールから前記ランタイムプログラム制御フロートレースを取得するステップ
を更に有することを特徴とする請求項10に記載の方法。
前記プロセッサトレースモジュールはハードウェアに基づくものであり、前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含み、前記ベーシックブロックのリストのうちの各ベーシックブロックは、前記ランタイムプログラム制御フロートレースにおけるノードであり、前記保存命令が、コンピュータにおいてメモリロケーションに対する値、ベクトル、マトリクス又は変数を記録する
ことを特徴とする請求項15に記載の方法。
前記ソフトウェアプログラムのコンパイルから前記デバッグ情報を取得する手段を更に有し、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックで使用されるデータのタイプ又は構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする請求項17に記載の装置。
前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、ランタイムプログラム制御フロートレースを決定するプロセッサトレースモジュール手段
を更に有することを特徴とする請求項17に記載の装置。
前記プロセッサトレースモジュール手段はハードウェアに基づくものであり、前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含む
ことを特徴とする請求項22に記載の装置。
命令を有するコンピュータプログラムであって、前記命令は、ソフトウェアプログラムのデバッグをコンピューティングデバイスに実行させ、前記ソフトウェアプログラムをデバッグすることは:
前記ソフトウェアプログラムからコンパイルされるコンパイルされたソフトウェアプログラム及びデバッグ情報を取得し;
前記コンパイルされたソフトウェアプログラムにおけるメモリ破損を識別し;
前記コンパイルされたソフトウェアプログラムのベーシックブロックのリストを有するランタイムプログラム制御フロートレースを取得し;
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こし;
前記保存命令のセットのうちの保存命令で使用されるデータのタイプ又は構造と前記メモリ破損で使用されるデータのタイプ又は構造とを前記デバッグ情報に基づいて識別し;
前記メモリ破損で使用されるデータのタイプ又は構造と同じタイプ又は構造を使用する保存命令候補を判別し、前記保存命令候補を前記ソフトウェアプログラムの一部分に結び付ける少なくとも1つのリンクを取得し;及び
前記保存命令候補及び前記リンクを返す;
ことを含むことを特徴とするコンピュータプログラム。
【発明を実施するための形態】
【0006】
図1はデバッグサーバー200がソフトウェアプログラムのメモリ破損をデバッグするために使用されるシステム100を示す。
【0007】
概して、(
図2に関連して更に図示及び説明される)デバッグサーバーは、ハードウェアユニットを有するプロセッサトレースモジュール224を有し、ハードウェアユニットは、ランタイムプログラム制御フロートレースを含むプログラム制御フロートレース情報を提供する。プロセッサトレースモジュール224は、例えば、デバッグサーバー200における1つ以上の中央処理ユニット210に組み込まれる又はそれと通信する1つ以上のインテル(登録商標)プロセッサトレースユニットであってもよい。
【0008】
プロセッサトレースモジュール224は、実行フローを記録し、後の時点で実行フローが再構築されることを可能にする。プロセッサトレースモジュール224は、個別ハードウェア手段を利用して、各々のハードウェアスレッドのソフトウェア実行に関する情報をキャプチャし(中央処理ユニット210において複数のプロセッサコアが存在することが仮定されている、或いは、あたかも同時マルチスレッディング(ハイパースレッディング(HyperThreading))がアクティブであるかのように、単独のコアが複数のスレッドを実行することが仮定されている)、そのため、実行が完了した後に、キャプチャされたトレースデータから、完全なプログラムフローが再構築されることが可能である。
【0009】
プロセッサトレースモジュール224は、データパケットで制御フロートレーシング情報をキャプチャ(又は取得)し、その情報は、例えば、ベーシックブロック、タイミング及びプログラムフロー情報(例えば、ブランチターゲット、分岐する/分岐しない指示)及びプログラム誘導モード関連情報(例えば、インテルTSX状態遷移、CR3変更)を含む。ベーシックブロックは、本願では、ソフトウェア命令へのエントリ以外に入る分岐を有しておらず、ソフトウェア命令の出口以外で出る分岐を有していないソフトウェア命令として規定される。プロセッサトレースモジュール224からの情報は、ベーシックブロック、ブランチターゲット及び行われた分岐を表現するノードとして表現されてもよい。しかしながら、プロセッサトレースモジュール224は、メモリロケーションのアドレスをリスト化するアドレストレース情報を提供しない。
【0010】
プロセッサトレースモジュール224からのパケットは、例えばデバッグサーバーモジュール300のようなメモリサブシステムに送信されて保存される前に、内部でバッファリングされる。保存される場合に、これらのパケットは、まとめて、ランタイムプログラム制御フロートレース(Runtime Program Control Flow Trace)310のレコードとして言及される。これらのパケットは「ランタイム(Runtime)」のように言及され、その理由は、それらが、コンパイルソフトウェアプログラム304の特定目的の実行中のような別の時間に収集されるのではなく、デバッグされるべきメモリ破損を生じさせるコンパイルソフトウェアプログラム304の通常のランタイムで収集されるからである。
【0011】
上述したように、メモリ破損は、デバッグされるプログラミングエラーの形式をしている。ウィンドウズ(登録商標)オペレーティングシステムを動作させるシステムにおけるアプリケーションクラッシュのうち約10%は、ヒープ破損(heap corruption)に起因することが推測されている。プログラミングエラーに起因してメモリロケーションが意図せずに変更されてしまう場合、メモリ破損が生じる。これは、そのようなエラーを減らそうとする技法やプログラミング言語の状況でさえ生じ得る。
【0012】
メモリ破損をデバッグする一般的な方法は、破損したメモリロケーションに書き込みを行ったベーシックブロックを特定し、それらのコンポーネントにデバッグの労力を注ぐことである。アドレストレースは、何れのベーシックブロックがメモリロケーションに書き込んだのかについての情報を提供するが、アドレストレースは、実現するには高価であり、特に、高速なアウトオブオーダーコアが高くつく。アドレストレースは、アドレストレース情報を記録するために大きな帯域幅オーバーヘッドを必要とする。
【0013】
プロセッサトレースモジュール224からのランタイムプログラム制御フロートレース310は、比較的コンパクトであり、小さな帯域幅オーバーヘッドしか必要としないが、何れのコードロケーションがメモリ破損を書き込んだかを発見するために必要なアドレストレース情報を提供しない。
【0014】
メモリ破損のデバッグでランタイムプログラム制御フロートレース310の利用を許容するために、ソフトウェアプログラムは、個々のプログラムソース104において又はデバッグサーバー300において局所的に、コンパイルされたソフトウェアプログラムにコンパイルされる。デバッグサーバー200においてローカルにコンパイルされる場合、ソフトウェアプログラムは、ソフトウェアプログラム302としてデバッグサーバーメモリ300に保存され;コンパイルされたソフトウェアプログラムは、コンパイルされたソフトウェアプログラム304としてデバッグサーバーメモリ300に保存される。コンパイルは、例えば、デバッグサーバー200におけるコンパイラーモジュール214のようなコンパイラーにより実行される。コンパイルは、実質的に実行の前になされてもよいし或いは「ジャストインタイム(just in time)」でなされてもよく、後者の場合、バイトコード又はプログラムソースコードをランタイムにネイティブのマシンコードにコンパイルする。
【0015】
コンパイルされる場合に又はコンパイルの最中に、デバッグ情報がコンパイラーにより準備されてもよい。デバッグ情報は、例えば、コンパイルされたソフトウェアプログラム304におけるベーシックブロックのリスト、ベーシックブロックのデータタイプ又はデータタイプの構造、各々のベーシックブロックの命令アドレスを、ソフトウェアプログラムの1つ以上の対応する部分にリンク又はマッピングするリンクを含んでもよい。デバッグ情報は、送信され、生成され、又は、デバッグサーバーモジュール300に存在し、それはデバッグ情報306レコードとして保存されてもよい。
【0016】
本願で更に説明されるように、デバッグ情報306のレコード及びランタイムプログラム制御フロートレース310のレコードは、(概して)以下のプロセスi)ないしv)に従って結び付けられる:i)メモリ破損が識別される;ii)コード分解モジュールを利用して、メモリ破損を生じさせた命令の具体的なメモリアドレスを直接的に又はレジスタを特定する(メモリ破損は、直接的に指定されたメモリアドレスであってもよいし、ロード(load)の場合には入力レジスタ又は間接的な入力レジスタであってもよいし、或いは、保存の場合にはポインタ、出力レジスタ、間接的な出力レジスタ−本願ではまとめて「レジスタ」と言及される);iii)(「保存」又は「保存命令」により)レジスタにロードされたベーシックブロックを特定するためにコード分解モジュールを利用して、ランタイムプログラム制御フロートレース310が、メモリ破損から「逆探知される(walked back)」又は探知される;iv)デバッグ情報306のレコードが、メモリ破損により使用されているデータタイプ又はデータタイプの構造を特定するために使用される;及びv)これは、ベーシックブロックのリスト及びベーシックブロックのデータタイプ又はデータタイプの構造と照合され、メモリ破損を生じさせることが可能であったベーシックブロック中の保存命令候補を発展させる。保存命令候補は、(デバッグを行う者である)ユーザーに返され、及び/又は、保存命令候補はインストルメンテーション(又は計装)モジュールに渡され、インストルメンテーションモジュールは、メモリ破損を引き起こした適確な保存命令が、実現された再コンパイルバージョンの将来的な実行で識別され且つデバッグされることが可能になるように、ソフトウェアプログラムを計測するために使用される。
【0017】
図1の説明に関し、様々な実施形態において、ネットワーク102は、インターネット、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、及び/又は、その他のデータネットワークを含んでもよい。従来のデータネットワーキングプロトコルに加えて、一実施形態では、データは、近距離無線通信(NFC)、ブルートゥース(登録商標)、電力線通信(power-line communication:PCL)等に従って通信されてよい。ネットワーク102は、必須ではないが、他のコンピューティングデバイスと通信するために使用されてよい。
【0018】
様々な実施形態において、デバッグサーバー200、プログラムソース104及びデバッグクライアント106は、デスクトップPC、モバイルフォン、ラップトップ、タブレット、ウェアラブルコンピュータ、又は、スタンドアローン又はネットワーク化されたコンピュータであってもよい他のコンピューティングデバイスを含んでもよい。プログラムソース104は、ソフトウェアプログラムのソース、デバッグ情報のソース及び/又はコンパイルされたソフトウェアプログラムのソースであってよい。デバッグクライアント106は、ソフトウェアプログラマ又はデバッグするサービスプロバイダ等のような者により使用されてもよく、サービスプロバイダは、例えばデバッグサーバー200にソフトウェアデバッギングサービスを提供する。
【0019】
様々な実施形態において、追加的なデバイスだけでなく追加的なインフラストラクチャ(例えば、ショートメッセージサービスセンタ、セルサイト、wifi基地局、ルーター、ファイヤウォール等)が存在してもよい。更に、一実施形態では、
図1に示される他のデバイス又はデバッグサーバー200により提供されるように説明された機能は、物理的及び/又は論理的なデバイスの様々な組み合わせにより実現されてもよい。しかしながら、例示的な実施形態を説明するために、
図1においてそのようなインフラストラクチャ及び実現の詳細を示すことは必須でない。
【0020】
図2は一実施形態による例示的なデバッグサーバー200の幾つかのコンポーネントを示す。様々な実施形態において、デバッグサーバー200は、デスクトップPC、サーバー、ワークステーション、モバイルフォン、ラップトップ、タブレット、セットトップボックス、アプライアンス、又は、本願で説明されるような動作を実行することが可能な他のコンピューティングデバイスを含んでもよい。一実施形態において、デバッグサーバー200は、
図2に示されるものより多い数のコンポーネントを含んでもよい。しかしながら、例示的な実施形態を開示するために、これら一般的な通常のコンポーネントの全てが示される必要はない。
【0021】
上述されるように、デバッグサーバー200はプロセッサトレースモジュール224を有し、プロセッサトレースモジュール224は、ランタイムプログラム制御フロートレースを含むプログラム制御フロートレース情報を提供する有線形式のユニットであってもよい。プロセッサトレースモジュール224は、例えば、デバッグサーバー200における1つ以上の中央処理ユニット210に組み込まれる又はそれと通信する1つ以上のインテル(登録商標)プロセッサトレースユニットであってもよい。
【0022】
様々な実施形態において、デバッグサーバー200は、本願で説明される機能をまとめて提供する1つ以上の物理的及び/又は論理的なデバイスを有してもよい。一実施形態において、デバッグサーバー200は1つ以上の再現される及び/又は分散される物理的又は論理的なデバイスを有してもよい。
【0023】
一実施形態において、デバッグサーバー200は、「クラウドコンピューティング」プロバイダから提供される1つ以上のコンピューティングリソースを有し、例えば、ワシントン州シアトルのアマゾン社(Amazon.com)により提供される「Amazon Elastic Compute Cloud("Amazon EC2")」;カリフォルニア州レッドウッドシティーのオラクル(登録商標)コーポレーションにより提供される「Oracle Cloud Compute Utility」;ワシントン州レッドモンドのマイクロソフト(登録商標)コーポレーションにより提供される「Windows Azure」等であってもよい。
【0024】
デバッグサーバー200は、ネットワークインターフェース208、ディスプレイ206、中央処理ユニット210及びメモリ210を含む複数のコンポーネントを相互接続するバス202を含む。
【0025】
メモリ204は、一般に、ランダムアクセスメモリ(RAM)及び永続的な非一時的な大容量ストレージデバイスを含み、例えば、ハードディスクドライブ又はソリッドステートドライブを含んでもよい。メモリ204はオペレーティングシステム212を保存している。
【0026】
これら及び他のソフトウェアコンポーネントは、フロッピディスク、テープ、DVD/CD-ROMドライブ、メモリカード等のような非一時的なコンピュータ読み取り可能な媒体216に関連するドライブメカニズム(図示せず)を利用して、デバッグサーバー200のメモリ204にロードされてもよい。
【0027】
メモリ204はデバッグサーバーメモリ300も含む。一実施形態において、デバッグサーバー200は、ネットワークインターフェース208、ストレージエリアネットワーク(storage area network:SAN)、高速シリアルバス、及び/又は、適切な他の通信技術により、デバッグサーバーメモリ300と通信してもよい。
【0028】
一実施形態において、デバッグサーバーメモリ300は、「クラウドストレージ」プロバイダから提供される1つ以上のストレージリソースを有してもよく、例えば、ワシントン州シアトルのアマゾン社により提供される「Amazon Simple Storage Service ("Amazon S3")」;カリフォルニア州マウンテンビューのグーグル社(Google, Inc.)により提供される「Google Cloud Storage」等であってもよい。
【0029】
図3に示されるデバッグサーバーメモリ300の例示的なコンポーネントは、モジュール又はソフトウェアルーチンにより使用されるデータグループであり、図面を参照しながらさらに議論される。
【0030】
図3に示されるルーチンにより使用されるデータグループは、カラムに属するセル、又は、ディジタルドキュメント又はファイルの所定の構造における他の値と区別される値により表現される。個々のレコード又はエントリとして本願では言及されているが、レコードは1つより多いデータベースエントリを含んでいてもよい。データベースエントリは、ナンバー(又は数)、数値オペレータ、バイナリ値、論理値、テキスト、文字列オペレータ、ジョイン(join)、条件付き論理、テスト等であってもよいし、それらを表現してもよいし或いはそれらをエンコードしていてもよい。
【0031】
メモリ分析モジュール400は、
図4に示されるように、例えばデバッグサーバー200により実行されてもよい。
【0032】
ブロック402において、メモリ分析モジュール400は、コンパイルされたソフトウェアプログラム及びデバッグ情報を取得する。これは、プログラムソース104のような第三者ソースから取得されてもよいし、或いは、ソフトウェアプログラム302に関するコンパイラーモジュール214の実行によりローカルに取得されてもよい。デバッグサーバーメモリ300に保存される場合、デバッグ情報はデバッグ情報306のレコードとして保存され、コンパイルされたソフトウェアプログラムはコンパイルされたソフトウェアプログラム304として保存されてよい。
【0033】
ブロック404において、メモリ分析モジュール400は、選択的に、コンパイルされたソフトウェアプログラム304を実行してもよい。コンパイルされたソフトウェアプログラムの実行は、プログラムソース104及びデバッグクライアント106における又はそれらによること等のように、メモリ分析モジュール400を実行するコンピュータに対してリモートであってもよい。コンパイルされたソフトウェアプログラムの実行はクラッシュログ(crash log)を生成し、クラッシュログは、送信され、生成され、或いは、デバッグサーバーメモリ内でクラッシュログ320レコードとして保存されてよい。
【0034】
ブロック406において、メモリ分析モジュール400は、コンパイルされたソフトウェアプログラム304における少なくとも1つのメモリ破損の識別(identification)を受信する。識別は、人間であるユーザーから受信されてもよいし、或いは、クラッシュログ320のようなクラッシュログからプログラムにより受信されてもよい。メモリ破損の識別は、メモリ破損により使用される及び/又は指定されるレジスタの識別を含んでもよい。メモリ破損は、メモリ破損308のレコードとしてデバッグサーバーメモリ300に保存されてよい。
【0035】
ブロック408において、メモリ分析モジュール400は、プロセッサトレースモジュールから、ランタイムプログラム制御フロートレースを取得する。他の箇所で議論されているように、プロセッサトレースモジュールは、プロセッサトレースモジュール224のようなハードウェアに基づくものであってもよい。ランタイムプログラム制御フロートレースは、複数の中央処理ユニットに渡る又はそれらによるコンパイルされたソフトウェアプログラムの実行からの情報を含む。これは、コンパイルされたソフトウェアプログラム304のローカルな実行中に、例えばプロセッサトレースモジュール224からローカルに取得されてもよいし、或いは、例えばデバッグクライアント106等からのように、リモートソースから取得されてもよい。何れにせよ、それは、デバッグサーバーメモリ300のランタイムプログラム制御フロートレース310のレコードとして保存されてもよい。
【0036】
ブロック408において、メモリ分析モジュール400は、コンパイルされたソフトウェアプログラム304のベーシックブロックのリストを、ランタイムプログラム制御フロートレース310から取得する。ベーシックブロックのリストは、デバッグサーバーメモリ300のベーシックブロック312のレコードとして保存されている。
【0037】
ブロック410において、メモリ分析モジュール400は、例えばコード分解モジュール220を利用することにより、ベーシックブロックのリスト中のベーシックブロック312を分解し、データを保存することを意味する保存命令である又は保存命令を含むベーシックブロック312のレコードを識別し、データは、例えば、コンパイルされたソフトウェアプログラムを実行するコンピュータにおけるメモリロケーションに対する値、ベクトル、マトリクス又は変数である。保存命令は、保存命令314のレコードとしてデバッグサーバーメモリ300に保存されてもよい。
【0038】
ブロック412では、メモリ分析モジュール400は、メモリ破損308のロケーションから、ランタイムプログラム制御フロートレース310を探知又は逆探知し、メモリ破損308のレジスタに書き込みを行った1つ以上の保存命令314を識別する。
【0039】
ブロック414において、メモリ分析モジュール400は、デバッグ情報306の中で、メモリ破損308により指定又は使用されているデータタイプ又はデータタイプの構造と、保存命令314のデータタイプ又はデータタイプの構造とを識別する。これらは、データタイプ又はデータタイプの構造316のレコードとしてデバッグサーバーメモリ300に保存される。
【0040】
開始ループブロック416ないし終了ループブロック426は、各々の保存命令314のレコードに関して反復される。
【0041】
判定ブロック418において、メモリ分析モジュール400は、次の現在の保存命令314のレコードが、ブロック406で確認したようにメモリ破損308のレジスタに書き込みを行ったか否かを判定する。判定が否定的であった場合、メモリ分析モジュール400は、次の保存命令314に進み;処理されるべき更なる保存命令314のレコードが存在しない場合、メモリ分析モジュール400はブロック428に進む。
【0042】
判定ブロック418において肯定的であった場合、メモリ分析モジュール400は判定ブロック420に進み、保存命令314がメモリ破損308と同じデータタイプ又は同じデータタイプ構造を有するか否かを判定する。判定ブロックにおいて否定的であった場合、メモリ分析モジュール400は、次の保存命令314に進み;処理されるべき更なる保存命令314のレコードが存在しない場合、メモリ分析モジュール400はブロック428に進む。
【0043】
ブロック422において、メモリ分析モジュール400は、判定ブロック418及び判定ブロック420の双方で肯定的であった保存命令314のレコードに、候補の保存命令314である旨のフラグを設定し、これは、そのような保存命令がメモリ破損308のレジスタに書き込みを行ったこと、及び、メモリ破損308と同じデータタイプ又は同じデータタイプ構造316を有していたことを意味する。
【0044】
ブロック424において、メモリ分析モジュール400は、あるリンクを取得し、そのリンクは、候補の保存命令314を(コンパイルされていない)ソフトウェアプログラム302の命令にリンクする又はマッピングする。このリンクは、例えば、デバッグ情報306から取得されてもよい。そのようなリンクは、リンク318のレコードとしてデバッグサーバーメモリ300に保存されてよい。
【0045】
終了ループブロック426において、メモリ分析モジュール400は、必要に応じて、次の保存命令314に関する反復のために、開始ループブロック416に戻ってもよい。
【0046】
ブロック428において、メモリ分析モジュール400は、ブロック422の候補の保存命令314、ブロック424のリンク318を、他のプロセス、モジュール又はユーザーへ渡す又は返す。
【0047】
返された候補の保存命令314は、例えば、ソフトウェアプログラム302をデバッグするためにユーザーにより使用されてよい。候補の保存命令314及びリンク318は、例えば、ソフトウェアプログラム302を備えるようにインストルメンテーションモジュール500により使用され、計装(instrumentation)及び何らかのバグ対策を含む再コンパイルされたソフトウェアプログラム302の将来的な実行に関し、ベーシックブロック312をよりいっそう容易に識別する。
【0048】
ブロック430が終了すると、メモリ分析モジュール400はそれを引き起こしたプロセスを終了する及び/又はそれに戻る。
【0049】
図5に示されるように、インストルメンテーションモジュール500は、例えば、デバッグクライアント106又はプログラムソース104等のようなデバッグサーバー200又は別の適切なコンピュータにより実行されてもよい。
【0050】
ブロック502において、インストルメンテーションモジュール500は、候補の保存命令及びリンクを、例えばメモリ分析モジュール400から受信し、リンクは、候補の保存命令を、ソフトウェアプログラムの一部分にリンクする又はマッピングする。候補の保存命令は候補の保存命令314のレコードであってもよく、ソフトウェアプログラムはソフトウェアプログラム302のレコードであってもよく、リンクはリンク318であってもよい。
【0051】
ブロック504において、インストルメンテーションモジュール500は、計測する保存命令候補の選択を受信してもよい。これは、ユーザー又は他のプロセスにより提供されてもよい。これはオプションであり;インストルメンテーションモジュール500は、全ての保存命令候補についてソフトウェアプログラムを計測してもよい。本願で使用されるように、「インストルメンテーション」及び「ソフトウェアインストルメンテーション」は、以下のi)ないしiii)のうち少なくとも何れかを実行するコンピュータソフトウェア及び/又はハードウェアを指す:i)コンピュータソフトウェア及び/又はハードウェアプロセスのパフォーマンス及び/又は挙動を監視及び/又は測定すること;ii)エラーの診断を可能にする情報を生成する又は診断すること;及びiii)トレース情報を可能にする情報を書き込む又は生成すること。「計測する(to instrument)」は、ソースコード及び/又はバイナリコードにおける命令を包含することを意味し、そのコードは上記のもののうち何れかを実行し、かつ、データそのもの又はデータ処理の結果を報告する。インストルメンテーションの非限定的な具体例は、コードトレーシング、デバッギング、パフォーマンスカウンタ、及び、イベントログを含む。
【0052】
ブロック506において、インストルメンテーションモジュール500は、リンクにより識別されるロケーションに、ソフトウェアインストルメンテーションを挿入してもよい。ソフトウェアインストルメンテーションは、例えば、ユニフォームリソース識別子(Uniform Resource Identifier:URI)、URIからのデータを要求する及び/又はURIへデータを提供する命令を含んでもよく、その命令はそのリンクロケーションにおけるベーシックブロックを識別する。ソフトウェアインストルメンテーションは、デバッグ情報に関する出力、及び/又は、コンパイルされたソフトウェアプログラムの実行中の出力であってリンクロケーションにおけるベーシックブロックを識別するために使用される出力、そのようなベーシックブロックに対する入力及びその出力、そのようなベーシックブロックのデータタイプ又はデータタイプ構造などを含んでもよい。
【0053】
完了ブロック508において、インストルメンテーションモジュール500は、それを引き起こしたプロセスを終了及び/又は復帰する。
【0054】
以下、本開示による実施形態の具体例を示す:
(具体例1)
コンピュータプロセッサにより使用されるメモリ分析モジュールを有し、ソフトウェアプログラムのデバッグを含む処理を実行する装置であって:
前記ソフトウェアからコンパイルされるコンパイルされたソフトウェアプログラム及びデバッグ情報を取得し;
前記コンパイルされたソフトウェアプログラムにおけるメモリ破損の識別を受信し;
前記コンパイルされたソフトウェアプログラムのベーシックブロックのリストを有するランタイムプログラム制御フロートレースを取得し;
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こし;
前記保存命令のセットのうちの保存命令及びメモリ破損のデータタイプ又はデータタイプ構造を前記デバッグ情報において識別し;
前記メモリ破損のデータタイプ及びデータタイプ構造を有する保存命令候補を判別し、前記保存命令候補を前記ソフトウェアプログラムの一部分に結び付ける少なくとも1つのリンクを取得し;及び
前記保存命令候補及び前記リンクを返す;
ことを特徴とする装置。
【0055】
(具体例2)
前記デバッグ情報が前記ソフトウェアプログラムのコンパイル中に準備され、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックのデータタイプ又はデータタイプ構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする具体例1に記載の装置。
【0056】
(具体例3)
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こすことが、コード分解モジュールとともに行われ、前記メモリ分析モジュールは前記メモリ破損のレジスタを含むクラッシュログを受信し、前記メモリ分析モジュールは、前記メモリ破損から、前記ランタイムプログラム制御フロートレースにおいて前記コード分解モジュールにより逆探知を行い又は逆探知を引き起こし、前記メモリ破損のレジスタにロードし且つ前記レジスタのデータタイプ又はデータタイプ構造を有する少なくとも1つの保存命令を、前記保存命令のセットの中で識別し、前記少なくとも1つの保存命令を、前記保存命令候補として識別する
ことを特徴とする具体例1に記載の装置。
【0057】
(具体例4)
前記保存命令候補及び前記リンクを返すことが、前記保存命令候補及び前記リンクをユーザーのために表示することを含む
ことを特徴とする具体例1に記載の装置。
【0058】
(具体例5)
前記保存命令候補及び前記リンクを返すことが、前記保存命令候補及び前記リンクを、インストルメンテーションモジュールに渡すことを含み、前記インストルメンテーションモジュールは、将来のデバッグ情報における保存命令候補を識別するために前記ソフトウェアプログラムを計測する
ことを特徴とする具体例1に記載の装置。
【0059】
(具体例6)
前記ランタイムプログラム制御フロートレースは、前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、プロセッサトレースモジュールから取得される
ことを特徴とする具体例1に記載の装置。
【0060】
(具体例7)
前記プロセッサトレースモジュールはハードウェアに基づくものである
ことを特徴とする具体例6に記載の装置。
【0061】
(具体例8)
前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含む
ことを特徴とする具体例6に記載の装置。
【0062】
(具体例9)
前記ベーシックブロックのリストのうちの各ベーシックブロックは、前記ソフトウェア命令への入口以外の進入分岐を有しておらず且つ前記ソフトウェア命令の出口以外の進出分岐を有していないソフトウェア命令を有し、前記ベーシックブロックは前記ランタイムプログラム制御フロートレースにおけるノードである
ことを特徴とする具体例1ないし具体例8のうちの何れか一項に記載の装置。
【0063】
(具体例10)
前記保存命令が、前記コンピュータのメモリロケーションに対する値、ベクトル、マトリクス又は変数を記録する
ことを特徴とする具体例1ないし具体例8のうちの何れか一項に記載の装置。
【0064】
(具体例11)
プロセッサ及びメモリを有するコンピューティングデバイスにおいて、ソフトウェアプログラムをデバッグする方法であって:
前記ソフトウェアからコンパイルされるコンパイルされたソフトウェアプログラム及びデバッグ情報を取得するステップ;
前記コンパイルされたソフトウェアプログラムにおけるメモリ破損の識別を受信するステップ;
前記コンパイルされたソフトウェアプログラムのベーシックブロックのリストを有するランタイムプログラム制御フロートレースを取得するステップ;
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こすステップ;
前記保存命令のセットのうちの保存命令及びメモリ破損のデータタイプ又はデータタイプ構造を前記デバッグ情報において識別するステップ;
前記メモリ破損のデータタイプ及びデータタイプ構造を有する保存命令候補を判別し、前記保存命令候補を前記ソフトウェアプログラムの一部分に結び付ける少なくとも1つのリンクを取得するステップ;及び
前記保存命令候補及び前記リンクを返すステップ;
を有することを特徴とする方法。
【0065】
(具体例12)
前記デバッグ情報が前記ソフトウェアプログラムのコンパイル中に準備され、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックのデータタイプ又はデータタイプ構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする具体例11に記載の方法。
【0066】
(具体例13)
前記メモリ破損の入力レジスタを含むクラッシュログを受信し、前記メモリ破損から、前記ランタイムプログラム制御フロートレースにおいて前記コード分解モジュールにより逆探知を行い又は逆探知を引き起こし、前記メモリ破損のレジスタにロードし且つ前記レジスタのデータタイプ又はデータタイプ構造を有する少なくとも1つの保存命令を、前記保存命令のセットの中で識別し、前記少なくとも1つの保存命令を、前記保存命令候補として識別するステップ
を更に有することを特徴とする具体例11に記載の方法。
【0067】
(具体例14)
前記保存命令候補及び前記リンクを返すことが、前記保存命令候補及び前記リンクをユーザーのために表示することを含む
ことを特徴とする具体例11に記載の方法。
【0068】
(具体例15)
前記保存命令候補及び前記リンクを返すことが、将来のデバッグ情報における保存命令候補を識別するために前記ソフトウェアプログラムを計測することを含む
ことを特徴とする具体例11に記載の方法。
【0069】
(具体例16)
前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、プロセッサトレースモジュールから前記ランタイムプログラム制御フロートレースを取得するステップ
を更に有することを特徴とする具体例11に記載の方法。
【0070】
(具体例17)
前記プロセッサトレースモジュールはハードウェアに基づくものである
ことを特徴とする具体例16に記載の方法。
【0071】
(具体例18)
前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含む
ことを特徴とする具体例16に記載の方法。
【0072】
(具体例19)
前記ベーシックブロックのリストのうちの各ベーシックブロックは、前記ソフトウェア命令への入口以外の進入分岐を有しておらず且つ前記ソフトウェア命令の出口以外の進出分岐を有していないソフトウェア命令を含み、前記ベーシックブロックは前記ランタイムプログラム制御フロートレースにおけるノードである
ことを特徴とする具体例11ないし具体例18のうちの何れか一項に記載の方法。
【0073】
(具体例20)
前記保存命令が、前記コンピュータのメモリロケーションに対する値、ベクトル、マトリクス又は変数を記録する
ことを特徴とする具体例11ないし具体例18のうちの何れか一項に記載の方法。
【0074】
(具体例21)
ソフトウェアプログラムのデバッグを含む処理を実行する装置であって:
前記ソフトウェアからコンパイルされるコンパイルされたソフトウェアプログラム及びデバッグ情報を取得する手段;
前記コンパイルされたソフトウェアプログラムにおけるメモリ破損の識別を受信する手段;
前記コンパイルされたソフトウェアプログラムのベーシックブロックのリストを有するランタイムプログラム制御フロートレースを取得する手段;
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こす手段;
前記保存命令のセットのうちの保存命令及びメモリ破損のデータタイプ又はデータタイプ構造を前記デバッグ情報において識別する手段;
前記メモリ破損のデータタイプ及びデータタイプ構造を有する保存命令候補を判別し、前記保存命令候補を前記ソフトウェアプログラムの一部分に結び付ける少なくとも1つのリンクを取得する手段;及び
前記保存命令候補及び前記リンクを返す手段;
を有することを特徴とする装置。
【0075】
(具体例22)
前記ソフトウェアプログラムのコンパイルから前記デバッグ情報を取得する手段を更に有し、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックのデータタイプ又はデータタイプ構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする具体例22に記載の装置。
【0076】
(具体例23)
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こす手段が、コード分解モジュールを有し、及び、前記メモリ破損のレジスタを含むクラッシュログを受信する手段を有し、前記メモリ破損から、前記ランタイムプログラム制御フロートレースにおいて前記コード分解モジュールにより逆探知を行い又は逆探知を引き起こし、前記メモリ破損のレジスタにロードし且つ前記レジスタのデータタイプ又はデータタイプ構造を有する少なくとも1つの保存命令を、前記保存命令のセットの中で識別する手段と、前記少なくとも1つの保存命令を、前記保存命令候補として識別する手段とを更に有する
ことを特徴とする具体例21に記載の装置。
【0077】
(具体例24)
前記保存命令候補及び前記リンクを返す手段が、前記保存命令候補及び前記リンクをユーザーのために表示する手段を有する
ことを特徴とする具体例21に記載の装置。
【0078】
(具体例25)
前記保存命令候補及び前記リンクを返す手段が、将来のデバッグ情報における保存命令候補を識別するために前記ソフトウェアプログラムを計測する手段を有する
ことを特徴とする具体例21に記載の装置。
【0079】
(具体例26)
前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、ランタイムプログラム制御フロートレースを決定するプロセッサトレースモジュール手段
を更に有することを特徴とする具体例21に記載の装置。
【0080】
(具体例27)
前記プロセッサトレースモジュール手段はハードウェアに基づくものである
ことを特徴とする具体例26に記載の装置。
【0081】
(具体例28)
前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含む
ことを特徴とする具体例26に記載の装置。
【0082】
(具体例29)
前記ベーシックブロックのリストのうちの各ベーシックブロックは、前記ソフトウェア命令への入口以外の進入分岐を有しておらず且つ前記ソフトウェア命令の出口以外の進出分岐を有していないソフトウェア命令を有し、前記ベーシックブロックは前記ランタイムプログラム制御フロートレースにおけるノードである
ことを特徴とする具体例21ないし具体例28のうちの何れか一項に記載の装置。
【0083】
(具体例30)
前記保存命令が、前記コンピュータのメモリロケーションに対する値、ベクトル、マトリクス又は変数を記録する
ことを特徴とする具体例21ないし具体例28のうちの何れか一項に記載の装置。
【0084】
(具体例31)
命令を有する1つ以上のコンピュータ読み取り可能な媒体であって、前記コンピューティングデバイスの1つ以上のプロセッサによる前記命令の実行に応答して、前記命令は、ソフトウェアプログラムのデバッグをコンピューティングデバイスに実行させ、前記ソフトウェアプログラムをデバッグすることは:
前記ソフトウェアからコンパイルされるコンパイルされたソフトウェアプログラム及びデバッグ情報を取得し;
前記コンパイルされたソフトウェアプログラムにおけるメモリ破損の識別を受信し;
前記コンパイルされたソフトウェアプログラムのベーシックブロックのリストを有するランタイムプログラム制御フロートレースを取得し;
保存命令のセットを識別するために、前記ベーシックブロックのリストを分解し又は分解を引き起こし;
前記保存命令のセットのうちの保存命令及びメモリ破損のデータタイプ又はデータタイプ構造を前記デバッグ情報において識別し;
前記メモリ破損のデータタイプ及びデータタイプ構造を有する保存命令候補を判別し、前記保存命令候補を前記ソフトウェアプログラムの一部分に結び付ける少なくとも1つのリンクを取得し;及び
前記保存命令候補及び前記リンクを返す;
ことを含むことを特徴とするコンピュータ読み取り可能な媒体。
【0085】
(具体例32)
前記デバッグ情報が前記ソフトウェアプログラムのコンパイル中に準備され、前記デバッグ情報は、前記ベーシックブロックのリストにおけるベーシックブロックの定義、前記ベーシックブロックのデータタイプ又はデータタイプ構造、及び、前記ベーシックブロックの命令アドレスを前記ソフトウェアプログラムの一部分にマッピングするリンクを有する
ことを特徴とする具体例31に記載のコンピュータ読み取り可能な媒体。
【0086】
(具体例33)
デバッグソフトウェアプログラムは、保存命令のセットを識別するために、前記ベーシックブロックのリストをコード分解モジュールとともに分解し又は分解を引き起こし、前記メモリ破損のレジスタを含むクラッシュログを受信し、前記メモリ破損から、前記ランタイムプログラム制御フロートレースにおいて前記コード分解モジュールにより逆探知を行い又は逆探知を引き起こし、前記メモリ破損のレジスタにロードし且つ前記レジスタのデータタイプ又はデータタイプ構造を有する少なくとも1つの保存命令を、前記保存命令のセットの中で識別し、前記少なくとも1つの保存命令を、前記保存命令候補として識別することを含む
ことを特徴とする具体例33に記載のコンピュータ読み取り可能な媒体。
【0087】
(具体例34)
前記保存命令候補及び前記リンクを返すことが、前記保存命令候補及び前記リンクをユーザーのために表示することを含む
ことを特徴とする具体例31に記載のコンピュータ読み取り可能な媒体。
【0088】
(具体例35)
前記保存命令候補及び前記リンクを返すことが、将来のデバッグ情報における保存命令候補を識別するために、前記ソフトウェアプログラムを、インストルメンテーションモジュールにより計測する又は計測を引き起こすことを含む
ことを特徴とする具体例31に記載のコンピュータ読み取り可能な媒体。
【0089】
(具体例36)
ソフトウェアプログラムをデバッグすることが、前記コンパイルされたソフトウェアプログラムの実行であって前記メモリ破損をもたらす実行の際に、プロセッサトレースモジュールから前記ランタイムプログラム制御フロートレースを取得することを含む
ことを特徴とする具体例31に記載のコンピュータ読み取り可能な媒体。
【0090】
(具体例37)
前記プロセッサトレースモジュールはハードウェアに基づくものである
ことを特徴とする具体例36に記載のコンピュータ読み取り可能な媒体。
【0091】
(具体例38)
前記コンパイルされたソフトウェアプログラムの実行は複数の中央処理ユニットによりなされ、前記ランタイムプログラム制御フロートレースは前記複数の中央処理ユニットからのデータを含む
ことを特徴とする具体例36に記載のコンピュータ読み取り可能な媒体。
【0092】
(具体例39)
前記ベーシックブロックのリストのうちの各ベーシックブロックは、前記ソフトウェア命令への入口以外の進入分岐を有しておらず且つ前記ソフトウェア命令の出口以外の進出分岐を有していないソフトウェア命令を有し、前記ベーシックブロックは前記ランタイムプログラム制御フロートレースにおけるノードである
ことを特徴とする具体例31ないし具体例38のうちの何れか一項に記載のコンピュータ読み取り可能な媒体。
【0093】
(具体例40)
前記保存命令が、前記コンピュータのメモリロケーションに対する値、ベクトル、マトリクス又は変数を記録する
ことを特徴とする具体例31ないし具体例38のうちの何れか一項に記載のコンピュータ読み取り可能な媒体。