JP2008052688A - プログラムのパッチデータ生成装置 - Google Patents
プログラムのパッチデータ生成装置 Download PDFInfo
- Publication number
- JP2008052688A JP2008052688A JP2006258008A JP2006258008A JP2008052688A JP 2008052688 A JP2008052688 A JP 2008052688A JP 2006258008 A JP2006258008 A JP 2006258008A JP 2006258008 A JP2006258008 A JP 2006258008A JP 2008052688 A JP2008052688 A JP 2008052688A
- Authority
- JP
- Japan
- Prior art keywords
- source program
- debugged
- function
- program
- machine language
- 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.)
- Pending
Links
Images
Abstract
【課題】 デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、前記ソースプログラムに含まれる関数や変数を用いた検査ルーチンを生成するパッチデータ生成装置を提供する。
【解決手段】 デバッグ対象のソースプログラムをコンパイルリンクして得られるデバッグ情報を用いて、デバッグ対象の機械語命令列に含まれる関数や変数を利用するためのパラメータを自動的に生成し、デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、デバッグ対象のソースプログラムの任意に記述された関数や変数を用いた検査ルーチンの生成し、デバッグ対象の機械語命令列に適用可能なパッチデータを生成する。
【選択図】図1
【解決手段】 デバッグ対象のソースプログラムをコンパイルリンクして得られるデバッグ情報を用いて、デバッグ対象の機械語命令列に含まれる関数や変数を利用するためのパラメータを自動的に生成し、デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、デバッグ対象のソースプログラムの任意に記述された関数や変数を用いた検査ルーチンの生成し、デバッグ対象の機械語命令列に適用可能なパッチデータを生成する。
【選択図】図1
Description
本発明は、プログラムの動作検証に使用するプログラムのパッチデータ生成装置に関する。
コンピュータ用プログラムの作成にあたっては、そのプログラムが正常に動作するかどうかを検証するためのデバッグ作業が必要である。そのため、検査対象の記述部分に検査ルーチンを組み込み、ターゲットシステム上で実行することが行われる。
つまり、検査用ソースプログラムが組み込まれたデバッグ対象のソースプログラムをコンパイルリンクすることで、前記検査ルーチンの組み込みを行い、これによって得られた機械語命令列をターゲットシステム上で実行することによって動作状況の確認を行うのである。
しかしながら、カットアンドトライを要するようなプログラムのデバッグを行うケースでは、検査ソースプログラムを組み込んだデバッグ対象のソースプログラムから、デバッグ対象の機械語命令列を生成するコンパイルリンク作業そのものを繰り返し行う必要があり、このコンパイルリンク作業に要する時間がプログラムのデバッグ作業の工程上、無視出来ないレベルとなることも珍しくない。
そこで、従来、検査ルーチンの組み込みに対して、種々の自動化の提案が行われている(例えば、特許文献1参照。)。
この特許文献1においては、プログラムへのパッチ方法に関する公知の技術(例えば、特許文献2及至3参照。)に基づいて、デバッグ対象のソースプログラムをコンパイルリンクすることなく機械語命令列からなる検査ルーチンを組み込む手段を設け、前記検査ルーチンの組み込まれた機械語命令列を取得することが提案されている。
しかしながら、前述した手法では、C、C++、パスカルといった高級言語を用いたプログラムのデバッグにおいて、機械語命令列からなる検査ルーチンから、デバッグ対象のソースプログラムの任意に記述された関数や変数を利用する場合、これらの利用規則を満たした検査ルーチンを生成し、利用可能とする為には、前記利用規則を満たす為の作業を手作業で行う必要がある。 更に、これに要する作業は必ずしも容易ではないため、最終的にはデバッグ対象のソースプログラムに検査ソースプログラムを組み込んだ上で再コンパイルリンクを行う手段をとることを選択せざるを得ない場合も少なくない。
特開2005−115619 特開平05−120067 特開平05−181664 DWARF Debugging Information Format Workgroup、″DWARF Debugging Information Format Version 3″、[online]、平成17年12月20日、Free Standard Group、[平成18年8月23日検索]、インターネット<URL:http://dwarf.freestandards.org/Download.php> Richard Earnshaw、″Procedure Call Standard for the ARM(R)Architecture GENC−003534″、[online]、平成18年5月4日、ARM Limited、[平成18年8月23日検索]、インターネット<URL:http://www.arm.com/products/DevTools/ABI.html>
これは、従来の手法では、前記関数の利用に必要な引数の受け渡し方法、前記関数からの戻り値の受け渡し方法、前記変数の値の格納場所、およびデータサイズの特定方法、およびその利用可否に関する情報、など、前記関数と前記変数を利用するために必要な、利用条件に関するパラメータの取得が自動化されていないことが主な原因である。
例えば、関数の呼出において必要な引数の受け渡しについて述べると、引数の個数や、引数の型が個々の関数によって様々であるため、デバッグ対象のソースプログラムをコンパイルリンクすることによって生成されるデバッグ対象の機械語命令列における関数の引数の受け渡しに用いられる媒体は、ターゲットCPUのレジスタであったり、ターゲットメモリ上のスタックであったりと多様である。
つまり、検査ルーチンから、デバッグ対象のソースプログラムの任意に記述された関数や変数を利用する場合、これらの利用規則に関するパラメータを検査ルーチン生成部に自動的に入力し、検査ルーチン生成部はこれに基づいて、当該検査ルーチンの機械語命令列をデバッグ対象の機械語命令列に適用可能なパッチデータとして生成することが可能であれば、従来よりも更にプログラムのデバッグ作業の効率を高めることが出来る。
そこで、本発明の目的は、デバッグ対象のソースプログラムをコンパイルリンクして得られるデバッグ情報を基に前記パラメータを自動的に生成して、前記パラメータを検査ルーチン生成部に入力することで、デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、デバッグ対象のソースプログラムの任意に記述された関数や変数を用いた検査ルーチンの生成を自動化することにある。
本発明の一態様によれば、デバッグ対象のソースプログラムをコンパイルリンクして得られるデバッグ対象の機械語命令列と、前記コンパイルリンクによって得られるデバッグ情報を入力し、前記デバッグ対象のソースプログラムの任意に記述された関数の呼出と、前記デバッグ対象のソースプログラムの任意に記述された変数の利用を含む、高級言語で記述された検査ソースプログラムの挿入指示に従って、前記デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、前記デバッグ対象の機械語命令列に適用可能な、機械語命令列からなる検査ルーチンのパッチデータを生成することを特徴とする、プログラムのパッチデータ生成装置が提供される。
また、本発明の別の一態様によれば、前記検査ソースプログラム内で、前記デバッグ対象のソースプログラムの任意に記述された関数と同じ、名称と、引数型と、戻り値型と、を持つ代替関数を記述することで、前記デバッグ対象のソースプログラムの任意に記述された関数を、前記代替関数に差し替える効果を持つパッチデータを生成することを特徴とする、請求項1記載のプログラムのパッチデータ生成装置が提供される。
本発明によれば、デバッグ対象のソースプログラムをコンパイルリンクして得られるデバッグ対象の機械語命令列と、前記コンパイルリンクによって得られるデバッグ情報を入力し、前記デバッグ対象のソースプログラムの任意に記述された関数の呼出と、前記デバッグ対象のソースプログラムの任意に記述された変数の利用を含む、高級言語で記述された検査ソースプログラムの挿入指示に従って、前記デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、前記デバッグ対象の機械語命令列に適用可能な、機械語命令列からなる検査ルーチンのパッチデータを生成することが可能となる。
また、本発明によれば、前記検査ソースプログラム内で、前記デバッグ対象のソースプログラムの任意に記述された関数と同じ、名称と、引数型と、戻り値型と、を持つ代替関数を記述することで、前記デバッグ対象のソースプログラムの任意に記述された関数を、前記代替関数に差し替える効果を持つパッチデータを生成することが可能となる。
以下、本発明の実施例を図面を参照して説明する。
図1は、本発明の実施例1に係るプログラムのパッチデータ生成装置の構成を示すブロック図である。
プログラムのパッチデータ生成装置1は、デバッグ対象のソースプログラム21のデバッグのため、デバッグ対象のソースプログラム21をコンパイルリンクして得られるデバッグ対象の機械語命令列23の読み出しと、前記コンパイルリンクによって得られるデバッグ情報22の読み出しと、検査ソースプログラム24の読み書きと、デバッグ対象のソースプログラム21の読み出しと、パッチデータ25の書き込みと、を行うための記憶装置2、デバッグ対象のソースプログラムの状況などを表示するための表示装置3、検査ルーチン生成に関するコマンドなどを入力するための入力装置4が接続されている。
また、プログラムのパッチデータ生成装置1は、検査ルーチンを生成するために、検査ソースプログラム管理部12、検査ルーチン挿入位置指定部13、デバッグ情報管理部14を備え、更に検査ソースプログラム管理部12と、検査ルーチン挿入位置指定部13と、デバッグ情報管理部14と、デバッグ対象のソースプログラム21と、デバッグ対象の機械語命令列23と、から必要な情報を得ることで検査ルーチンの機械語命令列を生成する検査ルーチン生成部15を備えている。
コマンド解析部11は、入力装置4から入力されたコマンドを解析し、検査ソースプログラム管理部12、検査ルーチン挿入位置指定部13、および、検査ルーチン生成部15に、それぞれの動作実行を指示する。
検査ルーチン挿入位置指定部13は、デバッグ情報管理部14から得られる情報を基に、デバッグ対象のソースプログラム21における、検査ルーチン挿入に適した挿入位置の候補を表示装置3を介して使用者に伝えると共に、使用者が前記候補の中からコマンド解析部11を介して指定した検査ルーチン挿入位置に関する情報を、検査ルーチン生成部15の求めに応じて、検査ルーチン生成部15に入力する。
検査ソースプログラム管理部12は、記憶装置2からの検査ソースプログラム24の読み出し、コマンド解析部11を介して使用者が入力した検査ソースプログラムの保持、必要に応じて前記検査ソースプログラムを検査ソースプログラム24として記憶装置2への書き込みを行うと共に、検査ルーチン生成部15の求めに応じて、検査ソースプログラムを、検査ルーチン生成部15に入力する。
デバッグ情報管理部14は、デバッグ情報22を基に、検査ルーチン挿入位置指示部13が必要とする検査ルーチンの挿入に適した挿入位置の候補に関する情報、検査ルーチン生成部15が必要とするデバッグ対象のソースプログラム21の任意に記述された関数や変数についての情報を管理し、前記各々の求めに応じて提供する。
検査ルーチン生成部15は、使用者からのコマンド解析部11を介した指示によって動作を開始し、検査ソースプログラム管理部12から挿入対象となる検査ソースプログラムと、検査ルーチン挿入位置指定部13から検査ルーチンの挿入に適した位置情報と、デバッグ情報管理部14から得られるデバッグ対象のソースプログラム22の任意に記述された関数や変数に関する情報と、予めコマンド解析部11に入力装置4を介して使用者より入力されたターゲットメモリの利用状況に関する情報と、デバッグ対象の機械語命令列24と、を基に、検査ルーチンの機械語命令列を生成するコンパイラである。
このとき、検査ルーチン生成部15は、デバッグ対象の機械語命令列23に上書きすることよって適用するパッチデータ25を生成し、記憶装置2に格納する。
次に、このプログラムのパッチデータ生成装置1におけるパッチデータの生成に関する動作について、図2〜図10を用いて説明する。
図2(a)は、C言語で書かれたデバッグ対象のソースプログラムを示す。 尚、本実施例における、デバッグ情報はDWARF2及びDWARF3形式であり、本実施例を説明するにあたり、前記デバッグ情報を総称してDWARF形式と記述することとする。
また、この説明に用いる機械語命令はコプロセッサを持たない32ビットARM命令である。 DWARF形式についての詳細は、非特許文献1「DWARF Debugging Information Format Version 3」を参照して頂きたい。
また、この説明に用いる機械語命令はコプロセッサを持たない32ビットARM命令である。 DWARF形式についての詳細は、非特許文献1「DWARF Debugging Information Format Version 3」を参照して頂きたい。
図3は、図2(a)に示したデバッグ対象のソースプログラムとデバッグ対象の機械語命令列の対応を容易に識別出来るよう、C言語ソースプログラムおよびアセンブラ言語の混在表記とし、あわせてデバッグ情報管理部14から得られるブレークポイントを示した図である。
ブレークポイントは、デバッグ対象の機械語命令列に複数存在する部分集合の実行開始の始点となるアドレスであり、デバッグ対象のソースプログラムの対象行との組み合わせである。 従って、ブレークポイントは必ずしもデバッグ対象のソースプログラムの全ての行に存在する訳ではない。 ここでは、本発明についての解説を容易にする為、関数の先頭に位置するブレークポイントをプロローグ・ブレークポイント、関数の末尾に位置するブレークポイントをエピローグ・ブレークポイントと呼ぶこととし、図3に示した関数func1では、ブレークポイント532がプロローグ・ブレークポイント、ブレークポイント572がエピローグ・ブレークポイントにそれぞれ該当する。
ブレークポイントは、ソースレベルデバッグに対応するデバッグ情報であれば、当然求めることが出来るものであるが、DWARF形式のデバッグ情報では、行番号プログラム(Line−number Program)と名付けられた中間コードを持ち、これに対応するインタプリタを用いて前記中間コードを実行することにより、これを求める事ができる。 図2(b)は、図2(a)に示すソースプログラムにおける行番号プログラムの実行結果である。
図4は、図2(a)に示すデバッグ対象のソースプログラムに対して、本発明の実施によって検査ソースプログラムが挿入されるイメージを示したものであり、C言語で記述されたif文が1行挿入される様子を示している。 この文は図2(a)に示すデバッグ対象のソースプログラムに含まれる、関数func1の引数int aと、引数「struct PARAM k」のメンバである、v3とv4とmsgへの参照、局所変数「ret」への代入、関数logoutの呼出を含んでいる。
尚、本実施例における検査ソースプログラムの文は、デバッグ対象のソースプログラムの任意に記述された文への分岐を伴わない文に限定される。 ただし、検査ルーチン挿入の対象となるブレークポイントへの分岐は許されるので、挿入対象の文がswitch文、for文、while文、do文であれば、挿入対象の文の内部でbreak文を使用することは可能である。
本発明の実施にあたっては、先ず、図5(a)に示すように、表示装置3に挿入箇所となるデバッグ対象のソースプログラムの対象行を表示する。
次に、図5(b)に示すように、入力装置4から、検査ソースプログラムを入力する。
ここでは、図4に示す1行のif文を検査ソースプログラムを挿入するのであるから、これを入力する。 この検査ソースプログラムは、関数func1の引数int aを、引数「struct PARAM k」のメンバであるv3とv4を加算した値で比較し、結果として引数int aが持つ値が小さければ、引数「struct PARAM k」のメンバであるmsgを引数として、関数logoutを呼び出し、前記関数logoutからの戻り値を、関数func1の局所変数「ret」に格納するというものである。
ここでは、図4に示す1行のif文を検査ソースプログラムを挿入するのであるから、これを入力する。 この検査ソースプログラムは、関数func1の引数int aを、引数「struct PARAM k」のメンバであるv3とv4を加算した値で比較し、結果として引数int aが持つ値が小さければ、引数「struct PARAM k」のメンバであるmsgを引数として、関数logoutを呼び出し、前記関数logoutからの戻り値を、関数func1の局所変数「ret」に格納するというものである。
ここで入力された検査ソースプログラムは、検査ソースプログラム管理部12によって保持される。
検査ルーチンの挿入箇所は、デバッグ対象のソースプログラムの行のうち、プロローグ・ブレークポイントとエピローグ・ブレークポイントを除くブレークポイントに限定することが望ましい。
この理由を述べると、プロローグ・ブレークポイントと、エピローグ・ブレークポイントは、その外観とは異なり、デバッグ対象のソースプログラムの任意に記述した文を示すものではなく、関数の首尾においてコールフレームの調整などを行うために、コンパイラとリンカが独自に生成する機械語命令列の部分集合の開始アドレスを示すブレークポイントだからである。
検査ルーチンは、ここで選択したブレークポイントの示すアドレスに挿入されるので、ここでは、ソースコード55に挿入したいのであるから、ソースコード55に対応するブレークポイント552を選択する。 選択されたブレークポイント552の示すアドレス0x8254は、検査ルーチン挿入位置指定部13によって保持される。 尚、ソースコード55に挿入するという意味は、デバッグ対象の機械語命令列に含まれるソースコード55に該当する箇所で、本来ソースコード55に対応する機械語命令列551が実行されるタイミングで、先に本発明の実施によって生成した検査ルーチンが実行され、続いてソースコード55に該当する機械語命令列551が実行されるという事である。
この選択を受けて、検査ルーチン生成部15は、先に入力され、検査ソースプログラム管理部12によって保持されている検査ソースプログラムと、検査ルーチン挿入位置指定部13によって保持されているブレークポイント552のアドレスである0x8254を受け取る。
次に、検査ルーチン生成部15は、前記検査ソースプログラムが使用する、関数func1の引数int a、引数「struct PARAM k」のメンバであるv3とv4とmsg、および、戻り値を受け取る局所変数「ret」が、ブレークポイント552のアドレス0x8254において利用可能であるかどうか、デバッグ情報管理部14に問い合わせる。
デバッグ情報管理部14は、検査ルーチン生成部15の問い合わせを受けて、関数func1の引数int a、引数「struct PARAM k」のメンバであるv3とv4とmsg、および、局所変数「ret」がブレークポイント552のアドレスにおいて有効であれば、各変数の所在を示すロケーション情報を返し、これらの変数が1つでも有効でなければ、処理続行は不可能なので、エラーとし、必要に応じて表示装置3を経由して使用者に知らせる。
デバッグ情報管理部14から通知されるロケーション情報の種類は、絶対アドレス、ターゲットCPUのレジスタ名、ターゲットCPUのレジスタ名とオフセット値の組み合わせなどであるが、この例では、引数int aはターゲットCPUのレジスタ、引数「struct PARAM k」の各メンバはターゲットCPUのレジスタR11にオフセット値を加算したアドレスを所在とする、ターゲットメモリのスタック上に配置されている。
このロケーション情報は、ソースレベルデバッグに対応したデバッグ情報であれば求めることが出来る。 デバッガはプログラムを動作させながらデバッグを行うために、プログラムの実行過程での変数値や、関数の所在を使用者に知らせる必要があり、これらの所在を知る術をデバッガに持たせることがデバッグ情報の本来の役目でもある。
本実施例におけるデバッグ情報であるDWARF形式では、ロケーション式(Location Expressions)と名付けられた中間コードを持ち、これに対応するインタプリタを用いて前記中間コードを実行及び解析することで、変数の所在を知ることが出来る。 また、関数の所在についてはデバッグ情報エントリ(Debug Information Entry)と名付けられた情報を、「.debug_info」と「.debug_abbrev」と名付けられたセクションが保持しており、これらを解析することで求めることが可能であり、これら一連の作業はソースレベルデバッガと呼ばれる一般的なデバッガにおいて、ごく当たり前に行われていることである。
前記ロケーション式によって変数の所在を求めるためには、プログラムカウンタの値が必要となる場合がある。 特に「.debug_loc」と名付けられたセクションの解析にはプログラムカウンタの値が必須であり、一般的なデバッガにおける用途では、ターゲットシステム上でデバッグ対象の機械語命令列の実行を行うため、当然、プログラムカウンタの値を取得することができる。
しかしながら、本発明の実施においては、ターゲットシステム上でデバッグ対象の機械語命令列の実行を行うことなく前記ロケーション式を実行する必要がある。 ターゲットシステム上でデバッグ対象の機械語命令列を実行することなく、プログラムカウンタの値を取得することは一見困難なように思えるが、ここで必要とされるプログラムカウンタの値は、検査ルーチン実行時のアドレス値であり、検査ルーチンの挿入位置であるブレークポイント552が持つアドレス値がこれに該当する。 つまり、本実施例においては、ブレークポイント552が持つアドレス0x8254をプログラムカウンタの値として、前記ロケーション式の実行及び解析を行うことで必要な結果を導き出す事が出来る。
図7及び図8は、図2(a)に記載した、本実施例におけるデバッグ対象のソースプログラムの関数func1に関するデバッグ情報エントリの解析結果である。
前記デバッグ情報エントリは、「DW_TAG」で始まるタグと、タグに属する「DW_AT」で始まる属性の組み合わせにより構成されており、これによって得られる関数func1に関する情報は下記の通りである。
関数func1の実体である機械語命令列は、タグ70の属性701〜702より、ターゲットメモリ上の0x8234から0x828Bに配置されていることが分かる。 また、実行時のフレームベースはタグ70の属性703に示すロケーション式からターゲットCPUのレジスタR11が持つ値であり、戻り値の型は、タグ70の属性704〜706より4バイトで構成される符号付き整数値であることが分かる。
更に、前記関数の引数は、タグ71より第一引数の名称は「a」で4バイトで構成される符号付き整数、タグ72より第二引数の名称は「b」で4バイトで構成される符号付き整数、タグ73より第三引数の名称は「k」、更にタグ732より名称が「PARAM」である構造体であり、タグ7322〜タグ7326より、第一メンバの名称は「v1」で、4バイトで構成される符号付き整数値、第二メンバの名称は「v2」で、4バイトで構成される符号付き整数値、第三メンバの名称はv3で、4バイトで構成される符号付き整数値、第四メンバの名称はv4で、4バイトで構成される符号付き整数値を各々扱う。 第五メンバの名称は、msgで、1バイトで構成される符号付き整数値のポインタ変数で、前記ポインタ変数は4バイトで構成されていることがわかる。 更に、関数func1はタグ74より、局所変数を1つ持っていることがわかり、この局所変数は、属性740より名称「ret」、属性742〜744より、4バイトで構成される符号付き整数値を扱うことがわかる。
次に、前記各変数の所在をデバッグ情報エントリ及びロケーション式から求めると、第一引数は、属性714よりターゲットCPUのレジスタR0、第二引数は属性724よりターゲットCPUのレジスタR4、第三引数は、属性731より前記フレームベースであるターゲットCPUのレジスタR11の持つ値に4を加えたR11+4が示すアドレスを先頭として配置されており、以下同様に、メンバv1は属性73224より前記R11+4+0が示すアドレス上、メンバv2は属性73234より前記R11+4+4が示すアドレス上、メンバv3は属性73244より前記R11+4+8が示すアドレス上、メンバv4は属性73254より前記R11+4+12が示すアドレス上、メンバmsgは属性73226より前記R11+4+16が示すアドレス上、局所変数retは属性74より、ターゲットCPUのレジスタR2を所在としていることが各々分かる。
前述の通り、前記デバッグ情報エントリ及び前記ロケーション式を解析することで、各変数の型と所在を知ることが出来るが、ここで注意すべき点は、前述した各変数の所在は、プロローグ・ブレークポイント532に属する機械語命令列531を実行した後の各変数の所在を示すことである。
但し、本実施例のデバッグ情報であるDWARF形式は、「.debug_frame」と名付けられたセクションが持つ、コールフレーム情報と名付けられた、本来は「コールフレームの巻き戻し」と呼ばれるデバッグ機能をソースレベルデバッガが備えるために用いられる情報を用いて、機械語命令列531における前記各変数の所在を求めることも可能であることを念の為、付け加えておく。
尚、本実施例においては検査ソースプログラムから静的変数を扱う例が含まれていないが、静的変数も検査ソースプログラムから用いることが可能である。 本実施例におけるデバッグ情報であるDWARF形式の場合、静的変数は、局所変数と同様にタグ「DW_TAG_variable」が型及びロケーションを求めるための属性を持った形式で表現されている。静的変数が局所変数と大きく異なる点は、求められるロケーションがターゲットメモリ上のアドレスであるという点である。
次に、前述した関数func1同様に、図2(a)に記載したデバッグ対象のソースプログラムの任意に記述された関数logoutについての情報を求める。 前記関数は、図4の検査ソースプログラム内で用いられており、図9は前記関数のデバッグ情報エントリ及びロケーション式の解析結果である。
前記関数logoutは、タグ80の属性801〜802よりターゲットメモリ上のアドレス0x821C〜0x8233に配置され、フレームベースは属性803よりターゲットCPUのレジスタR11、戻り値の型はタグ80の属性805〜806より、4バイトの符号付き整数値である。
更に、関数logoutは、タグ81の属性810〜816より名称msgである、1バイト符号付き整数値を示す4バイトで構成されるポインタ変数を唯一の引数として持ち、この引数の機械語命令列501を実行後の所在は、ターゲットCPUのレジスタR0である。
尚、本実施例におけるデバッグ情報であるDWARF形式における、関数の実行開始アドレスは、タグ「DW_TA_subprogram」が属性「DW_AT_entry_pc」を持っている限りにおいては、前記属性が持つアドレス値であり、前記属性を持たない場合は、属性「DW_AT_lowpc」が持つアドレス値である。 尚、インライン関数の実体である機械語命令コード列は、タグ「DW_TAG_inlined_subroutine」として表記される。 更に、非連続のアドレス範囲に関数の実体である機械語命令列が配置されている場合、属性「DW_AT_range」によって、前述した非連続のアドレス範囲を求めることが出来る。
ここまでの解析作業で、本実施例に関連する各関数における引数の型、戻り値の型、変数の型及び所在を知ることが出来たのであるが、本実施例に於いて更に必要な情報として、実際に関数の実体である機械語命令列を呼出すために必要な、引数および戻り値の受け渡し方法を知る必要がある。
本実施例のデバッグ情報形式であるDWARF形式は、前記した関数の引数および戻り値の受け渡し方法に関する情報を持っていない。 これは、ターゲットCPUの製造者を中心として決定されるABI(Application Binary interface)と名付けられた仕様の一部である標準呼出規則(The Procedure Call Standard)に、デバッグ対象の機械語命令列を生成するために用いるコンパイラ及びリンカが準拠していることを前提としていることが理由である。 尚、前記DWARF形式には、前記標準呼出規則に関数の実体である機械語命令列が準拠しているかどうかをデバッガに知らせるための手段が準備されており、これはタグ「DW_TAG_subprogram」に付属する属性「DW_AT_calling_convention」が持つ値を調べることで知ることが出来る。尚、属性「DW_AT_calling_convention」が無い場合は、前記標準呼出規則に準拠していると解釈出来る。
図6は、本実施例におけるターゲットCPUの前記ABI仕様のうち本実施例に必要な部分を抜粋したものである。 これによれば、関数呼び出し時の引数は、ターゲットCPUのレジスタR0〜R4と、SPをスタックポインタとするターゲットメモリ上のスタック領域を経由して関数に引き渡され、また戻り値はターゲットCPUのレジスタR0〜R1を用いて呼出元に返されることがわかる。
図10(a)は、本実施例において検査ルーチン生成部15が生成した検査ルーチンの機械語命令列である。 検査ルーチン生成部15は、デバッグ情報管理部14より前述したような検査ルーチン挿入に必要な一連の情報を取得し、入力装置4を介して使用者によって予め入力されたターゲットメモリの利用状況の情報を基に、検査ソースプログラムをコンパイルして検査ルーチンの機械語命令列を生成する。 生成された機械語命令列は、ターゲットメモリ上の未使用領域に配置され、かつ、関数func1の動作を損なわないよう、結果を代入する局所変数retが割り当てられたターゲットCPUのレジスタR2を除く全てのレジスタ値のスタックへの待避および復帰などの処理を含んでいる。
ここで注目すべきは、前記検査ルーチンの機械語命令列が前記関数func1の一部として動作するように生成される点であり、また検査ソースプログラムには、前記検査ソースプログラムで用いられている変数や関数の型に関する情報を全く記述する必要が無いということである。つまり、前記一連の型情報は、これまでの説明の通りデバッグ情報から求めることが出来るので、検査ソースプログラム内で明示する必要がない。
次に、検査ルーチン生成部15は図10(c)に示す通り、関数func1に図10(a)に示す検査ルーチンの機械語命令列を組み込むため、ブレークポイント552のアドレス0x8254から、機械語命令列で構成される分岐命令を挿入するスペースに該当するデータ列を、デバッグ対象の機械語命令列23から取得し、前述した検査ルーチンへの分岐命令に相当する機械語命令で置き換え、余分があればNOP相当の機械語命令で埋める。
更に、図10(b)に示す通り、前述した取得済みのブレークポイント552の示すアドレス0x8254に存在した機械語命令を、前述した検査ルーチンの機械語命令列の末尾にアペンドし、必要ならアペンドした命令が持つアドレス値などを補正後、更に、図10(c)で示したブレークポイント552の示すアドレスにある検査ルーチンへの分岐命令の次のアドレスへの機械語命令で構成された分岐命令を生成して、これをアペンドする。
最後に、検査ルーチン生成部15は、検査ルーチン挿入によって追加される部分と、デバッグ対象の機械語命令列23の前記検査ルーチン挿入によって書き換えられる部分と、で構成されるパッチデータ25を生成し、記憶装置2に格納する。このパッチデータの具体的な形式はインテルHEXフォーマットやモトローラSフォーマットなど既知の汎用フォーマットで足り、デバッグ対象の機械語命令列23に上書きして用いる。
前述した検査ソースプログラムの挿入箇所として指定したブレークポイントにおける、検査ソースプログラム内で利用する変数が有効に利用可能であるかどうかを調べる手段に関して述べると、デバッグ情報の信頼性に著しく影響を受けやすい特性がある。
例えば、本実施例における検査ソースプログラムの挿入箇所を、ブレークポイント552ではなく、ブレークポイント562として実施する場合、機械語命令列551に記載された機械語命令5510が実行されると、引数int aが割り当てられているターゲットCPUのレジスタR0が持つ値が書き換えられる。
しかしながら、属性714が示すロケーション式では、関数func1が実行中である場合、引数int aは常にターゲットCPUのレジスタR0に割り当てられていることが示されており、関数func1における機械語命令列が示す挙動と一致しない。 つまり、図7及び図8は、不完全なデバッグ情報の例として用いることが出来る。
本実施例におけるデバッグ情報であるDWARF形式においては、変数の所在がその消滅を含めて変化した場合に対応するため「.debug_loc」と名付けられたセクションが持つ情報を基に、プログラムカウンタの値に応じた、特定の変数の所在及び有効性について知る術を提供しているのであるが、デバッグ情報を生成するコンパイラ及びリンカによっては、図7及び図8が示すような不完全なデバッグ情報を生成することも考慮しておく必要がある。
前述したような不完全なデバッグ情報を用いた場合、ソースレベルデバッガと呼ばれるデバッガにおいても、デバッグ情報が本来の目的とする機能性について同様の問題が発生する。 例えば、図7及び図8のデバッグ情報を入力した従来のソースレベルデバッガは、機械語命令5510を実行した後の引数int aの値をデバッグ対象のソースプログラムの記述から推測されるものとは異なる値として使用者に示すことになる。ここで述べた不完全なデバッグ情報は、最適化コンパイラによってもたらされる場合が多い。
この問題を解決するための手段としては、変数値が利用可能であるブレークポイント上で必要な変数が持つ値のコピーを生成し、検査ルーチン生成部が生成する検査ソースプログラムに対応する機械語命令列から前述したコピーを参照させるという手法が考えられる。 前述したコピーの格納場所としては、スタックポインタが示すコールフレームが最適であろう。
しかしながら、前記コールフレームを前記変数値のコピーの格納場所とする場合、検査ルーチン挿入の対象である関数のデバッグ対象の機械語命令列における動作を機械語命令レベルで解析する必要があるかもしれない。 具体的には、プロローグ・ブレークポイントとエピローグ・ブレークポイントに属さない前記関数の実体である機械語命令列において、前記スタックポインタを、参照及び書き換えしていないことを確認することである。
もし、前述したスタックポインタの、参照及び書き換えが行われている場合、コールフレームに前記コピーを格納するのは難しい。 尚、前記機械語命令列で用いられている標準呼出規則に準拠した関数の実体である機械語命令列へのサブルーチンコールは解析に含める必要がない。
もし、前述したスタックポインタの、参照及び書き換えが行われている場合、コールフレームに前記コピーを格納するのは難しい。 尚、前記機械語命令列で用いられている標準呼出規則に準拠した関数の実体である機械語命令列へのサブルーチンコールは解析に含める必要がない。
従って、デバッグ対象のソースプログラム21をコンパイルリンクして得られるデバッグ情報22から得られる変数の所在に関するロケーション情報は、機械語命令列における変数値の格納場所について、その存在の有無を含めた正確な表現であることが望ましい。
つまり、ロケーション情報が前述したような正確な表現であれば、本実施例におけるブレークポイント552への検査ルーチンの挿入は正常に行われ、またブレークポイント562への検査ルーチンの挿入は、引数int aの値がブレークポイント562のアドレスにおいて不定であることを理由として、処理続行が不可能であることを表示装置3を介して使用者に知らせることが出来る。
次に、検査ソースプログラムの挿入箇所として使用者が指定するブレークポイントについて述べると、サイズ最適化を行うコンパイラ及びリンカを用いて生成されるデバッグ対象の機械語命令列は、デバッグ対象のソースプログラムにおいて見かけ上、独立した記述である複数の箇所を、同一アドレス範囲に置かれた機械語命令列を使い回すことで表現する傾向が時折見受けられる。
検査ルーチンの挿入に際して、前述した傾向が与える直接的な影響は、本発明を実施することによってデバッグ対象の機械語命令列に挿入される検査ルーチンが、使用者の意図した箇所以外で実行される可能性を否定できないという点である。
つまり、検査ルーチンの挿入に際して、前述した可能性を使用者に知らせるべきであり、具体的にはデバッグ情報から取得できるブレークポイント情報が、「同じアドレス」と「異なるソースプログラム記述行」の組み合わせから成るブレークポイントを複数持つなら、前記アドレスを示すブレークポイントは検査ルーチンの挿入に適さないブレークポイントであると考えられるので、表示装置3を介して使用者にその旨を知らせる。
更に、ブレークポイント情報が、「異なるアドレス」と「同じソースプログラム記述行」の組み合わせから成るブレークポイントを複数持つなら、前記ブレークポイントが示すデバッグ対象のソースプログラムの行が複数のブレークポイントを持つことを示し、本実施例において用いたC言語では、for文がこの傾向を示すステートメントの1つである。
こうした傾向をブレークポイント情報から得られた場合、表示装置3を介して使用者にその旨を知らせる。
こうした傾向をブレークポイント情報から得られた場合、表示装置3を介して使用者にその旨を知らせる。
本実施例の検査ルーチンの挿入指示に際しては、前述したような情報を表示装置3を介して使用者に提供し、最終的な検査ルーチン挿入動作の可否は使用者が決定し、入力装置4を介して検査ルーチン生成部15に指示する。
このような本実施例によれば、検査ルーチンとして挿入可能なステートメントに幾分制約があるものの、生成されるパッチデータのサイズを小さく抑えることができる。 つまり、従来のバイナリデータだけを比較する差分生成方式よりも、効率の良い検査ルーチンを生成することが出来る。 また、特定のインライン展開された関数の実体である機械語命令列への検査ルーチン挿入も可能となる。
図11は、本発明の実施例2に係るプログラムのパッチデータ生成装置の構成を示すブロック図である。
プログラムのパッチデータ生成装置100には、デバッグ対象のソースプログラム21のデバッグのため、デバッグ対象のソースプログラム21をコンパイルリンクして得られるデバッグ対象の機械語命令列23の読み出しと、前記コンパイルリンクによって得られるデバッグ情報22の読み出しと、検査ソースプログラム24の読み書きと、パッチデータ25の書き込みと、を行うための記憶装置2、パッチデータの生成状況などを表示するための表示装置3、検査ルーチン生成に関するコマンドなどを入力するための入力装置4が接続されている。
また、プログラムのパッチデータ生成装置100には、検査ルーチンを生成するために、検査ソースプログラム管理部120、デバッグ情報管理部140を備え、更に検査ソースプログラム管理部120と、デバッグ情報管理部140と、デバッグ対象の機械語命令列23から、必要な情報を得ることで検査ルーチンの機械語命令列を生成する既存関数差し替え部150を備えている。
コマンド解析部110は、入力装置4から入力されたコマンドを解析し、検査ソースプログラム管理部120、および、既存関数差し替え部150に、それぞれの動作実行を指示する。
検査ソースプログラム管理部120は、記憶装置2からの検査ソースプログラム24の読み出しと、コマンド解析部110を介して使用者が入力した検査ソースプログラムの保持と、前記検査ソースプログラムを検査ソースプログラム24として記憶装置2への書き込みと、既存関数差し替え部150の求めに応じて既存関数差し替え部150への検査ソースプログラムの入力と、を行う。
デバッグ情報管理部140は、デバッグ情報22を基に、デバッグ対象のソースプログラム21の任意に記述された関数や変数についての情報を管理し、既存関数差し替え部150の求めに応じて提供する。
既存関数差し替え部150は、使用者からのコマンド解析部110を介した指示によって動作を開始し、検査ソースプログラム管理部120から代替関数の記述を含んだ検査ソースプログラムと、デバッグ情報管理部140から得られるデバッグ対象のソースプログラム21の任意に記述された既存関数に関する情報と、予めコマンド解析部110に入力装置4を介して使用者より入力されたターゲットメモリの利用状況に関する情報と、デバッグ対象の機械語命令列23と、を基に、デバッグ対象のソースプログラム21に任意に記述された関数(以下、既存関数)を、前記関数と同じ、引数の型と、戻り値の型と、名称と、を持つ前記検査ソースプログラムに記述された関数(以下、代替関数)に差し替えるために必要な、デバッグ対象の機械語命令列23に上書きすることによって適用するパッチデータ25を生成し、記憶装置2に格納するコンパイラである。
次に、このプログラムのパッチデータ生成装置100におけるパッチデータ25の生成に関する動作について、図2(a)、図3、図6〜図9、図12〜図14を用いて説明する。 尚、図2(a)、図3、図6〜図9は実施例1と重複するが、本実施例の説明に必要とする図面と同一内容であるので、本実施例の説明に利用する。
本実施例における、デバッグ情報は同様にDWARF2及びDWARF3形式であり、本実施例を説明するにあたり、前記デバッグ情報を総称してDWARF形式と記述することとする。 また、この説明に用いる機械語命令はコプロセッサを持たない32ビットARM命令である。 DWARF形式についての詳細は、非特許文献1「DWARF Debugging Information Format Version 3」を参照して頂きたい。
図2(a)は、C言語で記述されたデバッグ対象のソースプログラムであり、本実施例における既存関数func1の記述を含む。
図12は、本実施例によって生成されるパッチデータ25を適用することで、デバッグ対象の機械語命令列に組み込まれる代替関数func1のソースプログラムである。 この関数は図2(a)に含まれる既存関数func1と同じ、引数の型と、戻り値の型と、名称と、を持っている。
本発明の実施にあたっては、図13(a)に示すように、先ず、使用者は、入力装置4を介してコマンド解析部110に代替関数func1の記述を含む検査ソースプログラムを入力する。 コマンド解析部110は、入力された前記検査ソースプログラムを検査ソースプログラム管理部120に引き渡し、検査ソースプログラム管理部12は前記検査ソースプログラムを保持する。
次に、使用者は図13(b)に示すように、入力装置4を介してコマンド解析部110に関数の差し替え実行を指示する。 この指示を受けてコマンド解析部110は、既存関数差し替え部150に対して、関数の差し替え実行を指示する。
この指示を受けて、既存関数差し替え部150は、検査ソースプログラム管理部120が保持している検査ソースプログラムを取得して、関数の宣言部のみを対象としたC言語の構文解析を行い、前記検査ソースプログラムに記述された関数の、名称と、引数の型と、戻り値の型と、を各々求める。 この結果、既存関数差し替え部150は、前記検査ソースプログラムに記述された関数の名称が「func1」であることがわかる。 また、引数の型については、第一引数「int」、第二引数「int」、第三引数「struct PARAM」であることが各々分かる。 更に、戻り値の型が「int」であることもわかる。
次に、既存関数差し替え部150は、デバッグ情報管理部140に対して、前記構文解析により取得した代替関数func1と同じ、引数の型と、戻り値の型と、名称と、を備えた既存関数func1の実体がデバッグ対象の機械語命令列23に存在するか否かを問い合わせる。
この問い合わせを受けてデバッグ情報管理部140は、デバッグ情報22を基に、前記代替関数func1と同じ、引数の型と、戻り値の型と、名称と、を備えた関数の実体である機械語命令列がデバッグ対象の機械語命令列23に存在するか否かを調査し、結果を既存関数差し替え部150に返す。
既存関数差し替え部150が、デバッグ情報管理部140より、既存関数func1の実体がデバッグ対象の機械語命令列23に存在するとの結果を受けた場合、更にデバッグ情報管理部140に対して、既存関数func1の実体である機械語命令列が配置されるターゲットメモリ上のアドレス範囲、前記機械語命令列における実行開始アドレス、第一引数〜第三引数の型情報を各々問い合わせる。 尚、既存関数func1の実体がデバッグ対象の機械語命令列23に存在しないとの結果を受けた場合、以後の処理続行は不可能なので、表示装置3を介して使用者にその旨を知らせる。
デバッグ情報管理部140は、既存関数差し替え部150からの要求を受けて、デバッグ情報22を基に、既存関数func1の実体である機械語命令列が配置されているターゲットメモリ上のアドレス範囲、前記機械語命令列の実行開始アドレス、第一引数〜第三引数の型を各々取得し、既存関数差し替え部150に返す。
既存関数差し替え部150は、図14(a)で示す通り、デバッグ情報管理部140から取得した、既存関数func1の第一引数〜第三引数の型および戻り値の型と、ABI仕様の一部である標準呼出規則(The Procedure Call Standard)と、コマンド解析部110に予め使用者によって入力されたターゲットメモリの利用状況の情報と、を各々用いて検査ソースプログラム管理部12から受け取った代替関数func1のソースプログラムをコンパイルし、機械語命令列を生成する。 尚、前記機械語命令列が配置されているターゲットメモリ上のアドレス領域は、入力装置4及びコマンド解析部を経て予め使用者により入力されたターゲットメモリ上の空き領域である。
既存関数差し替え部150は、前記コンパイルの過程において代替関数func1のソースプログラムに記述されている局所変数retの型の実体を構成するための情報をデバッグ情報管理部140に問い合わせる。
デバッグ情報管理部140は、前記問い合わせを受けて、局所変数retの実体を構成するための情報を、ターゲットCPUの製造者を中心として決定されるABI仕様に基づいて既存関数差し替え部150を返す。 局所変数retの型は前記コンパイルにおける構文解析でintであることが分かるから、本実施例におけるターゲットCPUのアーキテクチャの前記ABI仕様より、4バイトで構成される符号付き整数であることがわかる。尚、既存関数に記述された同じ初期値を伴う静的変数を除いて、初期化を伴う静的変数を検査ソースプログラムに記述するには注意を要するので、表示装置3を介して使用者にその旨を知らせる。この理由を述べると、静的変数の実体をターゲットメモリの空き領域に準備することは可能であるが、初期化には別の手段が必要であると考えられるからである。
既存関数差し替え部150は、デバッグ情報管理部140から前述した情報を受け取り、局所変数retの実体がスタックポインタが示すコールフレームに割り当てられるように機械語命令列を生成する。
更に、既存関数差し替え部150は、前記ソースプログラムで用いられている関数logoutの、引数と、戻り値と、実行開始アドレスと、の情報を、デバッグ情報管理部140に問い合わせる。
デバッグ情報管理部140は前記問い合わせを受けて、デバッグ情報22を基に、図9に示すように関数logoutのデバッグ情報エントリを解析し、既存関数差し替え部150に対して関数logoutの、引数と、戻り値と、実行開始アドレスと、の情報を返す。この解析は実施例1における関数logoutに関する記述と同一である。
既存関数差し替え部150は、デバッグ情報管理部140から前述した情報を受け取り、関数logoutの呼び出しを行うための機械語命令列を生成する。
続いて、既存関数差し替え部150は、図14(b)に示す通り、前述したデバッグ情報管理部140から取得した既存関数func1の実行開始アドレスである0x8234に、前記コンパイルによって生成された図14(a)に示す機械語命令列の実行開始アドレス0xA000への機械語命令による無条件分岐命令を書き込む。
最後に、既存関数差し替え部150は、前述した一連の動作によって生成された、図14(a)に示す代替関数func1の機械語命令列および図14(b)に示すデバッグ対象の機械語命令列23における置き換え箇所から構成される、デバッグ対象の機械語命令列23に適用可能なパッチデータ25を生成し、記憶装置2に格納する。このパッチデータの具体的な形式は、インテルHEXフォーマットやモトローラSフォーマットなどの汎用的な既存のフォーマットで足り、デバッグ対象の機械語命令列23に上書きして用いる。
前述した、デバッグ情報管理部140が行う、代替関数func1と同じ、名称と、引数の型と、戻り値の型と、を持つ、既存関数func1の探索処理について詳しく述べると、デバッグ情報管理部140は、デバッグ情報22のセクション「.debug_info」と「.debug_abbrev」が示すデバッグ情報エントリ全体について、タグ「DW_TAG_subprogram」及びタグ「DW_TAG_inlined_subroutine」に属する、関数名を示す属性「DW_AT_name」が持つ文字列に着目し、前記文字列がfunc1であれば、更に前記タグが示す関数の引数と戻り値が、代替関数func1と同じ、引数の型と、戻り値の型と、を持つか調べる。
図7及び図8は、既存関数func1のデバッグ情報エントリの解析結果である。 既存関数func1と、前記代替関数func1の、引数及び戻り値の型情報が一致する様子を下記に示す。
まず、前述した既存関数func1について述べると、の戻り値の型はタグ70の属性704〜706より4バイトで構成される符号付き整数「int」、第一引数はタグブロック71より4バイトで構成される符号付き整数値「int」、第二引数はタグブロック72より4バイトで構成される符号付き整数値「int」、第三引数はタグブロック73より名称が「PARAM」である構造体であり、更に前記構造体のメンバについてタグ7322〜タグ7326より、第一メンバは名称が「v1」である4バイトで構成される符号付き整数「int」、第二メンバは名称が「v2」である4バイトで構成される符号付き整数「int」、第三メンバは名称がv3である4バイトで構成される符号付き整数「int」、第四メンバは名称がv4である4バイトで構成される符号付き整数「int」、第五メンバは名称がmsgで、1バイトで構成される符号付き整数「char」を取り扱うポインタ変数であり、前記ポインタ変数は4バイトで構成されていることが各々わかる。
引数の型及び戻り値の型に関して、前述した既存関数func1と、前記構文解析によって取得した代替関数func1を比較すると、第三引数「struct PARAM」のメンバ構成が代替関数func1において不明であることを除いて、第一引数〜第三引数の型と、戻り値の型は全て一致する。 尚、ここでは代替関数func1の引数のうち、「int」及び「char」のバイナリレベルでの構成が不明なように思えるが、これに関しては、既存関数func1における「int」及び「char」と同一であると解釈しても差し支えない。
第三引数「struct PARAM」の型一致については、代替関数func1を含む検査ソースプログラム内で特に定義されない限りは、既存関数func1の第三引数「struct PARAM」の型と同一であると仮定することで、検査ソースプログラム上で前記「struct PARAM」の定義を省略することが出来るが、厳密に「struct PARAM」のメンバ構成を確認することは出来ない。
次に、既存関数がインライン展開されている場合について詳しく述べると、前記関数の実体である機械語命令列の動作を機械語命令レベルで解析する必要に迫られる場合がある。 この理由を述べると、インライン展開された関数の差し替えを実施するためには、前記関数の機械語命令列の実行終了アドレスが必要だからである。 前記実行終了アドレスが分かれば、前記開始アドレスに到達した時点で代替関数の機械語命令列を実行し、前記終了アドレスの機械語命令実行後のアドレスに無条件分岐するようなパッチデータを生成すれば良いのであるが、前記終了アドレスを特定をすることが困難と考えられる場合、この事実を表示装置3を介して使用者に伝えることが望ましい。 尚、本実施例のデバッグ情報であるDWARF形式は、「.debug_frame」と名付けられたセクションにあるコールフレーム情報によって実行終了アドレスを取得できる場合がある。
また、前述した関数の名称をキーとした既存関数の探索では、複数の既存関数と遭遇することも十分に考えられる。 この原因としては、既存関数がインライン展開されており、デバッグ対象の機械語命令列23においてインライン展開された1つ以上の箇所で条件一致する場合と、デバッグ対象のソースプログラムにおいて、型属性「static」を伴って条件一致する関数が1つ以上の箇所で記述されている場合の2つがある。
前記インライン展開が行われている場合、対象となる関数はタグ「DW_TAG_inlined_subroutine」によって識別が可能である。 また、前記識別子「static」を伴っている場合、タグ「DW_TAG_subprogram」の属性「DW_AT_external」が無いもしくはフラグ値0を持った形で記述されるので、これを基に識別が可能である。
前述した複数の既存関数がある場合、デバッグ対象のソースプログラムにおいて条件一致した箇所を関数差し替え箇所の候補として表示装置3を介して使用者に知らせ、使用者がこれを選択出来ることが望ましい。
前述したような、様々な情報を表示装置3を介して使用者に知らせ、最終的な処理実行の可否は使用者が決定する。
このような本実施例によれば、デバッグ対象の機械語命令列に含まれる既存関数の実体である機械語命令列が、前述した標準呼出規則に準拠していれば、検査ソースプログラムに含まれる代替関数との差し替えを行うことが出来る。 本実施例は、実施例1よりもデバッグ情報の信頼性への依存度が低く、検査ソースプログラムの記述についての自由度も高い。更に、予めデバッグ対象のソースプログラムに記述されている既存関数の「名称」と「引数の型」と「戻り値の型」を使用者が把握している場合、デバッグ対象のソースプログラムそのものが必要ないという特徴もある。しかし、同一の検査ルーチンを挿入する場合、実施例1よりも生成されるパッチデータのサイズが大きくなる。
1、100 プログラムのパッチデータ生成装置
11、110 コマンド解析部
12、120 検査ソースプログラム管理部
13 検査ルーチン挿入位置指定部
14、140 デバッグ情報管理部
15 検査ルーチン生成部
150 既存関数差し替え部
2 記憶装置
21 デバッグ対象のソースプログラム
22 デバッグ情報
23 デバッグ対象の機械語命令列
24 検査ソースプログラム
25 パッチデータ
3 表示装置
4 入力装置
5 デバッグ対象の、ソースプログラム及び機械語命令列の混在表記図
50、51、52、53、54、55、56、57 ブレークポイントに属するデバッグ対象のソースプログラム
501、511、521、531、541、551、561、571 ブレークポイントに属するデバッグ対象の機械語命令列
502、532 プロローグ・ブレークポイント
522、572 エピローグ・ブレークポイント
512、542、552、562 ブレークポイント
5510 レジスタR0を書き換える機械語命令
6 関数の引数及び戻り値の受け渡し規則(The Procedure Call Standard)の一部
7 関数func1のデバッグ情報エントリの解析結果
70、71、72、73、74 タグ
700、701、702、703、704、705、706、707 タグ70の属性
710、711、712、713、714 タグ71の属性
720、721、722、723、724 タグ72の属性
730、731 タグ73の属性
732 タグ73に属するタグ
7322、7323、7324、7325、7326 タグ732に属するタグ
73220、73221、73222、73223、73224 タグ7322の属性
73230、73231、73232、73233、73234 タグ7223の属性
73240、73241、73242、73243、73244 タグ7324の属性
73250、73251、73252、73253、73254 タグ7325の属性
73260、73262、73263、73264、73265、73266 タグ7326の属性
73261 タグ7326に属するタグ
740、741、742、743、744 タグ74の属性
8 関数logoutのデバッグ情報エントリの解析結果
80、81 タグ
800、801、802、803、804、805、806、807 タグ80の属性
810、811、812、813、814、815、816 タグ81の属性
11、110 コマンド解析部
12、120 検査ソースプログラム管理部
13 検査ルーチン挿入位置指定部
14、140 デバッグ情報管理部
15 検査ルーチン生成部
150 既存関数差し替え部
2 記憶装置
21 デバッグ対象のソースプログラム
22 デバッグ情報
23 デバッグ対象の機械語命令列
24 検査ソースプログラム
25 パッチデータ
3 表示装置
4 入力装置
5 デバッグ対象の、ソースプログラム及び機械語命令列の混在表記図
50、51、52、53、54、55、56、57 ブレークポイントに属するデバッグ対象のソースプログラム
501、511、521、531、541、551、561、571 ブレークポイントに属するデバッグ対象の機械語命令列
502、532 プロローグ・ブレークポイント
522、572 エピローグ・ブレークポイント
512、542、552、562 ブレークポイント
5510 レジスタR0を書き換える機械語命令
6 関数の引数及び戻り値の受け渡し規則(The Procedure Call Standard)の一部
7 関数func1のデバッグ情報エントリの解析結果
70、71、72、73、74 タグ
700、701、702、703、704、705、706、707 タグ70の属性
710、711、712、713、714 タグ71の属性
720、721、722、723、724 タグ72の属性
730、731 タグ73の属性
732 タグ73に属するタグ
7322、7323、7324、7325、7326 タグ732に属するタグ
73220、73221、73222、73223、73224 タグ7322の属性
73230、73231、73232、73233、73234 タグ7223の属性
73240、73241、73242、73243、73244 タグ7324の属性
73250、73251、73252、73253、73254 タグ7325の属性
73260、73262、73263、73264、73265、73266 タグ7326の属性
73261 タグ7326に属するタグ
740、741、742、743、744 タグ74の属性
8 関数logoutのデバッグ情報エントリの解析結果
80、81 タグ
800、801、802、803、804、805、806、807 タグ80の属性
810、811、812、813、814、815、816 タグ81の属性
Claims (6)
- デバッグ対象のソースプログラムをコンパイルリンクして得られるデバッグ対象の機械語命令列と、前記コンパイルリンクによって得られるデバッグ情報を入力し、前記デバッグ対象のソースプログラムの任意に記述された関数の呼出と、前記デバッグ対象のソースプログラムの任意に記述された変数の利用を含む、高級言語で記述された検査ソースプログラムの挿入指示に従って、前記デバッグ対象のソースプログラムを再度コンパイルリンクすることなく、前記デバッグ対象の機械語命令列に適用可能な、機械語命令列からなる検査ルーチンのパッチデータを生成することを特徴とする、プログラムのパッチデータ生成装置。
- 前記検査ソースプログラム内で、前記デバッグ対象のソースプログラムの任意に記述された関数と同じ、名称と、引数型と、戻り値型と、を持つ代替関数を記述することで、前記デバッグ対象のソースプログラムの任意に記述された関数を、前記代替関数に差し替える効果を持つパッチデータを生成することを特徴とする、請求項1記載のプログラムのパッチデータ生成装置。
- 前記デバッグ情報が、前記デバッグ対象のソースプログラムの部分集合の先頭行と前記デバッグ対象の機械語命令列の特定アドレスの位置関係を示すブレークポイントと、前記関数の引数の個数と、前記関数の引数の型と、前記関数の戻り値の型と、前記関数の実体である機械語命令列が配置されるターゲットメモリのアドレス範囲と、前記変数の型と、前記変数が配置されるターゲットCPUのレジスタと、前記変数が配置されるターゲットメモリのアドレス範囲と、を情報として備えることを特徴とする、請求項1及至2記載のプログラムのパッチデータ生成装置。
- 前記デバッグ情報から、前記変数が配置されるターゲットCPUのレジスタと、前記変数が配置されるターゲットメモリのアドレス範囲と、を求めるとき、前記デバッグ対象の機械語命令列をターゲットシステム上で実行することなく、前記関数の機械語命令列が置かれているターゲットメモリのアドレスをターゲットCPUのプログラムカウンタの値として用いることを特徴とする、請求項1及至3記載のプログラムのパッチデータ生成装置。
- 前記デバッグ対象のソースプログラムと、前記検査ソースプログラムに用いる前記高級言語が、C言語であることを特徴とする、請求項1及至4記載のプログラムのパッチデータ生成装置。
- 前記デバッグ情報がDWARF2及びDWARF3形式であることを特徴とする、請求項1及至5記載のプログラムのパッチデータ生成装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006258008A JP2008052688A (ja) | 2006-08-26 | 2006-08-26 | プログラムのパッチデータ生成装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006258008A JP2008052688A (ja) | 2006-08-26 | 2006-08-26 | プログラムのパッチデータ生成装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008052688A true JP2008052688A (ja) | 2008-03-06 |
Family
ID=39236657
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006258008A Pending JP2008052688A (ja) | 2006-08-26 | 2006-08-26 | プログラムのパッチデータ生成装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008052688A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2011018135A (ja) * | 2009-07-07 | 2011-01-27 | Ricoh Co Ltd | 電子機器、情報処理方法、及びプログラム |
JP2013025559A (ja) * | 2011-07-21 | 2013-02-04 | Mitsubishi Electric Corp | プログラムトレース管理装置及びプログラムトレース管理方法及びプログラム |
CN103943044A (zh) * | 2014-03-26 | 2014-07-23 | 诺梵(上海)办公系统有限公司 | 一种展示板 |
JP2015141539A (ja) * | 2014-01-28 | 2015-08-03 | 株式会社東芝 | 故障注入プログラム |
JP2019160270A (ja) * | 2018-03-14 | 2019-09-19 | バイドゥ オンライン ネットワーク テクノロジー (ベイジン) カンパニー リミテッド | 欠陥関数を検査する方法、装置、サーバ及びプログラム |
-
2006
- 2006-08-26 JP JP2006258008A patent/JP2008052688A/ja active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2011018135A (ja) * | 2009-07-07 | 2011-01-27 | Ricoh Co Ltd | 電子機器、情報処理方法、及びプログラム |
US8713570B2 (en) | 2009-07-07 | 2014-04-29 | Ricoh Company, Ltd. | Electronic device, information processing method, and storage medium |
JP2013025559A (ja) * | 2011-07-21 | 2013-02-04 | Mitsubishi Electric Corp | プログラムトレース管理装置及びプログラムトレース管理方法及びプログラム |
JP2015141539A (ja) * | 2014-01-28 | 2015-08-03 | 株式会社東芝 | 故障注入プログラム |
CN103943044A (zh) * | 2014-03-26 | 2014-07-23 | 诺梵(上海)办公系统有限公司 | 一种展示板 |
JP2019160270A (ja) * | 2018-03-14 | 2019-09-19 | バイドゥ オンライン ネットワーク テクノロジー (ベイジン) カンパニー リミテッド | 欠陥関数を検査する方法、装置、サーバ及びプログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7478366B2 (en) | Debugger and method for debugging computer programs across multiple programming languages | |
US9582396B2 (en) | Techniques for generating an executable debugger script | |
US6106571A (en) | Relocatable instrumentation tags for testing and debugging a computer program | |
US7266809B2 (en) | Software debugger and software development support system for microcomputer operable to execute conditional execution instruction | |
US20090144705A1 (en) | Debugging device and debugging method | |
US8370807B2 (en) | Debugging for runtime type systems | |
US9626170B2 (en) | Method and computer program product for disassembling a mixed machine code | |
JP5208635B2 (ja) | プログラミングを支援するための情報処理装置、情報処理システム、プログラミング支援方法およびプログラム | |
US20180107585A1 (en) | Using edit and continue to dynamically set and unset optimizations in source code while debugging | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
CN110825386B (zh) | 代码的编译方法和装置、存储介质 | |
US20190108006A1 (en) | Code coverage generation in gpu by using host-device coordination | |
JP5050019B2 (ja) | ソースコード解析システム | |
CN110673837B (zh) | 代码修复方法及装置、电子设备、计算机可读存储介质 | |
JP2008052688A (ja) | プログラムのパッチデータ生成装置 | |
JP6845429B2 (ja) | コンパイラプログラム、情報処理装置およびコンパイル方法 | |
CN111352842A (zh) | 基于嵌入式的软件调试方法 | |
CN113867704A (zh) | 一种代码测试处理方法、装置、电子设备及存储介质 | |
Hill et al. | Pin++: an object-oriented framework for writing pintools | |
CN108614704B (zh) | 代码编译方法及装置 | |
JPH11110256A (ja) | プログラムデバッグ装置、プログラムデバッグ方法及びその方法を記録したコンピュータ読取り可能な記録媒体 | |
CN114489653A (zh) | 基于编译器的数据处理方法、装置以及可读存储介质 | |
JP2009258796A (ja) | プログラム開発装置及びプログラム開発方法 | |
JP2008204023A (ja) | プログラマブルコントローラシステム、プログラマブルコントローラのデバッグ方法 | |
JP2016126700A (ja) | プログラム検証装置、プログラム検証方法及びプログラム検証プログラム |