27 Oct 2013, 02:40

自由自在にコード内を飛び回る!Eclipseのコードリーディング機能が便利

Eclipseには、コードを読みやすくするための様々な機能が備わっています。

GUIだからマウスをたくさんつかうんだろうという迷信がありますが、実際はキーポードから手を離さなぽことがおおいです。

キーバインドを巧みに利用して、コード内を自由自在に飛び回るためのテクニックを紹介します。

[toc]

[//www.youtube.com/embed/db4vCH7oqG8?rel=0]

宣言を開く(F2,F3)

関数や宣言の場所へジャンプすることができます。いわゆる、タグジャンプ、EmacsのGNU Grobalのようなもの。もっともよく利用する機能です。

F3で飛んで、Alt + 左で元に戻る。これでソースコード内をマウスを利用せずにピョンピョンと移動することができます。

F2を押すと、飛ばずにポップアップで宣言の場所を表示することができます。

呼び出し階層を開く(Ctrl+Alt+h)

関数がメソッドがどこの関数から呼ばれているかを順々に表示してくれる機能。

リファクタリングの時の修正による影響範囲を調査する時、重宝する機能。

型階層を開く(F4)

クラスの型を階層的に表示てくれる機能。継承関係が分かる。

C++だと機能するけれども、Cだとよくわからない機能。あまり利用しない。

エディタバッファを開く(Ctrl + x + b)

ファイル間の移動は、ショートカットで新規にファイルを開くこともあるけれども、もともと開いているファイルに飛ぶこともデキる。

このキーバインドは、Emacsキーバインドを設定しているので、Emacsに慣れている人はそのキーバインドをそのままEclipseでも利用できる。すなわち、Ctrl + x + b。

Alt + 左で前へ戻り、Alt + 右で次へ進むことができる。もはやブラウザでWebページを見るような感じ。

検索で飛ぶ

デフォルトのEclipse CDT検索機能は利用しません。代わりに、プラグインを利用します。

検索結果をクリックするだけで検索箇所へジャンプできるので、コンソールからgrepして検索するよりも効率がよいです。

25 Aug 2013, 02:06

gccよりも高速な次世代コンパイラClangをCygwinでつかってみた

最近流行のコンパイラ、Clangを試してみました。

Clangとは

Clangとは、gcc,iccのような、コンパイラの一種です。プログラミング言語C、C++、Objective-C、Objective-C++用。

Clangの最終目標は、GNU gccの置き換えらしい。

静的解析能力やリファクタリング機能などももつため、IDEとの結合も目標らしい。

以下は、setreduceという、Googleのエンジニアが開発しているリファクタリングツールのデモ動画。

[//www.youtube.com/embed/mVbDzTM21BQ?rel=0]

Clangを利用すると、コンパイラ時間がgccに比べて短くなるらしい。今回の目的は、それを確かめるためです。Clangのパフォーマンスがgccよりも良かったら乗り換えてみる。

Cygwinへのインストール

setup.exeに用意されているようです。自分はapt-cygで取得。

$ apt-cyg install clang
$ apt-get install llvm
$ clang -v
clang version 3.1 (branches/release_31)
Target: i386-pc-cygwin
Thread model: posix

取得できたものは、3.1。現在の最新は、3.3なので、少し古い。

ベンチマーク

C言語でかかれたプロジェクトをベンチマークとしてコンパイルしてみます。Clangのコンパイラオプションはgccと互換性があるので、makefileのCCオプションを変えるだけで行ける。

tree project

curl -LO http://mama.indstate.edu/users/ice/tree/src/tree-1.6.0.tgz
  • gcc 7.8s
  • clang 9.5s

なんと、gccの勝利。あれ(・・?

screen project

git clone git://git.sv.gnu.org/screen.git
  • gcc 1:34
  • clang 1:02

おお、30秒も速かった!Clangの圧倒的勝利。

Warningメッセージもカラー付きでわかりやすく表示してくれる。

process.c:6272:35: warning: operator '?:' has lower precedence than '+'; '+' will be evaluated first [-Wparentheses]
strncpy(p, buf, 1 + (l < len) ? l : len);
                ~~~~~~~~~~~~~ ^

eclipseからClangでコンパイルする(4.3ではバグってた)

LLVM Tool Chain for Eclipse CDTプラグインをインストールする。

プロジェクトを右クリックして C/C++ビルド > ツールチェーン・エディタ を選択。

互換ツールチェーンのみ表示のチェックを外すと、ツールチェーンにLLVM Clang(cygwin)が選択できるので、選択。

ただし、Eclipse最新版4.3で試したところ、2度めに設定画面を開くとNullPointerExceptionが発生する。つまり、まだバグっているから使わないほうがいいということ。

最後に、ウィンドウ -> 設定 -> LLVM を選択。Library path libstdc++ がある場所のパスを通す。自分の環境では、C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3

これで、EclipseからClangでコンパイルできた。

02 Mar 2013, 07:25

CppcheckをEclipse CDTに組み込んで静的解析!C/C++ユーザに嬉しい『cppcheclipse』

Eclipse CDT からCppcheckの結果が見れたら便利だなーなんて思って、Eclipseのプラグインを探してみたら、こんなのを見つけた。

cppcheclipse – Integration for cppcheck with Eclipse (CDT) – Google Project Hosting

なんと語呂がいい名前。座布団一枚だ。 というわけで、試してみる。

環境

  • Eclipse 4.2 Juno
  • Windows 7
  • Cppcheck 1.58(注:1.58でないと、Eclipse 4.2 Junoで動かなかった」

cppcheclipseのダウンロードとインストール

Eclipse CDTとCppcheckはインストールされていることが前提で。
Cppcheckがインストール方法は過去記事を参照ください。

CppCheckでC言語/C++のメモリリーク(解放漏れ)を静的解析で検出する。 | Futurismo

注:cygwinからのcppcheckでは動かないので注意すること。

cppcheclipseのインストールは、ツールバーから[ヘルプ] > [Eclipse マーケットプレイス]を選択して、cppcheckで検索すると見つかるので、インストールを選択。

image

Eclipseでの設定

インストールして再起動したら、ツールバーの[ウィンドウ] > [設定] > [C/C++]を選択する。選択項目にcppcheclipseが現れる。

まず、Cppcheckの実行バイナリを選択する。

image

次に、[設定]を選択して、cppcheck実行時のオプションを選択する。
とりあえずは、”–enable=all”だけでよい。

130302_1.png

 

cppcheckを実行する

プロジェクト・エクスプローラからcppcheckを実行したいファイルやフォルダを選択して、右クリック。[cppcheck] > [run cppcheck]を選択して、実行。

実行の結果、エラーがあった場合は[問題ビュー]から確認できる。
そのまま、該当箇所にもジャンブで移動可能なのが嬉しい。

エディタにも、エラー箇所は赤く表示される。

130302_2.png

 

[Ctrl + Alt + C]がCppcheckの実行に割り当てられている。
これで、アクティブなファイルに対して即座に静的解析が実行できる。とても便利だ。

cygwinにインストールしたcppcheckは使えない

cygwinにインストールしたcppcheckだと、cppcheckの結果を正しくEclipseがパースしてくれない。templateの指定方法が間違ってるようで、”問題”ビューにあらわれてくれない。
下のような感じで、表示されてしまう。

‘{file}:{line},{severity},{id},{message}’

WindowsにインストールしたCppcheckを使うこと。

28 Feb 2013, 23:32

汚いコードをハイライト表示するEclipseプラグイン[Bracketeer for C/C++]

複雑な条件分岐に死にたくなったことがよくあると思います。たとえば、

if(1) {
  if(2) {
    if(3) {
      if(4) {
          printf("4重カッコだお(´・ω・`)");
      }
    }
  }
} 

とか、

  if (((i_am_sleepy == true) || (i_am_happy == false))&&
      ( (i_am_angry == true)|| (i_am_sad == true))) {
     printf("わけがわからないお(´・ω・`)");
  }

Bracketeer for C/C++でできること

こんなときには、コードをハイライト表示してわかりやすくしてくれるEclipseプラグイン[Bracketeer for C/C++]がかなり便利です。

C言語/C++用のEclipseプラグイン、Bracketeer for C/C++をつかうと、カッコの対応関係がハイライトされて見やすくなる。

C/C++用のCDTの他に、Java用のJDT版もあるようだ。

Bracketeer for C/C++のインストールは、[ヘルプ] > [Eclipse マーケットプレイス]から[Bracketeer for C/C++]で検索する。

カッコの対応関係が分かる

{} だったり、 ()の対応関係が色付きのハイライト表示されるので、どこがどのカッコに対応するかがわかりやすくなります。

20130301_breaketeer_0.png

画面からはみ出る条件の表示とジャンプ

一画面に収まらない{}や()、#if/#endifの対応関係の場合、条件の終わりから先頭へジャンプするためのリンクが挿入される。ジャンプは[Ctrl]を押しながらクリック。

色で確認することもできるが、ジャンプして直接確認もできる、ということ。便利!

20130301_breaketeer_1.png

26 Feb 2013, 14:12

C言語のデバッグ加速!Eclipse CDTでのgdb機能がメチャクチャ便利だ。

Eclipse CDTには、グラフィッカルなgdbインタフェースがついてきます。

これが最近便利すぎるので、オススメ機能をここらでまとめときます。

基本的な設定方法

コンパイルオプション

まずは実行ファイルを作るときにコンパイルオプションで以下を追加。

CPPFLAGS += -g -O0

-g : GDB用のデバッグ情報を実行ファイルに含める。

-Oo : コンパイラに最適化をさせない。

ルックアップパスの設定

デバッグ・パースペクティブにソースが現れないときは、ソースのパスが設定されていない。

Can’t find a source file at : hogehoge…

[ウィンドウ] > [設定] > [C/C++] > [デバッグ] > [ソース・ルックアップ・パス] から追加したいソースがあるフォルダを追加する。

GDBを実行してみる

デバッグ・パースペクティブからF11を実行できればOK。

ソースを見ながらブレークポイントをはって、ステップ実行

ソースを見ながらブレイクポイントをはれるのが嬉しい。

貼る方法も、解除する方法も、クリックひとつだ。

はった場所は、別のビューから確認できる。

2013_0226_gdb_0.png

構造体や変数のなかもスケスケ丸見え

gdbの恩恵は、変数や構造体の中身を見て、さらに値を書き換えて実行できるところだ。

構造体のネスト構造を中の中まで確認できるのがとても嬉しい。

また、xUnitではテストしづらい部分もブレークを貼って手動で値を書き換えてテストスルことができる。痒いところに手が届くとは、ここから始まった。

変数や構造体の参照は、[変数ビュー]で確認できる。

図は複雑怪奇なaddrinfo構造体とsockaddr構造体。

中身の値まで丸見えだ。なんなら、書き換えも同じビューで可能。

2013_0226_gdb_01.png

また、ソース上で変数の上にカーソルを移動するだけでも確認できる。

ステップ実行で、セグメンテーション違反した箇所まで移動できる

これについては、以前記事にまとめたので、こちらを参照。

ステップ実行のためのよく使用するショートカットも以下にまとめます。

起動 F11 gdbを起動する
再開 F8 gdbを再開する。
はじめはmainで止まるので、F8でブレイクポイントまで移動することを
ステップイン F5 ステップ実行をする。
一行ずつプログラムを進めることができる。
ステップオーバー F6 関数単位で実行する。
関数の頭でステップオーバーすると、
関数内にはいらずに次の処理へすすむ。
結構使う。
ステップ・リターン F7 現在の関数がreturnするまでを実行する。
まあまあ使う。

 

他にも、ウォッチポイントを簡単に設定できたり、逆アセンブリ結果を表示できる。

とにかく高機能だ。

こんな便利なものが、無料で使えるならば、利用しない手はないだろう。

補足

  • Eclipse 3.7 Indigoでは、gdb7.4以降のバージョンが動作しないようだ。

Undefined maintenance set command: “python print-stack off”. Try “help maintenance set”.

のようなメッセージが出るはず。そんなときは、

  • Eclipse 4.2 Junoにアップグレードする。
  • gdbをダウングレードする。

のいづれかが必要。自分はcygwinで一つ前のgdbのバージョンに設定したら動いた。

Eclipse Community Forums: CDT ≫ Error message from debugger back end

  • Eclipseを使ってない場合はInsightという方法もある。

26 Feb 2013, 12:41

Eclipse プラグイン「Glance」でのインクリメンタル検索が便利な件

Eclipse CDTを使っていると、インクリメンタルサーチがけっこう貧弱に感じる。
かといって、検索機能を起動するまでもなくさくっと調べたい。

そんなときには、「Glance」がけっこう良かった。

eclipse-glance – Incremental Text Search and Highlight in Eclipse – Google Project Hosting

 

 

Glanceプラグインを利用すると、インクリメンタルサーチがサクッと、ハイライトが綺麗に検索できます。便利!


Glanceインストール方法

ツールバーの[ヘルプ] > [Eclipseマーケットプレイス]から[Glance]を検索。
あとは、指示に従ってインストール。

Glanceのキーバインドを変更する

標準のキーバインドだと「Ctrl + Alt + F」が割り当てられている。
これは、Eclipse CDTキーバインドのデフォルトでのキーバインドと重複している。

既存のインクリメンタルサーチ[Ctrl + J]をGlanceでのサーチに置き換えるのがよい。

ツールバーの[ウィンドウ] > [設定] > [一般] > [キー]を選択。
検索窓から[Ctrl + J]で引っかかったコマンドをアンパインドする。
次に[Open Glance]のキーバインドを[Ctrl + J]に割り当てる。

Glance使用例

こんな感じ。

21 Oct 2012, 13:25

Eclipse CDT リファクタリング機能について調べてみた。

偶然、以下のリンクの動画を見つけて、ものすごくカッコ良かった。

実践!リファクタリング – WEB+DB PRESS Vol.37

ほぼパクリだけれども、自分でもEclipse CDT版で紹介動画を作ってみた。
ソースとかは思いつきなので、参考にならないけれども。

[http://www.youtube.com/embed/huxHVMcMfR0]

 

Eclipse CDTのリファクタリング機能はJDTに比べてショボかった

Eclipse CDTのリファクタリング機能はJDTに比べて、思ったよりもショボかった。

  • インライン化の機能はない。
  • 関数の抽出でも、重複コードを見つけてくれない。
  • 関数の移動ができない

。。などなど。

できることは、以下の通り。

  • 名前変更
  • ローカル変数の抽出
  • 定数の抽出
  • 関数の抽出
  • Toggle Function

開発元のサイト(http://r2.ifs.hsr.ch/cdtrefactoring)をのぞくと、今後機能追加がされそうな雰囲気。

CDT リファクタリング機能の簡単な紹介

リファクタリング機能の簡単な説明。

実際にC言語でどのようなリファクタリングが有効かというのは、以下のサイトが非常に参考になった。リファクタリングの経典、マーチン・ファウラーの『リファクタリング』の中で、C言語で使えるものだけを選択して紹介している。

Refactoring C-code

名前変更(Alt + Shift + R)

同一ファイル名の変数名や関数名を変更できる。
個人的には、とてもよく使う。

ただし、ファイルをまたいで置換は失敗する。
この場合は、検索&置換機能で変更したほうがよい。

ローカル変数の抽出(Alt +Shift + L)

選択した部分をローカル変数に抽出することができる。
長い条件文を簡単にするときなどや、わかりにくい式に簡単な名前を与えるときに使用する。

実行すると、選択した行のすぐ上に、型つきで変数の定義と代入文があらわれる。

int sample = ( 選択した式)
if(sample(選択した式) {
}

個人的には、この逆の変数のインライン化とセットでできればいいのにと思う。

定数の抽出( Alt + C)

数字や文字列など、むき出しな状態でコードに書いてあるときは、定数の抽出を使う。
実行すると、ファイルの先頭に、定数が 『static const 』つきで宣言される。

関数の抽出( Alt + Shift  + M)

関数の抽出もよく使う。

関数として抽出したい部分を選択して実行すると、関数の頭に選択した部分を含む関数が生成される。選択した部分にreturn文が含まれると動作しないので注意が必要。また、選択した部分に含まれる変数を自動的に検出して、仮引数とする。

これはJDTのように重複する部分を自動で検出して置換してはくれないのが悲しい。

Toggle Function( Alt + Shift + T)

指定された関数をソースファイルからヘッダファイルへ移動する。
関数をインライン関数に変更したい場合に使う機能。

参考リンク

21 Oct 2012, 12:35

『cdt-tests-runner』GoogleTestの結果をEclipse CDTから見るプラグイン

自分は、Eclipse CDTからGoogleTestを利用している。
Eclipse CDTから GoogleTestの結果を見るプラグインを見つけたので、紹介。

[http://www.youtube.com/embed/vObiKSSNJEY]

 

JUnit ViewerのCDT版『cdt-tests-runner』

プラグインの名前は『cdt-tests-runner』。公式サイトは以下。

https://github.com/xgsa/cdt-tests-runner/wiki/Tutorial

GoogleTestだけでなく、Boost Test, Qt Testにも対応している。

Eclipse CDT 8.1 からは、デフォルトで搭載されているらしい。
が、自分のCDT 8.1には入っていなかったので、手動でダウンロードした。
以下のパスを[ヘルプ] > [新規ソフトウェアのインストール] > [作業対象] に貼り付けて、C/C++ Test Runnerをインストール。

https://raw.github.com/xgsa/cdt-tests-runner/tests_runner_demo/testsrunner/org.eclipse.cdt.testsrunner-updatesite/site.xml

image

cdt-tests-runnerの設定方法

インストールできたら、GoogleTestを走らせたいプロジェクトの[実行の構成]を見る。
C/C++ Unitという新たな項目を選択して、実行構成を新規作成。

GoogleTestを利用するためには、[C/C++ Testing]タブを開いて、Tests RunnerでGoogle Tests Runnerを選択する。

image

[実行]を選択すると、テストが走り、実行結果が表示される。

実行結果

image

失敗したテストをクリックすると、そのテストまでジャンプできるところが嬉しい。
これはEmacsではできるよと書いてあったが、Eclipseでもしたかった。

Emacs で直接,失敗した行に移動するにはどうすればよいでしょうか? 窶錀 GoogleTests

Eclipse のプラグインでなければ、Guiterもあるよ

Eclipseのプラグインにこだわりがなかったり、Eclipseユーザでなければ、『gtest-gbar(Guiter)』というツールをつかうという選択肢もある。

http://code.google.com/p/gtest-gbar/

これならば、Visual Studioユーザでもレッド・グリーンが楽しめる。

今までは、自分もこっちを利用していた。
エラーしたときのメッセージ表示の欄が広くて見やすいので、またこっちに戻るかも。