JP2017072983A - 実行結果表示プログラム、情報処理装置および情報処理システム - Google Patents
実行結果表示プログラム、情報処理装置および情報処理システム Download PDFInfo
- Publication number
- JP2017072983A JP2017072983A JP2015199322A JP2015199322A JP2017072983A JP 2017072983 A JP2017072983 A JP 2017072983A JP 2015199322 A JP2015199322 A JP 2015199322A JP 2015199322 A JP2015199322 A JP 2015199322A JP 2017072983 A JP2017072983 A JP 2017072983A
- Authority
- JP
- Japan
- Prior art keywords
- loop
- line
- information
- source code
- trace
- 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.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
- G06F11/364—Software debugging by tracing the execution of the program tracing values on a bus
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/32—Monitoring with visual or acoustical indication of the functioning of the machine
- G06F11/323—Visualisation of programs or trace data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Data Mining & Analysis (AREA)
- Debugging And Monitoring (AREA)
Abstract
【課題】ループを含む処理の流れの把握を容易にする。【解決手段】情報処理装置10は、記憶部11および表示制御部12を有する。記憶部11は、実行された命令に対応するソースコード13中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報14を記憶する。表示制御部12は、トレース情報14に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報およびループの実行状況を判定する。表示制御部12は、判定したループに属する位置情報に基づいて、判定したループの実行状況とソースコード13とを対応付けて表示させる。【選択図】図1
Description
本発明は実行結果表示プログラム、情報処理装置および情報処理システムに関する。
ソフトウェア開発においては、開発者は、人間が理解容易な高級言語を用いてソースコードを作成することが多い。一纏まりの機能に関するソースコードを作成すると、開発者は、コンパイラやインタープリタなどの変換ツールを用いてソースコードを機械可読な命令に変換して実行させ、ソフトウェアの動作を確認する。ソフトウェアの動作に不具合がある場合、開発者は、不具合が解消するようにソースコードを修正することになる。不具合の原因を特定してソースコードを修正する作業は、デバッグと呼ばれることがある。デバッグにおいては、不具合の原因を特定することが容易でない場合も多い。そこで、開発者は、デバッグを支援するデバッグツールを使用することがある。
例えば、デバッグを支援するプログラムデバッグシステムが提案されている。提案のプログラムデバッグシステムでは、コンパイラが、ソースコードから、実行行番号およびデータ項目値を含むトレース情報を出力する機能が組み込まれたオブジェクトプログラムを生成する。オブジェクトプログラムを実行することでトレース情報が生成されると、トレース情報表示手段が、トレース情報をソースコードと対応付けてディスプレイ装置の画面上に表示する。このとき、トレース情報表示手段は、ユーザからの入力に応じてソースコード中の1つの行を選択し、選択した行について色や下線を付すなどの強調表示を行う。また、トレース情報表示手段は、選択した行に関連するデータ項目値をトレース情報から抽出し、抽出したデータ項目値を画面上に表示する。
また、ソースコードを、トレースデータを高速に採取できるように変換するトレースデータ生成システムが提案されている。提案のトレースデータ生成システムは、ソースコードから、制御の流れに影響を与える制御変数を検出し、制御変数の値の定義と参照の関係を示すUSE−DEFチェインを検出する。トレースデータ生成システムは、検出した制御変数とUSE−DEFチェインに基づいて、制御フローに影響を与えない文をソースコードから削除する。また、トレースデータ生成システムは、制御フローの実行回数を計数するカウンタとカウンタ値を出力する文とを、ソースコードに挿入する。
また、プログラム中の特定箇所の実行時間を測定するトレース装置が提案されている。提案のトレース装置は、オブジェクトプログラムを実行したときに、ソースコード中の場所を示す行番号と、当該場所の実行回数を示す数値と、実行された時刻を示すタイムスタンプとを対応付けたトレース情報を出力する。
上記の特許文献1や特許文献3などに記載されたトレース方法によって、実行された命令に対応するソースコードの行番号を列挙したトレース情報を取得することができる。しかし、ループを含む処理について生成されるトレース情報には、ソースコード中のループ部分の行番号が繰り返し出現することになる。このため、トレース情報に含まれる行番号が示すソースコード行を1ステップずつ確認するデバッグ方法では、ループを含む処理の全体的な流れを把握することが容易でないという問題がある。
1つの側面では、本発明は、ループを含む処理の流れの把握が容易となる実行結果表示プログラム、情報処理装置および情報処理システムを提供することを目的とする。
1つの態様では、コンピュータに以下の処理を実行させる実行結果表示プログラムが提供される。実行された命令に対応するソースコード中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報を取得する。トレース情報に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報およびループの実行状況を判定する。判定したループに属する位置情報に基づいて、判定したループの実行状況とソースコードとを対応付けて表示させる。
また、1つの態様では、記憶部と表示制御部とを有する情報処理装置が提供される。
また、1つの態様では、第1の情報処理装置と第2の情報処理装置とを有する情報処理システムが提供される。第1の情報処理装置は、ソースコードから生成された命令を実行することで、実行された命令に対応するソースコード中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報を生成する。第2の情報処理装置は、生成されたトレース情報を取得し、トレース情報に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報およびループの実行状況を判定し、判定したループに属する位置情報に基づいて、判定したループの実行状況とソースコードとを対応付けて表示させる。
また、1つの態様では、第1の情報処理装置と第2の情報処理装置とを有する情報処理システムが提供される。第1の情報処理装置は、ソースコードから生成された命令を実行することで、実行された命令に対応するソースコード中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報を生成する。第2の情報処理装置は、生成されたトレース情報を取得し、トレース情報に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報およびループの実行状況を判定し、判定したループに属する位置情報に基づいて、判定したループの実行状況とソースコードとを対応付けて表示させる。
1つの側面では、ループを含む処理の流れの把握が容易となる。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、情報処理システムの例を示す図である。
第1の実施の形態の情報処理システムは、情報処理装置10,20を含む。情報処理装置10,20は、ユーザが操作するクライアントコンピュータでもよいし、クライアントコンピュータからアクセスされるサーバコンピュータでもよい。情報処理装置10,20は、ソフトウェア開発におけるデバッグの支援に用いられる。情報処理装置10と情報処理装置20とは、例えば、ネットワークを介して接続されている。
第1の実施の形態の情報処理システムは、情報処理装置10,20を含む。情報処理装置10,20は、ユーザが操作するクライアントコンピュータでもよいし、クライアントコンピュータからアクセスされるサーバコンピュータでもよい。情報処理装置10,20は、ソフトウェア開発におけるデバッグの支援に用いられる。情報処理装置10と情報処理装置20とは、例えば、ネットワークを介して接続されている。
情報処理装置10は、記憶部11および表示制御部12を有する。情報処理装置20は、生成部21を有する。記憶部11は、例えば、RAM(Random Access Memory)などの揮発性の記憶装置、または、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性の記憶装置である。表示制御部12および生成部21は、例えば、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサである。ただし、表示制御部12および生成部21は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリに記憶されたプログラムを実行する。プログラムには、実行結果表示プログラムが含まれる。複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼ぶこともある。
生成部21は、ソースコード13から生成された命令を実行し、トレース情報14を生成する。トレース情報14は、実行された命令に対応するソースコード13中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含む。位置情報列は、命令の実行順序を示していると言うことができ、例えば、命令の実行順序に応じた順序で位置情報を列挙したものである。位置情報として、例えば、ソースコード13の行番号を用いることができる。例えば、ソースコード13はコンパイラによって、プロセッサが実行可能な命令を含むオブジェクトコードに変換される。コンパイラは、情報処理装置10,20の何れが有していてもよい。このとき、実行された命令に対応する位置情報を出力するように、デバッグ用のオブジェクトコードが生成される。デバッグ用のオブジェクトコードは、例えば、その旨のコンパイルオプションが指定されたときにコンパイラが生成する。
ここで、ソースコード13には、ループを示すテキストが含まれている。よって、生成部21は、ループを実行することになる。図1の例では、ソースコード13の行#1に、ループ外の処理を示すテキストが記載されている。行#2に、ループの開始を示すテキストが記載されている。行#3に、ループ内の処理を示すテキストが記載されている。行#4に、ループの終了を示すテキストが記載されている。行#5に、ループ外の処理を示すテキストが記載されている。生成部21は、ソースコード13の行#2〜#4に対応する命令を繰り返し実行する可能性がある。図1の例では、トレース情報14は、「#1,#2,#3,#4,#2,#3,#4,#2,#3,#4,#5」という位置情報列を含む。これは、行#2〜#4に対応する命令が3回繰り返し実行されたことを示す。
情報処理装置10は、情報処理装置20からトレース情報14を取得する。トレース情報14は、例えば、ネットワークを介して伝送される。記憶部11は、情報処理装置20から取得されたトレース情報14を記憶する。ただし、情報処理装置10と異なる情報処理装置20がトレース情報14を生成する代わりに、情報処理装置10がトレース情報14を生成してもよい。すなわち、情報処理装置10のプロセッサが、ソースコード13から生成された命令を実行してもよい。その場合、表示制御部12が生成部21の機能を有し、生成したトレース情報14を記憶部11に格納するようにしてもよい。
表示制御部12は、記憶部11からトレース情報14を取得し、トレース情報14に含まれる位置情報列の中から複数回現れる部分列を検出する。例えば、表示制御部12は、「#1,#2,#3,#4,#2,#3,#4,#2,#3,#4,#5」という位置情報列の中から、3回繰り返して現れる「#2,#3,#4」という部分列を検出する。表示制御部12は、検出した部分列に基づいて、ループに属する位置情報およびループの実行状況を判定する。ループの実行状況には、例えば、ループの繰り返し回数が含まれる。例えば、表示制御部12は、ループに属する位置情報を「#2」,「#3」,「#4」と判定し、ループの繰り返し回数を3回と判定する。
そして、表示制御部12は、判定したループに属する位置情報に基づいて、判定したループの実行状況とソースコード13とを対応付けて表示させる。例えば、表示制御部12は、ループの実行状況とソースコード13とを対応付けた表示画面15を生成する。表示画面15では、ソースコード13に含まれるテキストのうちループに属するテキストの範囲を示す情報が表示され、ループに属するテキストの範囲と対応付けてループの実行状況が表示される。ループに属するテキストの範囲を示す情報は、矢線であってもよい。図1の例では、行#2〜#4をカバーする矢線が表示され、当該矢線の近くにループの繰り返し回数「3回」が表示されている。表示画面15は、例えば、情報処理装置10が有するディスプレイまたは情報処理装置10に接続されたディスプレイに表示される。
第1の実施の形態の情報処理システムによれば、ソースコード13から生成された命令が実行され、位置情報列(例えば、行番号列)を含むトレース情報14が生成される。トレース情報14に含まれる位置情報列の中から複数回現れる部分列が検出され、ループに属する位置情報およびループの実行状況が判定される。そして、ループに属する位置情報に基づいて、ループの実行状況とソースコード13とが対応付けて表示される。これにより、トレース情報14にループ部分の位置情報が繰り返し出現する場合でも、各位置情報に対応するソースコード13のテキストを1ステップずつ確認する方法と比べて、ループの実行状況の把握が容易となる。また、ループを含む処理の全体的な流れの把握が容易となる。これにより、ソフトウェア開発時のデバッグを効率的に行うことができる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図2は、デバッグ装置のハードウェア例を示すブロック図である。
次に、第2の実施の形態を説明する。
図2は、デバッグ装置のハードウェア例を示すブロック図である。
第2の実施の形態のデバッグ装置100は、ソフトウェア開発において開発者によるデバッグを支援する。デバッグ装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。上記のユニットは、バス108に接続されている。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、デバッグ装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、デバッグ装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、実行結果表示プログラムが含まれる。なお、デバッグ装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、デバッグ装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部105は、デバッグ装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、デバッグ装置100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他のコンピュータと通信を行うことができる。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、アクセスポイントと無線リンクで接続される無線通信インタフェースでもよい。
なお、デバッグ装置100は、媒体リーダ106を備えなくてもよい。また、ユーザが操作する端末装置からネットワーク114経由でデバッグ装置100にアクセスできる場合、デバッグ装置100は、画像信号処理部104や入力信号処理部105を備えなくてもよい。また、ディスプレイ111や入力デバイス112が、デバッグ装置100の筐体と一体に形成されてもよい。デバッグ装置100は、第1の実施の形態の情報処理装置10に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。CPU101は、第1の実施の形態の表示制御部12に対応する。
図3は、デバッグ装置の機能例を示すブロック図である。
デバッグ装置100は、ファイル記憶部120、コンパイラ131およびデバッガ132を有する。ファイル記憶部120は、RAM102またはHDD103に確保した記憶領域として実現できる。コンパイラ131およびデバッガ132は、CPU101が実行するプログラムのモジュールとして実現できる。
デバッグ装置100は、ファイル記憶部120、コンパイラ131およびデバッガ132を有する。ファイル記憶部120は、RAM102またはHDD103に確保した記憶領域として実現できる。コンパイラ131およびデバッガ132は、CPU101が実行するプログラムのモジュールとして実現できる。
ファイル記憶部120は、ソースファイル121、実行ファイル122、トレースファイル123および行情報ファイル124を記憶する。
ソースファイル121は、ユーザによって作成されたソースコードを含むファイルである。ソースコードは、FortranやC言語などの人間が理解容易な高級言語を用いて記述される。実行ファイル122は、ソースファイル121に対応するオブジェクトコードを含むファイルである。オブジェクトコードは、CPU101によって実行可能な命令(機械可読な命令)を含む。トレースファイル123は、実行ファイル122に含まれるオブジェクトコードを実行した結果を示すトレース情報を含む。トレース情報は、実行された命令の列に対応するソースコードの行番号の列を含む。行情報ファイル124は、ソースコード上の実行パスを示す行情報を含む。行情報は、トレースファイル123に記憶されたトレース情報を纏めたものであり、ソースコードの行番号を用いて表現される。
ソースファイル121は、ユーザによって作成されたソースコードを含むファイルである。ソースコードは、FortranやC言語などの人間が理解容易な高級言語を用いて記述される。実行ファイル122は、ソースファイル121に対応するオブジェクトコードを含むファイルである。オブジェクトコードは、CPU101によって実行可能な命令(機械可読な命令)を含む。トレースファイル123は、実行ファイル122に含まれるオブジェクトコードを実行した結果を示すトレース情報を含む。トレース情報は、実行された命令の列に対応するソースコードの行番号の列を含む。行情報ファイル124は、ソースコード上の実行パスを示す行情報を含む。行情報は、トレースファイル123に記憶されたトレース情報を纏めたものであり、ソースコードの行番号を用いて表現される。
コンパイラ131は、ファイル記憶部120からソースファイル121を読み出し、ソースファイル121に含まれるソースコードをコンパイルする。コンパイラ131は、コンパイルによって機械可読なオブジェクトコードを生成し、オブジェクトコードを含む実行ファイル122をファイル記憶部120に格納する。第2の実施の形態では、コンパイラ131を起動するときに、コンパイラ131に対してコンパイルオプションとしてデバッグモードが指定される。デバッグモードが指定されると、コンパイラ131は、デバッグ用のオブジェクトコードを生成する。デバッグ用のオブジェクトコードは、実行された命令に対応するソースコードの行番号を出力する機能を有する。
デバッガ132は、ソースファイル121に含まれるソースコードのデバッグを支援する。デバッガ132は、トレース部133および表示制御部134を有する。
トレース部133は、ファイル記憶部120から実行ファイル122を読み出し、実行ファイル122に含まれるオブジェクトコードを実行する。このオブジェクトコードは、上記の通りデバッグ用のオブジェクトコードであるため、実行された命令に対応するソースコードの行番号が順次出力される。トレース部133は、ファイル記憶部120上にトレースファイル123を生成し、オブジェクトコードを実行することで出力される行番号をトレースファイル123に順次書き込んでいく。これにより、実行された命令の列に対応する行番号の列が、トレースファイル123に記載される。
トレース部133は、ファイル記憶部120から実行ファイル122を読み出し、実行ファイル122に含まれるオブジェクトコードを実行する。このオブジェクトコードは、上記の通りデバッグ用のオブジェクトコードであるため、実行された命令に対応するソースコードの行番号が順次出力される。トレース部133は、ファイル記憶部120上にトレースファイル123を生成し、オブジェクトコードを実行することで出力される行番号をトレースファイル123に順次書き込んでいく。これにより、実行された命令の列に対応する行番号の列が、トレースファイル123に記載される。
表示制御部134は、ファイル記憶部120からソースファイル121を読み出し、ソースファイル121に含まれるソースコードをディスプレイ111に表示させる。また、表示制御部134は、ファイル記憶部120からトレースファイル123を読み出し、トレースファイル123に含まれるトレース情報を分析して行情報を生成し、行情報を含む行情報ファイル124をファイル記憶部120に格納する。そして、表示制御部134は、ソースコードと重ねて、行情報が示す実行パスをディスプレイ111に表示させる。
行情報の生成では、表示制御部134は、トレース情報が示す行番号の列の中から繰り返し現れる部分列を検出する。表示制御部134は、連続して同じ部分列が複数回現れる場合は当該部分列をループに属する行番号の列であると推定し、1回の部分列とその出現回数(すなわち、ループの繰り返し回数)との組に変換する。実行パスの表示では、表示制御部134は、ループ以外については連続する行番号を1つ矢線として表現する。また、表示制御部134は、ループについては連続する行番号を1つ矢線として表現すると共に、その矢線の近くに繰り返し回数を示す数値を記載する。これにより、ループおよびループ以外の両方について、ソースコード上の実行パスを簡潔に表現できる。
なお、第2の実施の形態では、ソースコードのコンパイルとオブジェクトコードの実行とトレース結果の可視化の全てを、デバッグ装置100が行うこととした。これに対し、上記の処理を異なるコンピュータによって実行することも可能である。例えば、オブジェクトコードの実行とトレース結果の可視化とを異なるコンピュータで行ってもよい。その場合、トレース部133と表示制御部134とが異なるコンピュータに配置される。コンパイラ131は、トレース部133と同じコンピュータに配置されてもよいし、表示制御部134と同じコンピュータに配置されてもよい。複数のコンピュータを使用する場合、ソースファイル121、実行ファイル122およびトレースファイル123の少なくとも1つは、複数のコンピュータからアクセス可能なストレージ装置に保存されてもよい。
図4は、ソースファイルの例を示す図である。
ファイル記憶部120に記憶されたソースファイル121は、例えば、00001〜00005の5個の行を含む。一例として、行00001には、メイン関数の開始を示すテキストが記載されている。行00002には、ループの開始であること、および、ループ変数iが1〜5の範囲で変化することを示すテキストが記載されている。行00003には、文字列「Hello,World!」を表示する処理を示すテキストが記載されている。行00004には、ループの終了を示すテキストが記載されている。行00005には、メイン関数の終了を示すテキストが記載されている。なお、ソースコードの中に行番号が記載されていてもよいし、記載されていなくてもよい。後者の場合、ソースファイル121の先頭から順に行番号をカウントしていけばよい。
ファイル記憶部120に記憶されたソースファイル121は、例えば、00001〜00005の5個の行を含む。一例として、行00001には、メイン関数の開始を示すテキストが記載されている。行00002には、ループの開始であること、および、ループ変数iが1〜5の範囲で変化することを示すテキストが記載されている。行00003には、文字列「Hello,World!」を表示する処理を示すテキストが記載されている。行00004には、ループの終了を示すテキストが記載されている。行00005には、メイン関数の終了を示すテキストが記載されている。なお、ソースコードの中に行番号が記載されていてもよいし、記載されていなくてもよい。後者の場合、ソースファイル121の先頭から順に行番号をカウントしていけばよい。
ソースファイル121に記載されたメイン関数が実行される場合、まず行00001に対応する命令が実行される。次に、行00002に対応する命令、行00003に対応する命令、行00004に対応する命令が順に実行される。行00002〜00004に対応する命令はループを形成するため、行00004に対応する命令の次に、行00002に対応する命令が再び実行される。このようにして、行00002〜00004に対応する命令が5回繰り返し実行されることになる。行00002〜00004に対応する命令が5回実行された後、最後に行00005に対応する命令が実行される。
図5は、トレースファイルと行情報ファイルの例を示す図である。
上記のソースファイル121から生成された実行ファイル122に含まれるオブジェクトコードが実行されると、図5に示すようなトレースファイル123が生成される。トレースファイル123は、ファイル記憶部120に格納される。トレースファイル123は、例えば、17個の行番号を含む。トレースファイル123に含まれる複数の行番号は、オブジェクトコードを実行したときの命令の実行順序に対応する順序で並んでいる。
上記のソースファイル121から生成された実行ファイル122に含まれるオブジェクトコードが実行されると、図5に示すようなトレースファイル123が生成される。トレースファイル123は、ファイル記憶部120に格納される。トレースファイル123は、例えば、17個の行番号を含む。トレースファイル123に含まれる複数の行番号は、オブジェクトコードを実行したときの命令の実行順序に対応する順序で並んでいる。
一例として、トレースファイル123には、先頭に「00001」が記載されている。トレースファイル123には、「00001」の次に、「00002」,「00003」,「00004」が5回繰り返して記載されている。これは、ソースコードの行00002〜00004のテキストがループを示しており、行00002〜00004に対応する命令が5回繰り返して実行されたことを意味している。そして、トレースファイル123には、最後に「00005」が記載されている。
上記のトレースファイル123に基づいて、行情報ファイル124が生成される。行情報ファイル124は、ファイル記憶部120に格納される。行情報ファイル124は、トレースファイル123に記載された行番号の列を纏めた1または2以上のエントリを含む。行情報ファイル124に含まれる1つのエントリは、連続する行番号の列を示す。トレース結果を可視化するとき、行情報ファイル124の1つのエントリが、ソースコード上の実行パスを示す1つの矢線として表現される。
一例として、行情報ファイル124には、先頭に「00001」が記載されている。行情報ファイル124には、「00001」の次に、「00002−00004*5」が記載されている。これは、行00002に対応する命令から行00004に対応する命令まで連続で実行されたことを示している。また、この範囲の命令が5回繰り返して実行されたことを示している。この「00002−00004*5」は、トレースファイル123に含まれる「00002」,「00003」,「00004」,「00002」,…,「00004」という連続する15個の行番号を纏めることで生成されたものである。そして、行情報ファイル124には、最後に「00005」が記載されている。
図6は、ソースコードの表示例を示す図である。
トレース結果を可視化するにあたり、表示制御部134は、上位レイヤ141と下位レイヤ142とを重ねてディスプレイ111に表示させる。上位レイヤ141には、行情報ファイル124に基づいて、実行パスを示す矢線とループの実行回数が表示される。下位レイヤ142には、ソースファイル121に含まれるソースコードが表示される。
トレース結果を可視化するにあたり、表示制御部134は、上位レイヤ141と下位レイヤ142とを重ねてディスプレイ111に表示させる。上位レイヤ141には、行情報ファイル124に基づいて、実行パスを示す矢線とループの実行回数が表示される。下位レイヤ142には、ソースファイル121に含まれるソースコードが表示される。
具体的には、上位レイヤ141には、行情報ファイル124に含まれるエントリ1つにつき、当該エントリが示す行番号の範囲を示す縦方向の矢線が1つ表示される。エントリに繰り返し回数が含まれている場合、当該矢線の近くに繰り返し回数を示す数値が表示される。行情報ファイル124に含まれる複数のエントリに対応する複数の矢線は、左から右に向かって並べられる。例えば、上位レイヤ141には、3個の矢線が表示される。左から1番目の矢線は、行00001をカバーする。左から2番目の矢線は、行00002〜00004をカバーする。左から2番目の矢線の近くには、繰り返し回数「5」が表示される。左から3番目の矢線は、行00005をカバーする。
上位レイヤ141の矢線と下位レイヤ142のソースコードとは、行番号によって紐付けられている。ソースコードが長い場合、ディスプレイ111にはソースコード中の一部の行のテキストのみが表示されることがある。この場合、ユーザは入力デバイス112を用いて、下位レイヤ142を上下方向にスクロールする操作を行うことがある。すると、下位レイヤ142のソースコードと連動して、上位レイヤ141の矢線も上下方向に移動する。一方、ソースコードが長い場合、ディスプレイ111には複数の矢線の一部のみが表示されることがある。この場合、ユーザは入力デバイス112を用いて、上位レイヤ141を左右方向にスクロールする操作を行うことがある。すると、下位レイヤ142とは独立して、上位レイヤ141の矢線が左右方向に移動する。
すなわち、上下方向のスクロールについては、上位レイヤ141と下位レイヤ142とが連動する。下位レイヤ142のソースコードが上下方向に移動すると、上位レイヤ141の矢線も上下方向に移動する。一方、左右方向のスクロールについては、上位レイヤ141と下位レイヤ142とは連動しない。下位レイヤ142のソースコードは左右方向に移動せず、上位レイヤ141の矢線のみ左右方向に移動する。左右方向に多数の矢線が並んだ場合でも、ソースコードとの関係を確認することが容易となる。
上記では、ソースコードに単階層のループが記載されている場合のトレース結果の可視化について説明した。一方、ソースコードに多重ループが記載されている場合についても、トレース結果を簡潔に可視化することが可能である。
図7は、ソースファイルの他の例を示す図である。
ここでは、ファイル記憶部120に、ソースファイル121に代えてソースファイル121aが記憶されている場合を考える。ファイル記憶部120に記憶されたソースファイル121aは、00001〜00008の8個の行を含む。一例として、行00001には、メイン関数の開始を示すテキストが記載されている。行00002には、外側ループの開始であること、および、ループ変数iが1〜5の範囲で変化することを示すテキストが記載されている。行00003には、内側ループの開始であること、および、ループ変数jが1〜3の範囲で変化することを示すテキストが記載されている。
ここでは、ファイル記憶部120に、ソースファイル121に代えてソースファイル121aが記憶されている場合を考える。ファイル記憶部120に記憶されたソースファイル121aは、00001〜00008の8個の行を含む。一例として、行00001には、メイン関数の開始を示すテキストが記載されている。行00002には、外側ループの開始であること、および、ループ変数iが1〜5の範囲で変化することを示すテキストが記載されている。行00003には、内側ループの開始であること、および、ループ変数jが1〜3の範囲で変化することを示すテキストが記載されている。
行00004には、文字列「Hello,World!」を表示する処理を示すテキストが記載されている。行00004のテキストが示す処理は、内側ループに属している。行00005には、内側ループの終了を示すテキストが記載されている。行00006には、変数kに1000を代入する処理を示すテキストが記載されている。行00006のテキストが示す処理は、内側ループには属していないが外側ループに属している。行00007には、外側ループの終了を示すテキストが記載されている。行00008には、メイン関数の終了を示すテキストが記載されている。
ソースファイル121aに記載されたメイン関数が実行される場合、まず行00001に対応する命令が実行される。次に、行00002に対応する命令、行00003に対応する命令、行00004に対応する命令、行00005に対応する命令が順に実行される。行00003〜00005に対応する命令は内側ループを形成するため、行00005に対応する命令の次に、行00003に対応する命令が再び実行される。このようにして、行00003〜00005に対応する命令が3回繰り返し実行されることになる。
行00003〜00005に対応する命令が3回実行された後、行00006に対応する命令、行00007に対応する命令が順に実行される。行00002〜00007に対応する命令は外側ループを形成するため、行00007に対応する命令の次に、行00002に対応する命令が再び実行される。そして、行00003〜00005に対応する命令が再び3回繰り返し実行される。このようにして、行00002,00006,00007に対応する命令が5回繰り返し実行され、その1回の実行につき行00003〜00005に対応する命令が3回ずつ実行されることになる。外側ループの処理が5回実行された後、最後に行00008に対応する命令が実行される。
図8は、トレースファイルと行情報ファイルの他の例を示す図である。
上記のソースファイル121aから生成された実行ファイルに含まれるオブジェクトコードが実行されると、図8に示すようなトレースファイル123aが生成される。トレースファイル123aは、例えば、62個の行番号を含む。
上記のソースファイル121aから生成された実行ファイルに含まれるオブジェクトコードが実行されると、図8に示すようなトレースファイル123aが生成される。トレースファイル123aは、例えば、62個の行番号を含む。
一例として、トレースファイル123aには、先頭に「00001」が記載されている。トレースファイル123aには、「00001」の次に「00002」が記載され、その次に「00003」,「00004」,「00005」が3回繰り返して記載されている。これは、行00003〜00005が内側ループを形成し、その繰り返しが3回であることを示している。トレースファイル123aには、「00005」の次に「00006」,「00007」が記載されている。トレースファイル123aには、上記の「00002」から「00007」までの12個の行番号が、5回繰り返し現れる。これは、行00002〜00007が外側ループを形成し、その繰り返しが5回であることを示している。トレースファイル123aには、最後に「00008」が記載されている。
上記のトレースファイル123aに基づいて、行情報ファイル124aが生成される。行情報ファイル124aは、トレースファイル123aに記載された行番号の列を纏めた1または2以上のエントリを含む。行情報ファイル124aに含まれる1つのエントリは、連続する行番号の列を示す。多重ループが存在する場合、行情報ファイル124aの1つのエントリは、1つの外側ループに対応する。行情報ファイル124aの1つのエントリの中に、内側ループの範囲を示す情報が包含されていることがある。
一例として、行情報ファイル124aには、先頭に「00001」が記載されている。行情報ファイル124aには、「00001」の次に、「00002−00007(00003−00005*3)*5」が記載されている。このエントリの外側の「00002−00007*5」は、行00002に対応する命令から行00007に対応する命令まで5回繰り返して実行されたことを示している。また、このエントリの内側の「00003−00005*3」は、行00003〜00005の範囲の命令が、外側の繰り返し1回につき3回ずつ繰り返して実行されたことを示している。そして、行情報ファイル124aには、最後に「00008」が記載されている。
ここで、内側ループの「00003−00005*3」は、トレースファイル123aに含まれる「00003」,「00004」,「00005」,「00003」,…,「00005」という連続する9個の行番号を纏めることで生成されたものである。また、外側ループの「00002−00007*5」は、内側ループの検出結果を受けて、「00002」,「00003−00005*3」,「0006」,「00007」,「00002」,…,「00007」という列を更に纏めることで生成されたものである。すなわち、多重ループを示す行情報ファイル124aのエントリは、内側ループから順に、連続する行番号の範囲と繰り返し回数を纏めていくことで生成することができる。
図9は、ソースコードの他の表示例を示す図である。
表示制御部134は、上位レイヤ141aと下位レイヤ142aとを重ねてディスプレイ111に表示させる。上位レイヤ141aには、行情報ファイル124aに基づいて、実行パスを示す矢線とループの実行回数が表示される。下位レイヤ142aには、ソースファイル121aに含まれるソースコードが表示される。
表示制御部134は、上位レイヤ141aと下位レイヤ142aとを重ねてディスプレイ111に表示させる。上位レイヤ141aには、行情報ファイル124aに基づいて、実行パスを示す矢線とループの実行回数が表示される。下位レイヤ142aには、ソースファイル121aに含まれるソースコードが表示される。
行情報ファイル124aに階層的な行番号の範囲を示すエントリが含まれている場合、上位レイヤ141aには、階層的な矢線が表示される。すなわち、上位レイヤ141aには、内側ループに対応する矢線が表示され、内側ループの矢線を包含するように、外側ループに対応する矢線が表示される。内側ループの矢線の近くには内側ループの繰り返し回数が表示され、外側ループの矢線の近くには外側ループの繰り返し回数が表示される。内側ループの繰り返し回数は、外側ループの矢線の内部に表示されてもよい。
例えば、上位レイヤ141aには、3個の矢線が表示される。左から1番目の矢線は、行00001をカバーする。左から2番目の矢線は、行00002〜00007をカバーする。左から2番目の矢線の近くには、繰り返し回数「5」が表示される。また、左から2番目の矢線の内部には、行00003〜00005をカバーする矢線が含まれる。内部の矢線の近くには、繰り返し回数「3」が表示される。すなわち、行00002〜00007の矢線は外側ループを示し、行00003〜00005の矢線は内側ループを示す。左から3番目の矢線は、行00008をカバーする。上位レイヤ141aの矢線と下位レイヤ142aのソースコードとは、行番号によって紐付けられている。
次に、デバッグ装置100が行う処理の手順について説明する。なお、以下ではソースファイル121、トレースファイル123および行情報ファイル124を使用するものとして説明するが、これらのファイルに代えてソースファイル121a、トレースファイル123aおよび行情報ファイル124aを使用してもよい。
図10は、デバッグ処理の手順例を示すフローチャートである。
(S10)コンパイラ131は、デバッグモードのコンパイルオプションが指定されたコンパイルコマンドを受け付ける。コンパイルコマンドは、ユーザから入力されてもよいし、デバッガ132から入力されてもよい。コンパイラ131は、ファイル記憶部120からソースファイル121を読み出し、ソースファイル121に含まれるソースコードをコンパイルする。コンパイルにおいては、実行された命令に対応するソースコードの行番号が出力されるように、デバッグ用の機能が実装される。
(S10)コンパイラ131は、デバッグモードのコンパイルオプションが指定されたコンパイルコマンドを受け付ける。コンパイルコマンドは、ユーザから入力されてもよいし、デバッガ132から入力されてもよい。コンパイラ131は、ファイル記憶部120からソースファイル121を読み出し、ソースファイル121に含まれるソースコードをコンパイルする。コンパイルにおいては、実行された命令に対応するソースコードの行番号が出力されるように、デバッグ用の機能が実装される。
(S11)コンパイラ131は、コンパイルの結果としてソースコードに対応するオブジェクトコードを生成する。コンパイラ131は、オブジェクトコードを含む実行ファイル122を生成し、ファイル記憶部120に保存する。
(S12)トレース部133は、ファイル記憶部120から実行ファイル122を読み出し、実行ファイル122に含まれるオブジェクトコードを実行する。このオブジェクトコードにはデバッグ用の機能が実装されている。このため、トレース部133は、機械可読な命令に対応するソースコードの行番号を順次取得する。
(S13)トレース部133は、トレース情報を含むトレースファイル123を生成し、ファイル記憶部120に保存する。トレース情報には、オブジェクトコードを実行することで取得された複数の行番号が、取得された順に列挙されている。
(S14)表示制御部134は、ファイル記憶部120からトレースファイル123を読み出す。表示制御部134は、トレースファイル123に含まれるトレース情報からループを検出する。具体的には、表示制御部134は、トレース情報が示す行番号の列から、ループに属する行番号およびループの繰り返し回数を算出する。ループは多重ループである可能性もある。ループ検出の詳細は後述する。
(S15)表示制御部134は、検出したループに関する行番号の列を纏めて簡潔な表現に置換することで、トレース情報から行情報を生成する。表示制御部134は、行情報を含む行情報ファイル124を生成し、ファイル記憶部120に保存する。
(S16)表示制御部134は、ファイル記憶部120からソースファイル121と行情報ファイル124を読み出し、行情報ファイル124に含まれる行情報を可視化する。具体的には、表示制御部134は、ソースファイル121に含まれるソースコードをディスプレイ111に表示する。また、表示制御部134は、ソースコードと重ねて、行情報が示す実行パスの情報をディスプレイ111に表示する。実行パスの情報には、命令の実行列に対応するソースコードの行番号の範囲を示す矢線や、ループの繰り返し回数を示す数値が含まれる。実行パス表示の詳細は後述する。
図11は、ループ検出の手順例を示すフローチャートである。
このループ検出は、上記のステップS14において実行される。
(S20)表示制御部134は、トレース情報の先頭(出力された順序が早い方)から、未選択の行番号を1つ選択する。ここで選択した行番号を行番号aとする。
このループ検出は、上記のステップS14において実行される。
(S20)表示制御部134は、トレース情報の先頭(出力された順序が早い方)から、未選択の行番号を1つ選択する。ここで選択した行番号を行番号aとする。
(S21)表示制御部134は、トレース情報の中から行番号aの1つ後ろの行番号を参照する。ここで参照される行番号を行番号bとする。
(S22)表示制御部134は、行番号a,bの両方を取得できたか判断する。ステップS20において未選択の行番号が存在しない場合、表示制御部134は、行番号aの取得に失敗する。また、ステップS21において行番号aの1つ後ろの行番号が存在しない場合(行番号aの取得に失敗した場合または行番号aがトレース情報の末尾である場合)、表示制御部134は、行番号bの取得に失敗する。行番号a,bの両方を取得できた場合はステップS23に処理が進み、それ以外の場合はステップS28に処理が進む。
(S22)表示制御部134は、行番号a,bの両方を取得できたか判断する。ステップS20において未選択の行番号が存在しない場合、表示制御部134は、行番号aの取得に失敗する。また、ステップS21において行番号aの1つ後ろの行番号が存在しない場合(行番号aの取得に失敗した場合または行番号aがトレース情報の末尾である場合)、表示制御部134は、行番号bの取得に失敗する。行番号a,bの両方を取得できた場合はステップS23に処理が進み、それ以外の場合はステップS28に処理が進む。
(S23)表示制御部134は、行番号aと行番号bを比較し、行番号aが行番号bより大きいか判断する。行番号aが行番号bより大きい場合はステップS24に処理が進み、行番号aが行番号b以下である場合はステップS20に処理が進む。
(S24)表示制御部134は、ソースコードのb行からa行までの範囲のテキストを、1つのループを記載したテキストであると判定する。
(S25)表示制御部134は、トレース情報が示す行番号の列の中から、b行からa行までの範囲の行番号が連続している部分列を検索する。
(S25)表示制御部134は、トレース情報が示す行番号の列の中から、b行からa行までの範囲の行番号が連続している部分列を検索する。
(S26)表示制御部134は、検索した部分列に含まれる行番号を、ステップS20において選択済の行番号であるとみなす。また、表示制御部134は、検索した部分列それぞれを、ループに属する行番号を列挙した表現から、開始行を示す行番号bと終了行を示す行番号aとを用いた範囲表現に置換する。ここで、部分列の中に既に範囲表現に置換されているものが含まれる場合、内部の範囲表現は内側ループを示し、今回生成する範囲表現は外側ループを示す。この場合、内部の範囲表現も付記しておく。
(S27)表示制御部134は、同じ範囲表現が連続して現れる回数をカウントし、連続する複数の範囲表現を、1個の範囲表現とループの繰り返し回数の組に纏める。そして、ステップS20に処理が進む。
(S28)表示制御部134は、トレース情報に含まれる行番号のうち、ステップS26,S27で範囲表現に置換されていない行番号、すなわち、ループに属さない行番号について、連続している行番号を範囲表現に置換する。ステップS26,S27,S28の置換によって、行情報ファイル124のエントリが生成される。
例えば、図5に示したトレースファイル123の場合、まず行番号aとして「00001」が選択され、行番号bとして「00002」が参照される。a<bであるため、ループは検出されない。次に、行番号aとして「00002」が選択され、行番号bとして「00003」が参照される。次に、行番号aとして「00003」が選択され、行番号bとして「00004」が参照される。ここまではa<bであるため、ループは検出されない。次に、行番号aとして「00004」が選択され、行番号bとして「00002」が参照される。a>bであるため、行00002〜00004がループと判定される。
すると、トレースファイル123から、「00002」から「00004」までの部分列が検出され、各部分列が「00002−00004」の範囲表現に置換される。これにより、「00002−00004」が5回連続して現れる。よって、連続する5個の「00002−00004」が「00002−00004*5」に置換される。次に、「00002」から「00004」までの部分列が除外されたため、行番号aとして「00005」が選択される。一方、行番号aがトレースファイル123の末尾であるため、行番号bとして何も参照されない。よって、ループの検出が終了する。これにより、「00001」,「00002−00004*5」,「00005」が生成される。
また、図8に示したトレースファイル123aの場合、行番号aとして「00001」が選択され、行番号bとして「00002」が参照される。a<bであるため、ループは検出されない。次に、行番号aとして「00002」が選択され、行番号bとして「00003」が参照される。次に、行番号aとして「00003」が選択され、行番号bとして「00004」が参照される。次に、行番号aとして「00004」が選択され、行番号bとして「00005」が参照される。ここまではa<bであるため、ループは検出されない。次に、行番号aとして「00005」が選択され、行番号bとして「00003」が参照される。a>bであるため、行00003〜00005がループと判定される。
すると、トレースファイル123aから、「00003」から「00005」までの部分列が検出され、各部分列が「00003−00005」の範囲表現に置換される。これにより、「00003−00005」が3回ずつ連続して現れる。よって、連続する3個の「00003−00005」が「00003−00005*3」に置換される。この時点で、トレースファイル123aは、「00001」,「00002」,「00003−00005*3」,「00006」,「00007」,「00002」,「00003−00005*3」,…,「00007」,「00008」という記載になる。
次に、「00003」から「00005」までの部分列が除外されたため、行番号aとして「00006」が選択され、行番号bとして「00007」が参照される。a<bであるため、ループは検出されない。次に、行番号aとして「00007」が選択され、行番号bとして「00002」が参照される。a>bであるため、行00002〜00007がループと判定される。すると、トレースファイル123aから、「00002」から「00007」までの部分列が検出される。検出された部分列には、既に範囲表現に置換されている「00003−00005*3」が含まれる。そこで、各部分列が「00002−00007(00003−00005*3)」の階層的な範囲表現に置換される。
これにより、「00002−00007(00003−00005*3)」が5回連続して現れることになる。よって、連続する5個の「00002−00007(00003−00005*3)」が「00002−00007(00003−00005*3)*5」に置換される。次に、「00002」から「00007」までの部分列が除外されたため、行番号aとして「00008」が選択される。一方、行番号aがトレースファイル123aの末尾であるため、行番号bとして何も参照されない。よって、ループの検出が終了する。これにより、「00001」,「00002−00007(00003−00005*3)*5」,「00008」が生成される。
図12は、実行パス表示の手順例を示すフローチャートである。
この実行パス表示は、上記のステップS16において実行される。
(S30)表示制御部134は、行情報の先頭からエントリを1つ読み込む。
この実行パス表示は、上記のステップS16において実行される。
(S30)表示制御部134は、行情報の先頭からエントリを1つ読み込む。
(S31)表示制御部134は、ステップS30で読み込んだエントリに含まれる行範囲の包含関係を判定する。すなわち、表示制御部134は、エントリが単一の行を示しているか複数行の行範囲を示しているか判定する。エントリが複数行の行範囲を示している場合、表示制御部134は、その行範囲に繰り返し回数が付加されているか判定する。行範囲に繰り返し回数が付加されている場合、表示制御部134は、その行範囲に包含される下位の行範囲がエントリに含まれているか判定する。表示制御部134は、各階層の行範囲と繰り返し回数をエントリから抽出し、その包含関係を把握する。
(S32)表示制御部134は、抽出した行範囲を下位から優先的に1つ選択する。なお、ここで言う「行範囲」には単一の行の場合も含まれるものとする。
(S33)表示制御部134は、選択した行範囲をカバーする縦方向の矢線を上位レイヤ141に表示する。表示する矢線の縦方向の座標は、下位レイヤ142に表示されるソースコードの行番号に対応するように算出される。表示する矢線の横方向の座標は、左端または1つ前に表示した矢線の右側になるように算出される。ステップS30で読み込んだエントリについて、下位の行範囲に対応する下位の矢線が既に存在する場合、表示制御部134は、当該下位の矢線を包含するように今回の矢線を表示する。
(S33)表示制御部134は、選択した行範囲をカバーする縦方向の矢線を上位レイヤ141に表示する。表示する矢線の縦方向の座標は、下位レイヤ142に表示されるソースコードの行番号に対応するように算出される。表示する矢線の横方向の座標は、左端または1つ前に表示した矢線の右側になるように算出される。ステップS30で読み込んだエントリについて、下位の行範囲に対応する下位の矢線が既に存在する場合、表示制御部134は、当該下位の矢線を包含するように今回の矢線を表示する。
(S34)表示制御部134は、ステップS32で選択した行範囲に繰り返し回数が付加されているか判断する。繰り返し回数が付加されている場合はステップS35に処理が進み、繰り返し回数が付加されていない場合はステップS36に処理が進む。
(S35)表示制御部134は、上位レイヤ141においてステップS33で表示した矢線の近くに繰り返し回数を表示する。例えば、表示制御部134は、矢線から所定の方向に所定の座標だけ離れた位置に、繰り返し回数を表示する。
(S36)表示制御部134は、ステップS31で判定した包含関係に基づいて、ステップS32で選択した行範囲を包含する上位の行範囲が存在するか判断する。上位の行範囲が存在する場合はステップS32に処理が進み、1つ上位の行範囲が選択される。上位の行範囲が存在しない場合はステップS37に処理が進む。
(S37)表示制御部134は、ステップS30において行情報から全てのエントリを読み込んだか判断する。全てのエントリを読み込んだ場合は実行パス表示が終了し、読み込んでいないエントリが存在する場合はステップS30に処理が進む。
例えば、図5に示した行情報ファイル124が生成された場合、まず「00001」が読み込まれ、上位レイヤ141の左端に行00001をカバーする矢線が表示される。次に、「00002−00004*5」が読み込まれ、上位レイヤ141の左から2列目に行00002〜00004をカバーする矢線が表示される。また、この矢線の近くに繰り返し回数「5」が表示される。次に、「00005」が読み込まれ、上位レイヤ141の左から3列目に行00005をカバーする矢線が表示される。
また、図8に示した行情報ファイル124aが生成された場合、まず「00001」が読み込まれ、上位レイヤ141aの左端に行00001をカバーする矢線が表示される。次に、「00002−00007(00003−00005*3)*5」が読み込まれ、上位レイヤ141aの左から2列目に行00003〜00005をカバーする矢線が表示される。また、この矢線の近くに繰り返し回数「3」が表示される。更に、この矢線を包含するように、行00002〜00007をカバーする矢線が表示される。また、この矢線の近くに繰り返し回数「5」が表示される。次に、「00008」が読み込まれ、上位レイヤ141aの左から3列目に行00008をカバーする矢線が表示される。
第2の実施の形態のデバッグ装置100によれば、実行された命令に対応するソースコードの行番号を出力するデバッグ用のオブジェクトコードが生成される。当該オブジェクトコードを実行することで、行番号をトレースしたトレース情報が生成される。トレース情報が示す行番号の列の中からループが検出される。そして、ループについては実行された行範囲をカバーする1つの矢線と繰り返し回数とが表示される。これにより、トレース情報にループに属する行番号が繰り返し出現する場合でも、トレースした行番号に対応するソースコード中のテキストを1ステップずつ確認する方法と比べて、ループの実行状況の把握が容易となる。また、実行パス全体の把握が容易となる。
これにより、ソフトウェア開発時のデバッグを効率的に行うことができる。また、多重ループについては、内側ループに対応する矢線を包含するように外側ループに対応する矢線が表示される。これにより、多重ループの実行状況が簡潔に表現され、その把握が容易となる。また、実行パスとソースコードとが異なるレイヤで表示される。上下方向については2つのレイヤが連動して移動し、左右方向についてはソースコードのレイヤとは独立して実行パスのレイヤが移動する。これにより、実行パスのレイヤに多数の矢線が表示された場合にも、矢線と行番号との対応関係を把握することが容易となる。
なお、第1の実施の形態の情報処理は、情報処理装置10,20にプログラムを実行させることで実現できる。第2の実施の形態の情報処理は、デバッグ装置100にプログラムを実行させることで実現できる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムをコピーして実行してもよい。
10,20 情報処理装置
11 記憶部
12 表示制御部
13 ソースコード
14 トレース情報
21 生成部
11 記憶部
12 表示制御部
13 ソースコード
14 トレース情報
21 生成部
Claims (5)
- コンピュータに、
実行された命令に対応するソースコード中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報を取得し、
前記トレース情報に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報および前記ループの実行状況を判定し、
判定した前記ループに属する位置情報に基づいて、判定した前記ループの実行状況と前記ソースコードとを対応付けて表示させる、
処理を実行させる実行結果表示プログラム。 - 前記ループの実行状況の表示では、前記ループに属する前記ソースコード中のテキストの範囲を示す情報と、前記ループの繰り返し回数とを表示させる、
請求項1記載の実行結果表示プログラム。 - 前記ループを包含する他のループが存在する場合、前記ループに属するテキストの範囲を示す情報および前記ループの繰り返し回数と、前記他のループに属するテキストの範囲を示す情報および前記他のループの繰り返し回数とを階層的に表示させる、
請求項2記載の実行結果表示プログラム。 - 実行された命令に対応するソースコード中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報を記憶する記憶部と、
前記トレース情報に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報および前記ループの実行状況を判定し、判定した前記ループに属する位置情報に基づいて、判定した前記ループの実行状況と前記ソースコードとを対応付けて表示させる表示制御部と、
を有する情報処理装置。 - ソースコードから生成された命令を実行することで、実行された命令に対応する前記ソースコード中のテキストの位置を示す位置情報の列であって、命令の実行順序を記憶した位置情報列を含むトレース情報を生成する第1の情報処理装置と、
生成された前記トレース情報を取得し、前記トレース情報に含まれる位置情報列の中から複数回現れる部分列を検出することで、ループに属する位置情報および前記ループの実行状況を判定し、判定した前記ループに属する位置情報に基づいて、判定した前記ループの実行状況と前記ソースコードとを対応付けて表示させる第2の情報処理装置と、
を有する情報処理システム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2015199322A JP2017072983A (ja) | 2015-10-07 | 2015-10-07 | 実行結果表示プログラム、情報処理装置および情報処理システム |
US15/246,581 US20170103011A1 (en) | 2015-10-07 | 2016-08-25 | Information processing apparatus and system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2015199322A JP2017072983A (ja) | 2015-10-07 | 2015-10-07 | 実行結果表示プログラム、情報処理装置および情報処理システム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2017072983A true JP2017072983A (ja) | 2017-04-13 |
Family
ID=58498595
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2015199322A Withdrawn JP2017072983A (ja) | 2015-10-07 | 2015-10-07 | 実行結果表示プログラム、情報処理装置および情報処理システム |
Country Status (2)
Country | Link |
---|---|
US (1) | US20170103011A1 (ja) |
JP (1) | JP2017072983A (ja) |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5226162A (en) * | 1990-01-22 | 1993-07-06 | International Business Machines Corporation | Assist program for operating a debug program in conjunction with a user program |
US5371747A (en) * | 1992-06-05 | 1994-12-06 | Convex Computer Corporation | Debugger program which includes correlation of computer program source code with optimized object code |
US6795963B1 (en) * | 1999-11-12 | 2004-09-21 | International Business Machines Corporation | Method and system for optimizing systems with enhanced debugging information |
US20050273757A1 (en) * | 2004-06-07 | 2005-12-08 | Anderson Craig D | Methods, systems, and computer program products for summarizing operational behavior of a computer program |
US10289411B2 (en) * | 2013-11-18 | 2019-05-14 | Microsoft Technology Licensing, Llc | Diagnosing production applications |
US9436577B2 (en) * | 2013-11-22 | 2016-09-06 | Nintendo Co., Ltd. | System and method for generating a code execution timeline from an executing program |
US9703681B2 (en) * | 2014-05-29 | 2017-07-11 | Microsoft Technology Licensing, Llc | Performance optimization tip presentation during debugging |
US9632915B2 (en) * | 2014-10-29 | 2017-04-25 | Microsoft Technology Licensing, Llc. | Historical control flow visualization in production diagnostics |
-
2015
- 2015-10-07 JP JP2015199322A patent/JP2017072983A/ja not_active Withdrawn
-
2016
- 2016-08-25 US US15/246,581 patent/US20170103011A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20170103011A1 (en) | 2017-04-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5133973B2 (ja) | 難読化支援装置、難読化支援方法、プログラムおよび集積回路 | |
Campos et al. | Gzoltar: an eclipse plug-in for testing and debugging | |
CN107111544B (zh) | 生产诊断中的历史控制流可视化 | |
US9047399B2 (en) | Generating visualization from running executable code | |
US10761963B2 (en) | Object monitoring in code debugging | |
US20070162903A1 (en) | Systems and methods for identifying and displaying dependencies | |
JP2006185211A (ja) | プログラム解析装置、テスト実行装置、その解析方法及びプログラム | |
US10664384B2 (en) | Javascript debugging using just my code | |
US20190324891A1 (en) | Visualizing last/next known data values in time travel traces | |
JP6303749B2 (ja) | ソフトウェアプログラムを解析する方法及びシステム並びに非一時的なコンピュータ可読媒体 | |
CN105701006A (zh) | 用于程序调试中的变量跟踪的方法和系统 | |
US20180173610A1 (en) | Method for performing cared-zone code coverage evaluation with no source code modification | |
Drebes et al. | Aftermath: A graphical tool for performance analysis and debugging of fine-grained task-parallel programs and run-time systems | |
JP5481571B2 (ja) | コードにおける時間計算量およびフローの理解を高める方法 | |
Jiang et al. | Log-it: Supporting Programming with Interactive, Contextual, Structured, and Visual Logs | |
JP4675639B2 (ja) | データ処理システム、アプリケーションプログラムのカスタマイズパラメータを表示する方法およびコンピュータプログラム製品 | |
Aho et al. | Automated extraction of GUI models for testing | |
US10877873B2 (en) | Using historic execution data to visualize tracepoints | |
JP6471615B2 (ja) | 性能情報生成プログラム、性能情報生成方法及び情報処理装置 | |
Schaad et al. | Boosting performance optimization with interactive data movement visualization | |
JP2017072983A (ja) | 実行結果表示プログラム、情報処理装置および情報処理システム | |
Costiou et al. | Object Miners: Acquire, Capture and Replay Objects to Track Elusive Bugs. | |
US8826233B2 (en) | Graphical representation of a JAVA bytecode | |
JP5974444B2 (ja) | 情報処理システム、情報処理方法、情報処理プログラム、記録媒体 | |
Ohmann et al. | CSIclipse: presenting crash analysis data to developers |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20180608 |
|
A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20190304 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20190228 |