ここまで、emacs( gedit?)などのテキストエディタを使ってC言語でプログラム記述→gccでコンパイル→gccでリンク→実行、という作業をしてきました。
(単純なプログラムの場合は「コンパイル→リンク」を1度に済ませてましたね。)
この方式では、コンパイルエラーや実行時エラーがでると、テキストエディタに戻って自分でエラー部分を特定せねばなりません。
プログラムが短いうちはこれでもいいのですが、長くなってくると非効率です。
そこで、本講義では統合開発環境 eclipse (エクリプス)を導入します。
これは、エディタ・コンパイラ・デバッガの機能をすべて一つのアプリケーション上で利用できるソフトウェアです。
(Microsoft Windowsでプログラミングしたことのある人なら、VisualStudioのfreeなLinux版と思っておけばまあOKです)
eclipse はもともと java言語でのプログラミング支援を想定して開発が開始されましたが、その使い勝手のよさとプラグイン形式の拡張性の良さゆえに、次々と他の言語へと拡張されました。
そのうちの一つが C/C++ 言語への対応を謳う C Development Tooling (CDT) です。
つまり、皆さんは eclipse + CDT という形での利用となります。
(この授業ではJavaなど他言語におけるeclipseの説明はしません)
なお、eclipse は open software のご多分に漏れず現在も継続にバージョンアップが重ねられていますが、工学システム学類では少し古い ver.3.2 を使います。
(一旦慣れればどのバージョンでも大して変わらないし‥)
(と言いつつ新しいのには色々良い機能が増えてたりはします)
Eclipseを使っても、プログラム編集→コンパイル→コンパイル時のエラーデバッグ→リンク→実行時デバッグ→完成という工程自体が変化するわけではありません。
統合開発環境での説明にあたって、まずは作業課程を区分けしてそれぞれに名前をつけておきます。
05.1.1. 2種類のパースペクティブと2種類の実行ファイル
Eclipseの作業画面には、たくさんの小ウィンドウが存在します。
この小ウィンドウ群を、ある作業目的をもってレイアウトしたものを、eclipseではパースペクティブといいます。
プログラムの作成は、C/C++ パースペクティブで行います。
C/C++ パースペクティブ中のエディタウィンドウ上で、C言語のソースを記述していきます。
分割ソースファイルの利用も当然可能です。
プログラム編集中、少しでも変更がある度に(ソースファイルの自動保存が行われる度に)コンパイル+リンク(gcc)が自動的に行われ、コンパイルエラーが見つかればその時点でソースファイルの編集画面上にエラーと思われる箇所を表示してくれます。
(この機能は、一旦もう動いていたプログラムを改造しているときに、とりわけ役に立ちます)
プログラム編集でプログラムが一応完成し、かつコンパイルエラーがなくなると、(実行時デバッグ用の実行ファイルを生成するという)C/C++ パースペクティブの役割が一段落します。
ここで得られる実行ファイルをデバッグ用実行ファイルと呼びます。
続いて必要になるのが、プログラムを実際に実行させてその機能を確認する実行時デバックです。
この作業のために、デバッグ パースペクティブを使います。
デバッグ パースペクティブでは、実行ファイルをデバッガ(gdb)の監視のもとで実行させ、ソースファイルと対応させての実行の追跡や停止、変数の監視などが全てGUIで可能です。
実行時デバックも問題ないことが確認できれば、開発の最終段階に入ります。
C/C++ パースペクティブに戻って、今度は性能重視のコンパイルオプションをつけて再コンパイルを実施し、さっきまでとは別の、性能重視の実行ファイルを生成します。
この性能重視の実行ファイルのことを、リリース用実行ファイルと呼びます。
このリリース用実行ファイルを得ることで、全ての開発は終了します。
出来上がったリリース用実行ファイルは、eclipse抜きでも(コマンドラインから普通に)実行可能です。
(デバッグ用実行ファイルでもコマンドラインから普通に実行は可能なので、性能を追求する必要がない場合は、この最終段階は行う必要はありません)
05.1.2. プロジェクト
上記のプログラム作成開始からリリース用実行ファイルの生成までを行うひとまとまりの作業(1つの実行ファイルを得るための作業)を総称して、eclipseではプロジェクトと呼びます。
(本授業ではC言語での開発に特化してeclipseの説明をしていますので、一般的なプロジェクトの定義には言及しません)
違う実行ファイルを作成したい場合は、別のプロジェクトを用意することになります。
本授業では、概ね1つの節で1つの実行ファイルを作るようにしているので、節ごとに新しいプロジェクトを用意することになります。
その意味で、本授業全体では、数十のプロジェクトを扱うことになります。
eclipseは同時に複数のプロジェクトを扱うことができるので心配はありません。
05.1.3. ワークスペース
ワークスペースは、複数のプロジェクトをまとめるための単位です。
(厳密には複数のプロジェクトをまとめておいて置くためのフォルダの名前です)
通常は、お互いに関連するプロジェクト群をまとめて1つのワークスペースで扱います。
本授業では、プロジェクト間でのソースの共有などを行わないので、1プロジェクト毎に別のワークスペースにしても問題ありませんが、「授業でひとまとめ」という意味で、学期を通して1つのワークスペースを使います。
なお、eclipseでは同時には1つのワークスペースしか扱えないので注意が必要です。
(例えば計算機序論2以外でもeclipseでプログラムを書くような授業があれば、そちらには別のワークスペースを用意して、授業時間開始時に切り替えておくべきでしょう)
eclipse上で記述しているプログラムが、他のファイルと連携して動くような場合は、eclipseがソースファイルや実行ファイルをどこに配置しているのかの知識が必要です。
05.2.1. ワークスペース
あるワークスペースで作業をしている間、eclipse上で扱う全てのファイル群は、ワークスペースフォルダの下に配置されます。
(もちろん何にでも例外はあるので、ワークスペースフォルダ以外の場所にあるファイル群でeclipseを動かすこともできます。)
(ただ、本授業ではその例は扱いません。気になる人は2011年度の授業の「外部収容」を参照してみてください)
ワークスペース名(ワークスペースフォルダ)は、デフォルトではホーム直下の workspace という何のひねりもないフォルダです。
本授業では workspace-ic2 というワークスペース名を使うことにしましょう。
ワークスペース名とワークスペースフォルダ名は常に一致します。
05.2.2. プロジェクト
プロジェクトを開始しようと思った時点でまずすべきことは、プロジェクト名の指定です。
プロジェクト名はそのまま「プロジェクトフォルダ名」になり、「実行ファイル名」にもなるので、プロジェクト名は、ファイル名やフォルダ名として使える英数文字だけで指定しておくほうが無難です。
(特に皆さんが使っている Eclipse + CDT は版が古いので。)
(プロジェクト名に日本語とか半角スペースとかを織り交ぜるといろいろ難易度が上がります‥)
プロジェクト名が決まると、eclipseはワークスペースフォルダ直下に、プロジェクト名でフォルダを用意します。以後、このフォルダのことをプロジェクトフォルダと呼びます。
(eclipseでは「ロケーション」と呼ばれています)
なお、ワークスペースフォルダの下にすでに存在しているフォルダ名を新しいプロジェクト名にすることはできないので注意してください。
(違う言い方をすると、ワークスペースフォルダの下にすでに存在しているフォルダを、あとからプロジェクト化することはできません)
05.2.3. ソースファイル
本授業では、ある1つのソースファイルは必ずどれか特定のプロジェクトにのみ帰属するようにしています。
本授業では、プロジェクト内では、ソースファイルはプロジェクトフォルダの直下に置くようにしてください。
(プロジェクトフォルダの下にソースフォルダを用意して、その下にソースファイルを置くスタイルもあるのですが、授業で使っているeclipseではこれをすると挙動がちょっと面倒になります。)
(どうせ分割コンパイルでも、本授業ではファイルの数はせいぜい10程度ですから、プロジェクトフォルダ直下に全部置いても問題ないでしょう)
なお、プロジェクト開始後、外からソースファイルを持ち込むことは可能です。
持ち込みたいソースファイルをプロジェクトフォルダ直下に置いて、「プロジェクト」の上で右クリック→「更新」でプロジェクトツリーに反映されます。
こうして「更新」すると、プロジェクトフォルダ直下に置いたファイルはソースでなくてもすべてプロジェクトに取り込まれるので注意してください。
(プロジェクトツリーに含めたくないようなファイルをプロジェクトフォルダに置くのはeclipseの流儀に反します)
(この「更新」の性質を上手に使うと、本授業のあとのほうで少し楽ができます)
05.2.4. 実行ファイルと実行時カレントディレクトリ
デバッグ用実行ファイルは、"プロジェクトフォルダ/Debug/プロジェクト名"として生成されます。
(今ここでは「プロジェクトフォルダ」を「プロジェクト名」と同じにしていることに注意)
リリース用実行ファイルは、"プロジェクトフォルダ/Release/プロジェクト名"として生成されます。
デバッグ用実行ファイル、リリース用実行ファイルがeclipseから実行されるとき、プロジェクトフォルダをカレントフォルダとして実行されます。
eclipse上でデバッグや実行をするとき、プログラム内部からファイル等を参照する場合はこのことに注意してください。
手動で実行する場合も、はじめのうちはプロジェクトフォルダに移動してから実行するほうが無難でしょう。
05.2.5. その他
ワークスペースフォルダに直接何らかのファイルを置いてもeclipseは検知しません。
プロジェクトフォルダの兄弟に別のフォルダを作ってもeclipseは検知しません。ただし、そのフォルダ名は以後このワークスペース内ではプロジェクト名として利用できなくなります。
(このことを上手に使うと、eclipseに見えない形で「倉庫」ディレクトリを用意しておけたりします)
05.3.1. eclipseの起動とワークスペースの設定
Ubuntu Desktopのメニューから eclipse を探して(アプリケーション→プログラミング)起動しましょう。
もちろんコマンドラインから eclipse とタイプして起動しても構いません。
ワークスペースをどうするか尋ねられるはずなので、workspace-ic2としてください。
(もし尋ねられなかったら、起動後、メニュー:ファイル→ワークスペースの切り替え、で切り替えてください)
通常は「ようこそ」タブが表示されるので、そのタブを消すか、そのウィンドウ中の「ワークベンチ」アイコンをクリックしてください。
すると、eclipseの基本である(私たちには用のない)java パースペクティブになります。
05.3.2. eclipseの初期設定
C/C++パースペクティブは拡張機能なので、最初だけちょっと作業が必要です。
05-3-2-A | C/C++パースペクティブの表示 |
1 | a. メニュー:ウィンドウ→パースペクティブを開く→その他
b. 右上の田んぼみたいなアイコン(パースペクティブ切り替えアイコン)をクリック→その他をクリック (以降も手順で欄内に複数の小文字のアルファベットで始まる説明があったら、そのときはそのどれか1つを実施するだけでよい、という意味です) |
2 | 「パースペクティブを開く」サブウィンドウにて、「C/C++」を選択 |
タイトルバーやパースペクティブアイコンの右側などに、「C/C++」と表示があれば、無事 C/C++パースペクティブ に辿り着けた証です。
なお、パースペクティブは自由にレイアウトを変えられますが、もし元のデフォルト配置に戻したいときは、メニュー:ウィンドウ→パースペクティブのリセット を実行します。
(パースペクティブのリセットは小ウィンドウ群の配置を直すだけなので、内容的には一切変化はおきません。)
ここではついでにもう全体的な設定を2つしておきましょう。
エディタに関して、行番号表示して、関数フォールディング表示(folding)機能を利用可能にします。
関数フォールディング表示についてはあとで説明します。
05-3-2-B | 行番号の表示 |
1 | メニュー:ウィンドウ→設定 |
2 | 設定(左):一般[展開]→エディター[展開]→テキストエディターを選択 |
3 | 設定(右):テキストエディター→行番号の表示→チェック→OK |
05-3-2-C | 関数のフォールディング表示 |
1 | メニュー:ウィンドウ→設定 |
2 | 設定(左):C/C++[展開]→Editorを選択 |
3 | 設定(右):Foldingタブ→Enable Folding when opening a new editorをチェック→OK |
eclipseの終了は特に気を遣う必然性はありませんが、作業内容の記録等に時間がかかることがあるので注意してください。
作法的には「メニュー:ファイル→終了」が一番上品です。
05.4.1. プロジェクト概要の決定
まずは直接プログラムを書いてみる形式でプロジェクトを立ててみましょう。
プロジェクト名をまず考えます。
本授業では、「2桁の章番号-節番号-名称」というルールにしておきます。
(ようやく節見出しが 5.4. ではなく 05.4. になっている理由がここで明らかに‥)
(こういうルールのことを、ネーミングスキーマと言います。)
(ネーミングスキーマは大規模なプログラミングをしていく上で将来『自分が』するであろう間違いやトラブルを回避するための必須の作法です)
プロジェクト名:05-4-HelloEclipse
ソースファイル名:05-4-HelloEclipse-Main.c
05.4.2. 新規プロジェクトの登録
05-4-2-A | 新規プロジェクトの登録 |
1 | a. メニュー:ファイル→新規→Managed Make C Project
b. プロジェクトビューの何もないところで右クリック→新規→Managed Make C Project c. メニュー:ファイル→新規→プロジェクト、新規プロジェクト:Cのツリーを展開してManaged Make C Project d. プロジェクトビューの何もないところで右クリック→新規→プロジェクト、新規プロジェクト:Cのツリーを展開してManaged Make C Project |
2 | New Project/Managed Make C Project:プロジェクト名:05-4-HelloEclipse→次へ
(「デフォルト・ロケーションの使用」にチェックが入っていることも確認してください) (グレイアウトされているロケーションが .../workspace-ic2/05-4-HelloEclipse になっていきます) |
3 | New Project/Select a type of project:→終了
(Project Type: Executable(Gnu), Configurations: Debug と Release の両方になってるはずです) |
作業が済むと、左側のプロジェクトビューに「05-4-HelloEclipse」というプロジェクトが増えてるはずです。
これによって、二つの設定(DebugとRelease)を伴うプロジェクトが用意されました。
先頭の十字アイコンをクリックしてプロジェクトツリーを展開表示しておきましょう。
05.4.3. 新規ソースファイルの作成
05-4-3-A | ソースファイルの登録 |
1 | a. プロジェクトビューで05-4-HelloEclipseを選択後、メニュー:ファイル→新規→Source File
b. プロジェクトビューで05-4-HelloEclipseを右クリック→New→Source File |
2 | New Source File:Source File: 05-4-HelloEclipse.c →終了 |
プロジェクトツリーに05-4-HelloEclipse-Main.cが登録されると共に、中央のエディタで05-4-HelloEclipse-Main.cがオープンします。
また、(このまだ1行も書いてない状態ですら)自動コンパイルがバックグランドで実行され、下の問題ビュー(ウィンドウ)にエラー報告が表示されます。
(おそらく、「main()関数が見当たらないんだけどどうなってるの?」というエラーメッセージでしょう。)
あとは、中央のエディタでC言語プログラムソースを記述していくだけです。
Ctrl-Sでソースを保存すると、同時に自動コンパイルが働き、最新エラー報告をしてくれます。
(この報告は、gccが出力しているメッセージをeclipseが整形して表示してくれているものです。)
(問題ビューの隣のコンソールビューを表示させると、eclipseが裏でどうやってgccを使ってコンパイルしているかがわかります。-Wallオプションをしているのがわかるでしょうか?)
皆さんは常に問題ビュー(「問題」という欄)の「エラー数」と「警告数」が0でありつづけるようにしてください。
では、さっそく下のプログラムを入力してみましょう。
Eclipseではとても大事なキーボードショートカットがあります。
Ctrl+z : 直前の動作を取り消す。(Undo)
Ctrl+y : 直前の動作をもう一度行う。(Redo)
Ctrl+Space : 今の時点で「正しい」入力候補を提示する。(Completion)
Ctrl+s : ファイルの保存(と同時にコンパイルが実行されるはずです)(Save and Compile)
特に3番目は、Eclipse利用の3大メリットの1つです。とりあえず途中でバンバンとCtrl+Spaceしてみてください。
入力中、まめに Ctrl+s で保存しましょう。そうすると、保存に続いて自動的にコンパイルを行って、文法的に間違っているところがあれば指摘してくれます。
(保存を頻繁に行うとトラブル対策になります)
(「メニュー→プロジェクト→自動的にビルド」で保存後にコンパイル実行するかどうかを制御できます)
これがEclipse利用の3大メリットのもう1つ、静的コンパイルエラーの指摘です。
(あと1つは、オンラインデバッグでのトラッカですかねぇ。)
05-4-HelloEclipse.c |
#include <stdio.h> int main(int argc, char **argv){ int i = 2; int j = 4; printf("Hello, Eclipse.\n"); i = i * i; printf("Second variable = %d\n", j); printf("First variable = %d\n", i); return 0; } |
(eclipseのcompletionではmain関数の第2引数は *argv[] ではなく **argv とされます。どちらもC言語の文法としては全く正しいので、どちらで書くかは信仰の問題です。私は *argv[] 派ですが、ここだけは eclipse の completion 機能に敬意を表して **argv にしておきました。)
05.4.4. 編集時の便利な機能
アウトライン
右側のアウトラインビューに並んでいる構成要素をクリックすると、エディタ内で該当部分の先頭に飛びます。
関数フォールディング表示
関数の最初の行に小さく「-」の表示が出ています。
これをクリックすると、関数ボディ部が全部折り畳まれて表示されるようになります。
ソースが長くなってきたときに、この機能は威力を発揮します。
(main関数だけはフォールディングできないようですけどね。長いmain関数を書くな、ということでしょう。)
リファクタリング
単純には、変数名(関数名でも可能)の一括変換です。
例えば、上記のソースで、エディタ内で変数 i を右クリックして Refactor→Rename とし、Rename toで val1 とすると、ソース中の変数 i に該当する部分が全て置換されます。
同じ要領で、変数 j を変数 val2 に変更してください。
適切な変数名、関数名をつけることはプログラミングをしていく上で重要な作法なので、この機能も重宝することでしょう。
05.4.5. 実行時デバッグの設定
実行ファイルが得られるようになったので、今度は実行時デバッグの方法について学習します。
(このような短いプログラムではあまり実行時デバッグの値打ちがないですが‥)
eclipseのあるプロジェクト(より正確にはある実行ファイル)について、新しいデバッグを開始するときは、初回のみデバッグ方法の設定を行う必要があります。これを「構成およびデバッグ」と言います。
eclipseでは、素材ファイル群から一つの目的を実行することを「ビルド」するといいます。ここでは、Cソースファイル群から1つの実行ファイルをコンパイル・リンクで作ることが相当します。
ビルドされた実行ファイルでさらにデバッグを行うので、「(実行ファイルをビルドするための)構成および(そのビルドで作った実行ファイルを使っての)デバッグ」という意味合いです。
(ここは用語としては「デバッグの初回設定」のほうが内容に対して適切だと思うのですがまあeclipseのメニュー名通りで説明していきます)
(同じ設定でまたデバッグを行う2回目以降では、この「構成およびデバッグ」を改めて行う必要はありません)
(厳密には、このプロジェクトを作成したときに、「Executable」プロジェクト型でConfigurationに「Debug」と「Release」が付帯するよ、と宣言してるので、Debug側の設定をするとついでにRelease側の設定も同時に用意されています)
C言語向けのパースペクティブの場合、どのような方針でビルドするかは、実際には全部コンパイラに与えるオプションで決まります。
eclipseでは、デバッグ向け、リリース向け、のコンパイラオプションについてはだいたい用意してくれているので、こちらからは方針変更を伝えるだけです。
ここでは、デバッグ向けのビルドオプションを使わせてもらうことになります。
05-4-5-A | 「構成およびデバッグ」 |
1 | プロジェクトビューで実行時デバッグをしようと思っているプロジェクトが選択されていることを確認
(今はプロジェクトが1つしかないので外しようがないですが、だんだんプロジェクトが増えてくると意外にこれを忘れたりします‥経験談) |
2 | a. メニュー:実行→構成およびデバッグ
b. 上段のアイコンのうち虫の形をしたアイコン(デバッグアイコン)の右横の小さい黒逆三角形をクリック→構成およびデバッグをクリック |
3 | 構成およびデバッグ(左):C/C++ Local Applicationをダブルクリック
(eclipseに、今ここで新しくデバッグが構成可能できそうなプロジェクトを探させます) |
4 | 構成およびデバッグ(左):C/C++ Local Applicationの1階層下に現在のプロジェクト名と同じ名前の構成要素(デバッグ構成)が新しく現れるのでそれをクリック(ここでは05-4-HelloEclipseですね) |
5 | 構成およびデバッグ(右):名前:これはこのデバッグ構成につける名前です。現在はプロジェクト名が暫定的に入っていますが、混乱の元なので別の名前にしておきましょう。ここでは 05-4-HelloEclipse-Debug としておきます。 |
6 | 構成およびデバッグ(右):Mainタブ:C/C++ Application: が空欄になっているので、Search Projectをクリック |
7 | Program Selection:Binaries:の欄内に 05-4-HelloEclipse があるので、それをクリック→OK
(これによって workspace-ic2/05-4-HelloEclipse/Debug/05-4-HelloEclipse というデバッグ用実行ファイルを指定したことになります) (「構成およびデバッグ(右)」のMainタブについていた赤い×印がこれで消えます) |
8 | 構成およびデバッグ(右):全ての設定が終わったら、「適用」をクリックして設定を保存します。 |
9 | 構成およびデバッグ(右):全ての設定が終わったので、右下の「デバッグ」をクリックして実行時デバッグを開始します。
(正確には、「デバッグ」をクリックするまでが設定です。)、クリックしてからeclipseでは複数のデバッグを同時に走らせることができますが、最初のうちは混乱のもとなので、デバッグビューに複数のデバッグが並ばないようにしておきましょう) (「デバッグ」をクリックしてからは1つのデバッグ実行インスタンスの実施になります) |
デバッグパースペクティブに移行する段になると、「パースペクティブ切り替えの確認」ウィンドウが現れるかもしれません。
毎回「はい」を押してもらってもよいですが、面倒ならここで「常にこの設定を使用する」のチェックをオンにしてしまってもよいでしょう。
ビューやエディタなどの小ウィンドウ群のレイアウトが変わって、ウィンドウのタイトルに「デバッグ」が入ったり、右上のパースペクティブアイコンの右の表示が「デバッグ」になっていることで、デバッグパースペクティブに切り替わったことが確認できます。
05.4.6. 実行時デバッグ
実行時デバッグが開始されると、eclipseでは常にmain()関数の1行目で一時停止した状態で始まります。
(エディタの該当行に小さい矢印が表示されてその行に色がついているはず)
また、デバッグビューでは「05-4-HelloEclipse-Debug」(5.4.5節でつけたデバッグ構成の名前)で始まるデバッグツリーが表示されているはずです。
(eclipseでは複数のデバッグを同時に走らせることができますが、最初のうちは混乱のもとなので、デバッグビューに複数のデバッグが並ばないようにしておきましょう)
実行時デバッグは大きく分けて2通りあります。
(1) ステップ実行:ソースプログラムを1行ずつ実行させて行きます。何が起きているのか正確に知ることができますが、プログラムが長くなってくると実行にとても時間がかかります。
(2) 通し実行:コマンドラインでの実行と同じように、プログラム実行をさせます。ただし、ユーザが指定した場所や条件に合致すると、そこで一時停止状態になります。ある程度プログラムの動作が見えているときには便利な機能です。
ステップ実行と通し実行は随時切り替えられます。例えば、ある行にBreak point(一時停止指定)を設定してそこまでは通し実行させ、一時停止した後はステップ実行する、ということも可能です。
05.4.7. ステップ実行(ステップイン、ステップオーバー)
まずはステップ実行をしてみましょう。
ステップ実行は進め方によってさらに2種類に分かれます。
ステップイン : プログラムを1行進めます。その1行がユーザ定義関数呼び出しであれば、その関数の中に移ります。
ステップオーバー : プログラムを1行進めます。その1行がユーザ定義関数呼び出しであれば、その関数関数呼び出しを通し実行して、そのユーザ定義関数呼び出しが終わった状態になります。
要するに、自分が作ったサブルーチンの中身も確認する気があればステップイン、その関数の動作にはもう自信があるので内部動作をいまさら確認する気がないのであればステップオーバー、ということです。
はじめのうちは全てステップインでいいでしょう。
05-4-7-A | ステップインのさせ方 |
1 | a. メニュー:実行→ステップイン
b. F5 c. 上段2段目のアイコン並びのうち、黒い点2つの間に矢印が割って入っている(ステップイン)アイコンをクリック (eclipseではアイコンの上にマウスカーソルをそっと置いておくと、1秒ぐらいのフーバーでそのアイコンの説明を表示してくれます) |
05-4-7-B | ステップオーバーのさせ方 |
1 | a. メニュー:実行→ステップオーバー
b. F6 c. 上段2段目のアイコン並びのうち、黒い点1つの右に矢印が降りてきている(ステップオーバー)アイコンをクリック |
ステップインであれステップオーバーであれ、進めていくと、エディタウィンドウの矢印が進んでいき、変数に変更があったときには変数ビューの該当変数がハイライトされてそのことを知らせてくれます。
05.4.8. デバッグの再実行
ステップインやステップオーバーで最後まで進むと、デバッグビューのデバッグツリーの最上位階層に「<終了しました>」と表示されます。
そうなったら、今回のデバッグは終了です。
直前に行っていたデバッグをもう一度実行するのは簡単です。
以下のいずれかで、前回と同じ構成のデバッグを開始することができます。
Eclipseに本当に慣れるまでは再実行前に先ほど終了したデバッグ実行を削除しておきましょう。
05-4-8-A | デバッグの再実行(前回のデバッグ構成と同じデバッグの実行)とその前に削除 |
1 | 前回の「デバッグ実行」の削除
(デバッグビューの中が空になるように掃除します) a. (メニュー:実行→停止を念のため確認→)メニュー:実行→削除 b. (左上の当たりの停止アイコンをクリック→)左上の二重×アイコンをクリック (停止状態にしないと削除はできません) |
2 | デバッグ再実行
a. メニュー:実行→前回の起動をデバッグ b. F11 c. 虫の形をしたデバッグアイコンをクリック d. 虫の形をしたデバッグアイコンの右横の黒逆三角形をクリック→05-4-HelloEclipse-Debugをクリック |
これによってまた5.4.6節の状態になります。
【注意】デバッグが終了してない状態で下記の操作を行うと、現在のデバッグを一時停止した状態にして、別の(2つめの)デバッグを開始することになってしまいますので、注意してください。
(デバッグビューでデバッグ構成が2つになるので気がつくと思います。)
(慣れてくるとこれはこれで使い途があるのですが、今はややこしいので、5.4.10節を参照して望まないほうのデバッグは終了して閉じておきましょう)
05.4.9. 通し実行(Run, Break point)
今度は通し実行をやってみましょう。
まずは、何も考えないで通し実行を行います。
通し実行(eclipseでは「再開」)(下記のどれでも同じことです)
a. メニュー:実行→再開
b. F8
c. 虫の形をしたデバッグアイコンの隣にある再生ボタンをクリック
目にも止まらない速さで実行され、コンソールビューに標準出力なども表示された後、5.3.7節の最後と同じ状態になります。
(何度もやってみたければ、F11→F8→F11→F8→F11→F8→F11→F8‥)
次はBreak pointを設置してみましょう。
1つ目のprintf()の実行直前で止まってもらうことを考えます。
Break pointの設置(下記のどれでも同じことです)
a. 該当行にカーソルを置いた状態で、メニュー:実行→行ブレークポイントの切り替え
b. エディタの該当行の左端のグレイエリアをダブルクリック
成功すればエディタの行の左に緑色の丸が表示されます。
また、ブレークポイントビューにも表示されます。
デバッグ開始状態(main()関数先頭行での一時停止状態)で、通し実行(F8)を始めてみましょう。
すると、今度はその行で一時停止します。
ここでさらに再開(F8)すると、今度は最後まで実行が進んで終了します。
(何度もやってみたければ、F11→F8→F8→F11→F8→F8→‥)
一時停止した状態で、ステップインやステップオーバーしても構いませんし、ステップ実行したあと再開しても構いません。
なお、ブレークポイントの外し方には2通りあります。
ブレークポイントの恒久解除:ブレークポイントの設置と同じことをすればOKです。
ブレークポイントの一時解除:ブレークポイントビューで、該当するブレークポイントのチェックボックスのチェックを外します。
05.4.10. C/C++パースペクティブに戻る前に - デバッグの終了 -
全ての実行時デバッグ作業が終了したら、今作業しているデバッグ構成を閉じておきましょう。
(立つ鳥後を濁さず。整理整頓。いずれも将来の自分を苦しめないためです)
5-4-10-A | デバッグの(全)終了 |
1 | デバッグビューでまだ「<終了しました>」が表示されてないデバッグ構成を選択(クリック) |
2 | a. メニュー:実行→終了
b. 上段2段目の赤い四角ボタン(終了アイコン)をクリック |
3 | 全てのデバッグ構成が「<終了しました>」になっているのを確認 |
4 | 上段2段目左端の×が二重のアイコン(「終了したすべての起動を除去」アイコン)をクリック |
5 | デバッグビューが空になったことを確認 |
eclipseでは、デバッグを終わらせないままでデバッグパースペクティブからC/C++パースペクティブに切り替えたりそこから戻ってきたりできますが、この授業では、「デバッグパースペクティブからC/C++パースペクティブに戻るときは必ず全部のデバッグ起動を終了させてから」を習慣付けておいてください。
(そうしないと、次にC/C++パースペクティブからデバッグパースペクティブに戻ってきたときに、前回立ち去った時の状況をあなた自身の頭の中でも再構成する必要が出てきます。Eclipse+CDT側にとっては簡単なことでも、慣れてない皆さんの頭のほうがついていかないでしょう‥)
05.4.11. デバッグ用実行ファイルの動作確認
実行時デバッグも済んだ今の時点で、(デバッグ用)実行ファイルを普通に使うことが出来ます。
作成したデバッグ用実行ファイルを普通に実行させるには大きく2通りの方法があります。
1つめは eclipse上での実行です。
5-4-11-A | 実行ファイルの実行 |
1 | C/C++パースペクティブにいることを確認 |
2 | a. アイコンのうち再生ボタンみたいなのの右隣の黒逆三角形をクリック→05-4-HelloEclipse-Debugをクリック
b. 実行→実行→Run Local C/C++ Applications→C Local Application: Binaries: 05-4-HelloEclipse (虫アイコンのもの) → OK c. アイコンのうち再生ボタンみたいなのをクリック(虫アイコンの右のアイコン) d. メニュー→実行→前回の起動を実行 |
この場合、パースペクティブの切り替えは起こらず、中央下のコンソールビューにプログラムからの標準出力結果が表示されるだけです。
すぐに再度実行したい場合は、5-4-11-AのStep2でcないしdを実行してください。
(再生ボタンアイコンは、直近に行った「実行(デバッグではない)」を再度行うアイコンです。)
2つめはコマンドラインでの実行です。
以下はeclipseから離れて、ターミナルでの作業となります。
$ cd (引数無しのcdはホームディレクトリへの移動を意味します) $ cd workspace-ic2/05-4-HelloEclipse $ ls $ ./Debug/05-4-HelloEclipse
05.4.12. パースペクティブの切り替え
ここからは、リリース用実行ファイルの生成を目指します。
(デバッグ用実行ファイルにはいろいろな仕掛けがしてあるので、最大速度がとても出しにくい構造になっています。)
(陸上競技で例えて言うなら、デバッグは競技者に心拍計測装置とか発汗計測装置をつけながら走ってもらっているようなものです。もちろん走れますが、全力で走ってもらうためにはすべての装置を外してあげるべきでしょう。)
(ちなみにgccのデバッグモードのパフォーマンス低下は実は大したことありませんが、VisualStudioのデバッグモードはひどい状態です。gccの計測装置が腕時計型ぐらいだとしたら、Visual Studioの計測装置は鉛バッテリ入りの計測装置をてんこ盛りしてリュックで背負わしているような状態?まあその分、解析は微に入り細に渡ってできるわけですが‥)
そのために、まずはデバッグパースペクティブからC/C++パースペクティブに戻りましょう。
05.3.1節 (05-3-1-A)で初期設定をしてあるので、今度は簡単です。
5-4-12-A | パースペクティブの切り替え |
1 | a. メニュー:ウィンドウ→パースペクティブを開く→C/C++
b. 右上の田んぼみたいなアイコン(パースペクティブ切り替えアイコン)をクリック→C/C++をクリック |
05.4.13. リリース用実行ファイルの生成
リリース用実行ファイルを作るためには、実行ファイル作成の方針を、従来のデバッグ向けからパフォーマンス重視に切り替えなくてはいけません。
違う種類の実行ファイルを目標に掲げるので、これまでとは異なる「ビルド」をすることになります。
05.4.5節でデバッグ用ビルド設定をしていたのですが、そのときにセットでリリース用ビルド設定も行われています。
今度は、そのリリース用ビルド設定を使うことになります。
05-4-13-A | 「アクティブビルドの変更」 |
1 | a. プロジェクトビューで該当するプロジェクトツリーの最上位ノード(ここでは05-4-HelloEclipse)を選択→メニュー→Active Build Configuration→Release
b. プロジェクトビューで該当するプロジェクトツリーの最上位ノード(ここでは05-4-HelloEclipse)を右クリック→Active Build Configuration→Release |
切り替えが済んだ瞬間に、eclipseが自動的にビルドし直して(=コンパイル実行をして)くれます。
同時に、プロジェクトビューの2階層目に、Debugと並んでReleaseというノードが増えているはずです。
リリース用実行ファイルは、実行時デバッグができないこと、実行ファイルが格納されているディレクトリがデバッグ用とは異なることを除けば、使い方は同じです。
デバッグ用実行ファイル同様、リリース用実行ファイルもeclipse上、コマンドラインから実行、のどちらでも実行可能です。
コマンドライン実行の場合、05.4.12節に示したシェルコマンド中の「Debug」を「Release」に読み替えてください。
$ cd $ cd workspace-ic2/05-4-HelloEclipse $ ls $ ./Release/05-4-HelloEclipse
残念ながらこのような短いプログラムでは速度差を体感することはできませんが、身軽になっていることはファイルサイズから想像できそうです。
$ ./Debug/05-4-HelloEclipse $ ./Release/05-4-HelloEclipse $ ls -l ./Debug/05-4-HelloEclipse ./Release/05-4-HelloEclipse
05.5.1. プロジェクトの概要
1.2節のプログラムを、eclipseの新しいプロジェクトとして取り込む方法についてここで説明します。
プロジェクト名:01-2-HelloESYS-Better
ソースファイル:01-2-HelloESYS-Better.c
05.5.2. 新規プロジェクトの登録
このワークスペース(workspace-ic2)では2つめののプロジェクトになります。
05-5-2-A | 新規プロジェクトの登録 |
1 | a. メニュー:ファイル→新規→Managed Make C Project
(参考:05-4-2-A) (以降、類似例の場合は選択肢を全ては示しません) |
2 | New Project/Managed Make C Project:プロジェクト名:01-2-HelloESYS→次へ |
3 | New Project/Select a type of project:→終了 |
作業が済むと、プロジェクトビューに「01-2-HelloESYS」「05-4-HelloEclipse」と2つプロジェクトが並ぶはずです。
01-2-HelloESYSを選択し、先頭の十字アイコンをクリックしてプロジェクトツリーを展開表示しておきましょう。
05.5.3. 外からのソースファイルの取り込みとデバッグ・実行
プロジェクトフォルダ(~/workspace-ic2/01-2-HelloESYS)に、取り込みたいソースファイルをコピーします。
ここでは、01-2-HelloESYS-Better.cをこのファイル名のまま保存してください。
用意できましたか?では、eclipseの「更新」を使ってソースファイルをプロジェクトに登録します。
05-5-3-A | プロジェクトフォルダ内に新しく用意したファイルの登録 |
1 | a. メニュー:ファイル→更新
b. F5 c. プロジェクトビューの01-2-HelloESYSを右クリック→更新 |
成功すると、01-2-HelloESYSのプロジェクトツリーに01-2-HelloESYS-Better.cが追加され、自動コンパイルが開始され、デバッグ用実行ファイルが生成されます。
実行時デバッグをする場合は05.4.5節の要領で実行時デバッグを構成し、デバッグパースペクティブに移って実行時デバッグを開始します。
リリース用実行ファイルを作成する場合は05.4.12節の要領でビルド方法を変更してビルドしてください。
05.6.1. プロジェクトの概要
4.2節の分割ソースファイル(複数)によって記述したプログラムを、eclipseの新しいプロジェクトとして取り込む方法についてここで説明します。
プロジェクト名:04-2-SC
ソースファイル:
04-2-SC.h,
04-2-SC-BasicFunctions.c,
04-2-SC-ExtraFunctions.c,
04-2-SC-Main.c
05.6.2. 新規プロジェクトの登録
このワークスペース(workspace-ic2)では3つめののプロジェクトになります。
要領は5.6.2節の05-6-2-Aと同じです。
05-6-2-A | 新規プロジェクトの登録 |
1 | a. メニュー:ファイル→新規→Managed Make C Project |
2 | New Project/Managed Make C Project:プロジェクト名:04-2-SC→次へ |
3 | New Project/Select a type of project:→終了 |
作業が済むと、プロジェクトビューに「01-2-HelloESYS」「04-2-SC」「05-4-HelloEclipse」と3つプロジェクトが並ぶはずです。
04-2-SCを選択し、先頭の十字アイコンをクリックしてプロジェクトツリーを展開表示しておきましょう。
05.6.3. 外からの分割ソースファイル群の取り込みとデバッグ・実行
プロジェクトフォルダ(~/workspace-ic2/04-2-SC)に、取り込みたいソースファイル群をコピーします。
ここでは、
04-2-SC.h,
04-2-SC-BasicFunctions.c,
04-2-SC-ExtraFunctions.c,
04-2-SC-Main.c
を用意します。
(参考:05-5-3-A)
05-6-3-A | プロジェクトフォルダ内に新しく用意したファイル群の一括登録 |
1 | a. メニュー:ファイル→更新 |
成功すると、04-2-SCのプロジェクトツリーに上記4ファイルが追加され、自動コンパイルが開始され、デバッグ用実行ファイルが生成されます。
(eclipseは分割ソースファイルの中を調べて、どこにmain()関数があるかを把握してコンパイル・リンクまで自動で行ってくれます)
実行時デバッグをする場合は5.4.5節の要領で実行時デバッグを構成し、デバッグパースペクティブに移って実行時デバッグを開始します。
実行時デバッグの間、複数のソースファイルに跨って実行が続きますが、表示するソースファイルの切り替えは全てeclipseが自動でしてくれるのでユーザが気にする必要はありません。
ユーザ定義ライブラリ関数の呼び出しがこのプログラムの中にはあるので、ステップインとステップオーバーの違いを確認してください。
なお、実行時デバッグ中、fgets()関数のところでプログラムは(当然ですが)一時停止になって、標準入力からのデータを待ちます。
コンソールビューで1行分の式を入力してください。(そのあとまた指定した形でデバッグ実行が続行されます。)
リリース用実行ファイルを作成する場合は5.4.12節の要領でビルド方法を変更してビルドしてください。
05.7.1. プロジェクトの概要
2.2節の「ファイルを開くプログラム」を、eclipseの新しいプロジェクトとして取り込んで実行する方法についてここで説明します。
プロジェクト名:02-2-OpenFile-Full
ソースファイル:02-2-OpenFile-Full.c
05.7.2. 新規プロジェクトの登録
要領は5.5.2節の05-5-2-Aとほぼ同じです。
プロジェクト名だけはこちらでは 02-2-OpenFile-Full としてください。
05.7.3. 外からのソースファイルの取り込み
要領は5.5.3節の05-5-3-Aとほぼ同じです。
(プロジェクトフォルダ名やファイル名は本節の内容に合わせて読み替えること!)
05.7.4. 起動時引数(オプション)を伴う実行時デバッグの構成
実行時デバッグをする場合は5.4.5節の要領で実行時デバッグを構成し、デバッグパースペクティブに移って実行時デバッグを開始します。
デバッグ構成の名前は02-2-OpenFile-Full-Debugとしておきます。
実際にこれをやってみると、(これまた当然ですが)ファイル指定が起動時に引数(オプション)として渡されてないので、実行はユーザプログラム中で用意していたトラップに引っかかって終了してしまいます。
そこで、起動時引数がついた別のデバッグ構成を作ってみましょう。
05-7-4-A | Argumentsを伴う「構成およびデバッグ」 |
1 | プロジェクトビューで実行時デバッグをしようと思っているプロジェクト(02-2-OpenFile-Full)が選択されていることを確認 |
2 | a. メニュー:実行→構成およびデバッグ
b. 上段のアイコンのうち虫の形をしたアイコン(デバッグアイコン)の右横の小さい黒逆三角形をクリック→構成およびデバッグをクリック |
3 | 構成およびデバッグ(左):C/C++ Local Applicationをダブルクリック
(eclipseに、今ここで新しくデバッグが構成可能できそうなプロジェクトを探させます) (5.7.4節の1〜2行目の作業によってすでに02-2-OpenFile-Full-Debugが存在しているはずですが、それと別のものを今回は作成します) |
4 | 構成およびデバッグ(左):C/C++ Local Applicationの1階層下に現在のプロジェクト名と同じ名前の構成要素(デバッグ構成)が「新しく」現れるのでそれをクリック(ここでは02-2-OpenFile-Fullですね) |
5 | 構成およびデバッグ(右):名前:これはこのデバッグ構成につける名前です。現在はプロジェクト名が暫定的に入っていますが、混乱の元なので別の名前にしておきましょう。ここでは 02-2-OpenFile-Full-Debug-Arguments としておきます。 |
6 | 構成およびデバッグ(右):Mainタブ:C/C++ Application: が空欄になっているので、Search Projectをクリック |
7 | Program Selection:Binaries:の欄内に 02-2-OpenFile-Full があるので、それをクリック→OK |
8 | 構成およびデバッグ(右):(x)=Arguments:Program Argumentsの欄に、コマンドライン引数を与えます。
ここでは hello.txt としておきましょう。 (ちなみにその下に working directory の表示があって、eclipseがどのフォルダで実行を行うかが示されています) |
9 | 構成およびデバッグ(右):全ての設定が終わったら、「適用」をクリックして設定を保存します。 |
10 | 構成およびデバッグ(右):全ての設定が終わったので、右下の「デバッグ」をクリックして実行時デバッグを開始します。 |
これでデバッグパースペクティブで実行すれば大丈夫‥
ということはなく、やはり自分の書いたトラップに引っかかってしまいます。
これは、当然ですが、hello.txtというファイルが存在してないからです。
一旦C/C++パースペクティブに戻って、hello.txtを作成しましょう。
hello.txtは単なるテキストファイルという想定ですが、せっかくなので、これもプロジェクトに登録してeclipse上のエディタで編集できるようにします。
05-7-4-B | テキストファイルのプロジェクトへの追加 |
1 | プロジェクトビューで実行時デバッグをしようと思っているプロジェクト(02-2-OpenFile-Full)の最上位ノードが選択されていることを確認 |
2 | a. メニュー:ファイル→新規→File
b. プロジェクトビューの02-2-OpenFile-Fullを→クリック→New→File |
3 | 新規ファイル:ファイル名に hello.txt と入力→終了
(親フォルダーが02-2-OpenFile-Fullになっていることを確認しておいてください) |
これによって、~/workspace-ic2/02-2-OpenFile-Full/hello.txt というファイルが生成され、eclipseで編集できるようになりました。
(02-2-OpenFile-Full.cでは実際にはファイルの中身を参照しないので、ファイルの中身は空でも何か書いてあっても関係ありません)
再度デバッグパースペクティブに移動して、実行時デバッグしてみましょう。
02-2-OpenFile-Fullプロジェクトには今や2種類の実行時デバッグ環境があります(02-2-OpenFile-Full-Debug と 02-2-OpenFile-Full-Debug-Arguments)。
今は、後者の 02-2-OpenFile-Full-Debug-Arguments を以下の作業で選択することにします。
デバッグアイコン右の黒逆三角形をクリック→02-2-OpenFile-Full-Debug-Argumentsを選択することで、デバッグパースペクティブでの実行時デバッグが開始します。
今度は正常にプログラムが進行します。
コンソールの最後に "All set. Bye!"まで表示されれば、想定通りに動いたという証ですね。
05.7.5. eclipse:デバッグパースペクティブでの配列変数の読み方と、文字列の配列というargvの構造
02-2-OpenFile-Full-Debug-Argumentsのデバッグ構成で実行時デバッグを開始したとき、変数ビューには、argc, argv, filetoopenの3変数が並んでいることでしょう。
argcの値が2になっていることはいいですね。
(実行時引数に hello.txt を与えたので)
わかりにくいのはargvで、これはまずはポインタの配列で、要素数は2(要素数はargcの値で知ります)です。
(ポインタではあるので、値としてはアドレスが入っています。0xで始まっているので、16進数表記ですね)
ところが、argvだけみても配列が何個分くるのかはわかりません。
しょうがないので、ポインタ配列が来ても、eclipseは最初、ポインタ配列の先頭のアドレスだけ値に表示して終わってます。
このように、配列のつもりでポインタ変数を使っているとき、eclipseでは配列の形で表示してくれません。
(C言語の使用上、要素数が1以上いくつあるかわからない状態でむやみに参照すると、即バッファオーバーランが待ってます‥)
(と言いつつ、ここに関して言えば実はeclipseは要素数を割り出しています。argvを選択したところで変数ビューを左右に広げると、最後の行の表示で、「argvは文字列2つ抱えてることを知っているよ」という表示が‥)
ところで、実行時のこの瞬間、我々はargvが要素数2のポインタ配列であることを知っています。
そこで、eclipseにその情報を与えて、表示方法を変更してもらいます。
05-7-5-A | 配列に対応しているポインタ変数の配列表示 |
1 | 変数ビューでargvを右クリック→Display as Array |
2 | Display As Array:Start indexに0を、Lengthに2を指定→OK |
これによって、argvツリーは、第2階層に2ノード表示されます。
argv[0], argv[1]をクリックすると、変数ビューの最下行にそれぞれの先頭アドレスと、そこから始まる文字列が表示されます。
暇な人は、argv[0]に入っている文字列の文字数を数えてみましょう。
argv[0]のアドレス+argv[0]の文字数+1('\0'ですね)が、argv[1]のアドレスになっていることがわかると思います。
(原稿を書いている私の環境での例は、0xbffff999 + 68 + 1 = 0xbffff9de でした)
(16進数だけどがんばって!)
(この辺のメモリ空間のレイアウトはコンパイラが違うと若干違うので、この通りにみなさんのところでなってなくてもまあ気にする必要はありません)
(でも大抵は文字列配列は詰めて並べてることが多いのでたぶんこの計算は成立することでしょう‥)
(ちなみにカーソルキーを当てると、eclipseの一番下のステータスバーに行・列値が表示されていたりします)
なお、filetoopen構造体変数については触れません。
filetoopenツリーを展開してみれば分かりますが、皆さんには隠しているもののファイルとのデータのやりとりは実はすごく面倒くさい問題を含んでいるというのが想像がつくことでしょう‥
その面倒くささを、FILE構造体というのを使って上手に隠しているのですね。
演習
05-07-ex1: 05.7.4節のプログラムをベースに、2つのファイルを(読出用に)開くプログラムを作成しなさい。
・指定されたファイルが2つとも開けなかったり正しいファイル名でなかった場合は、どのファイルが開けなかったか理由と共に表示すること。
・プログラム終了時には2つのファイルとも閉じること。
・ (2012年度までの)工学システム棟5階計算機室のLinux環境では、eclipse利用時に、たまに所定の動作を行わないときがあります。
コンパイル時や、デバッグ実行のうちの通し実行でたまに見られるようです。
その場合は、その作業を再度最初から実行してください。
(おそらく皆さんのホームがnfsマウントされていることに伴う症状だと踏んでますが確認は取れていません)
・ eclipse (original) : 開発本家サイト。
・ wikipedia での eclipse の説明 : 技術的な内容は載っていません。
・ 生産性向上への道 Eclipseで行うC/C++開発(2)「CDT」で効率的なC/C++開発を実現する : CDTのいろいろな機能が説明されてます。参考にしてください。
(ここに限らず、WWWでの資料では微妙にメニューの位置や挙動が違ったりしますが、その辺は適宜各自修正して読みましょう)
・ 生産性向上への道 Eclipseで行うC/C++開発(1)組み込み開発におけるEclipseの有効性 : 関係ない話も混じってますが、出だしのeclipseの概念説明はわかりやすいでしょう。
(今回、講義資料を用意していて思ったけど、google先生に尋ねても、大学などでeclipse教えてそうな例にほとんど出くわさないのはどうして?)
(eclipseがまともに動くようになってから、5年ぐらいは経ってると思うんですけど‥)
(大学では受けが悪い? 今後もemacs/e-lisp + gcc でガンバローってこと?理由がわかりません。)
(統合開発環境は全部Visual Studioに流れていくとか。ええー。)