VisualStudio 2015 で別PCで動いている Linux 環境でのアプリ開発およびデバッグということができるかを試してみました。
必要なものは以下の通りです。
- Linux環境の別ターゲット
- VisualStudio 2015 を ”Visual C++ Android 開発”付きでインストール
ここでは VisualStudio 2015 Professional, Windows10 Pro (x64) で確認しています。
セットアップ
最低限の必要なものは準備が終わっているものとして、環境構築の説明をしていきます。
Linux側の準備
ここでは少し古いですが CentOS 6.5 の環境があったのでこれで説明します。
Samba を用いて Linux-Windows のファイル共有ができるように設定しておきます。
またコードのコンパイルを Linux で行うために、コンパイラなどのツールチェインをインストールしておきます。
# yum install samba # yum install gcc gcc-c++ gdb
Windows側の準備
「 Visual Studio GDB Debugger 」という拡張プラグインをインストールします。
これは以下のページからダウンロードすることができます。
https://visualstudiogallery.msdn.microsoft.com/35dbae07-8c1a-4f9d-94b7-bac16cad9c01
VisualStudioGDB.vsix というファイルがダウンロードされるので、ダブルクリックでインストールを行います。
(本プラグインは Microsoft のデジタル署名がついているようでした)
このプラグインが Plink を使うようなので、Putty のページからファイルを取得してきます。
Putty のページ: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
インストールしてしまっても良さそうですが、開発環境に tortoise Git も入っており、こちらが標準で使っている TortoisePlink でないものを設定済みだったりするとかち合うため、安全を考えて zip アーカイブを取得することにします。
そして、これを適当なところに展開します。ここでは C:\tools\putty に展開しました
WindowsからLinuxへのssh接続の設定
putty の中に含まれる PuttyGen.exe を実行して鍵情報を生成します。
起動させたら、 Generate ボタンを押して、空白スペースでマウスをぐりぐりと動かします。
そのまま動かしていると鍵が生成が完了します。
そして Save Private Key というボタンを押して、適当な場所に保存しておきます。
このときに passphrase なしで大丈夫かの警告がありますが、問題ないので”はい”で続行します。
ここでは tools フォルダに to-linux-target01.ppk という名前で保存したものとします。PuttyGen.exe を終了する前に、「Public key for pasting into OpenSSH authorized_keys file」の中に表示されている文字列をコピーしておきます。この後に使用します。
続いて Putty.exe を起動してIPアドレスを入力して、Linux ターゲットへssh接続を行います。
初回の場合には、信頼できるホスト登録するか聞かれるのでこちらも”はい”を押して続行します。
すると黒いウィンドウが開くので、ここでユーザー名&パスワードを入力して Linux の ssh ログインを行います。
.ssh/authorized_keys というファイルに先ほどの Public Key を追記するのですが、
もしこのファイルが存在しない場合には新規に作成してください。
$ mkdir -p ~/.ssh/ $ vi ~/.ssh/authorized_keys $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
貼り付けた後は保存して終了します。
新規にファイルを作ったときには上記のようにパーミッションにも注意してください。
動作確認
早速プロジェクトの作成をしてLinux用バイナリを生成するところまでをやってみます。
Linux用アプリのビルドの確認
プロジェクトの新規作成で、クロスプラットフォームの Makefile Project (GDB) というものを選択します。
これでプロジェクトを作成すると以下のような感じでスタートページが開きます。
おおよそここに書いてあることが全てなのですが、これをここでも説明していきます。
まずは適当に main.cpp を作成し、初回なので Hello,world でも書いておきます。
プロジェクトのプロパティを開き、ビルドの設定を行います。
まず NMake という項目があるのでそこを以下のような感じで設定します。
Build Command Line という箇所に入力する文字列は以下のようになります。
途中の空白行がありますが前半で1行、後半で1行となるように入力してください。
C:\tools\putty\PSCP.EXE -i $(PrivateKey) "$(ProjectDir)\main.cpp" $(RemoteUserName)@$(RemoteHostName):$(RemoteWorkingDirectory)/main.cpp $(SecureShellExecutable) $(RemoteUserName)@$(RemoteHostName) -i $(PrivateKey) "cd $(RemoteWorkingDirectory); g++ -g main.cpp -o $(RemoteExecutable)"
ひとまず NMake はこれで、続いてデバッグについて設定します。
以下のような感じに設定していきます。
- Remote Host/User Name : LinuxマシンのIPアドレスとログインの際のユーザー名
- Private Key: 先ほど作成した秘密鍵の ppk ファイルを指定します。
- Remote Working Directory: Linux環境上でのファイル配置ディレクトリパス
- Remote Executable: 生成されるバイナリファイルの名前
ここで設定した Remote Working Directory が存在しない場合には事前に作成しておく必要があります。
設定ができたらビルドを実行します。問題なければ以下のような画面になると思われます。
やっていることは main.cpp を scp で転送、ssh経由でのコマンド実行なので、うまくいかない場合にはどの過程にエラーがあるかを調べていく必要があると思います。
なお、今回はBuildコマンド設定のみ適用したので、リビルドを行うと失敗します。
Linux用アプリのデバッグ実行の確認
ビルドがうまくいったので、次は実行とブレークポイントが気になります。
まずはブレークポイントを設定せずに実行できるかを確認してみます。
F5で実行してみたところ、うまく実行できて終了したようです。
Linuxでの標準出力の情報は一応出力ウィンドウに出ているようです。
画面末尾に Hello,worldと出てはいます。
ではブレークポイントを張ってみたいのですが、不具合があるようで main関数1行目にブレークポイントが張れないのです。
そのため、別関数に表示関数を用意してブレークポイントを設定してみたいと思います。
コードの変更やブレークポイントは以下のようにしてみました。
デバッグ実行して止めてみたところ以下のような画面状態になりました。
うまく停止できたのでほかのウィンドウも表示してみました。
コールスタックや変数情報、逆アセンブルの表示もできていました。
逆アセンブルの表示は関数単位ではみれますが、普段便利な混合モードの表示はできないようです。
うまくいかないとき
以下のような画面が出てしまうことがあるかもしれません。
将来のバージョンでは修正される可能性もあると思いますが、今回このメッセージの原因はファイルパスをダブルクォートでくくった場合に表示されました。
まとめ
簡単なプログラムでの確認でしたが、VisualStudio で Linux 用のアプリケーションのビルドとデバッグができることを紹介・確認しました。
サンプルプログラム程度の小さなプログラムの場合には今回の内容の改変で適用可能だと思いますし、素のlinuxで gdb,gccを CUI で操作しながら開発するよりは効率が上がると思われます。
今回の問題点として単一ソースコードである、他のライブラリを使用していない、などがあります。これらについて解決可能かどうかをこの後テストしていきたいと思います。