ようやくきました。Visual StudioがGCC/GDB対応

不覚。もうずいぶん前からVisual StudioのGCC対応を熱望していた私が、私が…既に対応していたのを知らなかったとわ。とほほ。ま、最近はIoTに専念していたのでAご勘弁。でも全く関係ないわけではなく、むしろ結構関係してる。

はい、不覚話はそれくらいにして、話を進めます。Visual Studio 2015 がリリースされた時、iPhone、AndroidのNativeアプリが開発できる機能が加わり、GDB対応により実機デバッグができるようにはなっていました。で、2015年11月18日にUpdate 1がリリースされました。その時に

https://blogs.msdn.microsoft.com/vcblog/2015/11/18/announcing-the-vs-gdb-debugger-extension/

Announcing the VS GDB Debugger Extension

というブログが公開されてました。はい、チラ見しました。GDB対応がLINUXも含めて拡張されたのね、はいはい…っていうのが確か当時の印象。しかし、今回ちゃんと全文見直して、おいおい、それだけで済む話じゃない、って訳です。VS2015初版リリースの時は、言ってみれば、

スマホのiOS、AndroidのNativeアプリのデバッグ用としてGDB対応したよ

ってことで、組込みマインドからすると、「あぁそう、便利になったね(棒読み)」って感じで、いやそれならGCC対応しようよ。そしたら組込み系でGNU系のC/C++使っている人たち皆に「Visual Studio使おうぜ」って言えるよね…なんて思ってました。

で、Update 1でリリースされた機能、ブログによれば、

LINUX上で動くNativeアプリをGCCのC/C++で開発できて、リモートで動いているNatvieアプリをGDBでデバッグできますよ

ついでに、

LocalでもCygwinとかMingwでローカルでG++でコンパイルできて、GDBでデバッグできるよ

 ふわぁっ?え?ちょっと待て、ってことは、GCC系のコンパイラエラーもVisual Studioでハンドリングするの?そしたら、GNU系のクロスコンパイラー系もできるわけだよね?えーっ…ってことです。ま、クロスコンパイラがWindowsで実行可能であることが条件ですが。プロならGNUのコンパイラを自分で作るのなんか簡単だからそこは問題ないとして。

先ほど挙げたブログに全部書いてあるんで見てね…と行きたいところですが、そうすると私いらなくなっちゃうので、引っかかりそうなところも含め説明しておきますね。

まずは、https://mingw.org/ からInstallerをダウンロード&実行してGCC/G++が動く環境を構築してくださいね。そんで、環境変数(え?今時?とか言わないように)でPATHに、c:\mingw\binを追加してください。

コントロールパネル→システムで、”システムの詳細設定”をクリックして、”環境変数”をクリック、ユーザーの環境変数の”PATH”を選択して、”編集”をクリックし、Mingwのパスを追加します。そのままではこの変更は有効にならないので、一旦デスクトップをサインアウトして再度サインインしてください。

Visual Studio 2015 Update 1を起動して、メニューの”ツール”→”拡張機能と更新プログラム”を選択し、”オンライン”を選択した後、検索窓に”GDB”と力強く入力!

”Visual Studio GDB Debugger”を選択してインストールします。いったんVSを再起動し、プロジェクトを作成!

 Visual C++のMakefile Project(GDB)を使ってプロジェクトを作ります。

それで、main.cを追加して、

#include <stdio.h>

int main(int ac, char** av)
{
 a
}

こんなコードを書いてみる。そして、プロジェクトのプロパティを開いて、

"デバッグ”を選択して、起動するデバッガーは”Local Debugger”を選択、”Local Working Directory”に、作っているプロジェクトのディレクトリを絶対パスで入力します。この時、スペースとか入っていると、GCCコンパイラの引数として正しく渡されないので、ショート形式にするか、スペースが入らないディレクトリでプロジェクトを作るかしてください。それと、”Local Executable”には”gdbtest.exe”と入力します。次に、

VC++ディレクトリの”実行可能ディレクトリ”に”c:\mingw\bin"を追加してください。環境変数だけだと現時点?では正しく動きません。

そして、

NMakeの項目で、Build Command Lineに、

gcc "$(LocalWorkingDirectory)\main.c" -g -o "$(LocalWorkingDirectory)\$(LocalExecutable)"

と入力して、”OK”をクリックし、とりあえず、ビルドしてみましょう。

おっ、エラー表示されてますね。

では直して最終的に

#include <stdio.h>

int add(int x, int y)
{
 int z = x + y;
 return z;
}
int main(int ac, char** av)
{
 int x = 1;
 int y = 2;
 int z = add(x, y);
 printf("%d+%d=%d", x, y, z);
}

こんなコードを書いて、addメソッドのreturn z;の行にブレークポイントを設定してF5実行してみましょう。

おー、デバッグできてる&変数も表示できてる。

と、まぁこんな感じです。

…いやぁ…でもさ…ファイル一個だけコンパイル&デバッグできてもねぇ…一つの関数にすべてのロジック詰め込むようなど素人じゃねっし…と思った方、そうですよね。Makefile対応しないとね。

早速、プロジェクトにMakefileという名前でファイルを追加し、中身を

gdbtest.exe:main.c
 gcc main.c -g -o gdbtest.exe

とします。

先ほどのプロジェクトプロパティのNMakeの”Build Command Line”を

nmake /f "$(LocalWorkingDirectory)\Makefile

と変更すれば、Makefileに記載されたビルドルールでビルド&デバッグが可能です。

Makefileでごりごりビルドルールを書いてビルド&デバッグと、あとは実機にリモートでつないで実機デバッグということになるわけです。

リモートデバッグは、ターゲット側でのGDB Serverの設定と、SSHによるリモート接続という別の技術要素が入ってきます。

組込みLINUXをはじめとする様々なGNU系のコンパイラを使っているクミコマーの皆さん、一緒にトライしてみませんか?

お待ちしてます!

追加情報です。この機能を使うには、VC++ Android開発の機能のインストールが必要です。うまく動かないときは、コントロール→”プログラムのアンインストールまたは変更”で、”Visual Studio 2015”を検索して”変更”をクリックして、

少なくとも上図のようにチェックを入れてインストール状態を更新、または、Visual Studioのインストールから始める場合もこのような設定でインストールしてください。