VisualStudio2017でLinuxアプリのリモートデバッグ

# はじめに
VisualStudio2017で簡単にLinux向けアプリのデバッグができるとのことで，試した記録を残します．
[追記]
今回の環境を使用する上で発生した問題と，その解決策を別記事に記載しました．
(https://qiita.com/nyasai/items/fc2e201f6728162cd0fa)
# VirtualBoxの設定
## ホストOSからゲストOSへのssh接続
ホストOSからゲストOSへssh接続を行えるよう，VirtualBoxの設定を行います．
1．ssh接続を行うゲストOSの仮想マシン設定から，ネットワークにNATを追加．
[追記]
下記設定でやるならここでホンストオンリーアダプターも追加する必要がありますね．ssh接続するときはここで追加したホンストオンリーダプターに割り当てられているIPに対して行うといけるはずです．
![ネットワーク設定](https://qiita-image-store.s3.amazonaws.com/0/249420/9e0f5c77-664e-205d-6c77-cd47c8901474.jpeg)  
2．NAT設定にしたアダプタの高度設定からポートフォワーディング設定を開き，ssh用の設定を追加．
![ポートフォワーディング設定](https://qiita-image-store.s3.amazonaws.com/0/249420/62136bff-02a1-48bf-f167-426e02bb6534.jpeg)  

## 必要なツール類のインストール
ここでopenssh-server，g++，gdb，gdbserver をインストールします．既にインストール済みの場合は不要です．
1．ゲストOSのシェルで以下を実行．

```shell
sudo apt install openssh-server g++ gdb gdbserver
```
2．ゲストOSにて以下コマンドを実行し，sshサービスを実行．

```shell
sudo service ssh start
```

# VisualStudio2017の設定，実行

## プロジェクトの作成
Visual C++のクロスプラットフォームのLinuxを選択し，コンソールアプリケーションを作成します．
![プロジェクト作成](https://qiita-image-store.s3.amazonaws.com/0/249420/540f1939-2fbc-3b7e-ce07-51ebb514801f.jpeg)  
※ここで当該選択肢がない場合は，インストーラから「C++によるLinux開発」を選択し，インストールしてください．
![Linux開発用環境追加](https://qiita-image-store.s3.amazonaws.com/0/249420/1feb27c0-c7ab-935c-cd85-a725e5cd8736.jpeg)  

## 実行するコードの作成
ここで日本語を表示しようとするとソースファイルがShift-JISのため，文字化けが発生します．そのため，テキストエディタ等でソースファイルの文字コードをUTF-8に変更してください．
また，linux固有の関数等はインテリセンスが使用できません．使用したい場合はLinux上の/usr/includeをWindows側にコピー，追加のインクルードディレクトリに登録する必要があります．もしくはSambaで共有させて，それをインクルードディレクトリに登録することでも可能なようです．
[参考]https://docs.microsoft.com/ja-jp/cpp/linux/configure-a-linux-project#vc-directories
[参考2(Samba共有)]https://qiita.com/mt08/items/5070df64e5af2285d5b5#%E3%81%8A%E3%81%BE%E3%81%91

[追記]
VS2017のヴァージョン新しくしていれば，自分でインテリセンス用の設定を行わなくても，VS側がダウンロードして設定してくれるようですね．

```c++:maint.cpp
// テスト用  
#include <iostream>
#include <pthread.h>


static void* test_thread(void* arg)
{
	char* msg = (char*)arg;
	std::cout << msg << "\n";
	pthread_exit(NULL);
}


int main()
{
	pthread_t thread1;
	char* msg = "Test Thread!!";

	if (pthread_create(&thread1, NULL, test_thread, (void*)msg) != 0)
	{
		std::cout << "error\n";
		return -1;
	}

	pthread_join(thread1, NULL);

	return 0;
}  
```

## ライブラリのリンク等
プロジェクトのプロパティから，「リンカー」->「コマンドライン」の追加のオプションに追加することでライブラリリンク等ができます．
今回はpthreadを使用したいので「-pthread」を追加します．
![オプション追加](https://qiita-image-store.s3.amazonaws.com/0/249420/ec8612f5-f988-ccda-c6e7-c2f0e9a5ae12.jpeg)

## コンソールの起動
VisualStudioのツールバーのから「Linuxコンソール」を起動してください．ここに標準出力に出力した内容等が表示されます．
![Linuxコンソール起動](https://qiita-image-store.s3.amazonaws.com/0/249420/1a806dc8-2b53-ee89-82d5-a78bcc4b21ec.png)  
![Linuxコンソール](https://qiita-image-store.s3.amazonaws.com/0/249420/2ec6c7d0-9e49-1c41-ba68-c9b11b11b341.jpeg)

## デバッグ実行
デバッグ実行を行うと初回のみ以下のような画面がでてきますので，ゲストOSの設定に従って設定を行ってください． 

| 項目 | 設定内容 |
|:--|:--|
|ホスト名|ゲストOSのIPアドレス|
|ポート|22|
|ユーザ名|ゲストOSのユーザ名|
|認証の種類|パスワード|
|パスワード|ユーザ名で入力したゲストOSのユーザのパスワード|
![初回実行.JPG](https://qiita-image-store.s3.amazonaws.com/0/249420/85056e38-8f1a-6401-ac92-48a4feb5f908.jpeg)

設定の入力が完了し，接続ボタンを押下すると，ビルドが走りデバッグ実行が開始されます．
![デバッグ実行.JPG](https://qiita-image-store.s3.amazonaws.com/0/249420/4f243f06-3888-0374-e1b7-6f9aed7fd222.jpeg)


# まとめ
以上で最低限VisualStudio2017からLinux向けアプリのリモート実行を行うことができます．
VisualStudioでLinux向けのアプリのコーディング，デバッグを行えるのは便利でいいですね．


# 補足
## 補足1
一度設定したリモートデバッグ先の情報はVisualStudioのツールバーの「デバッグ」->「オプション」->「クロスプラットフォーム」にあるので，ここで削除や新たに追加することも可能です．
![ビルド先設定.JPG](https://qiita-image-store.s3.amazonaws.com/0/249420/2ddc8845-13a5-0f2b-8db4-8a89d4abb664.jpeg)  


## 補足2
ビルド時に生成される実行ファイル等は，ゲストOSのログインしたユーザのホームディレクトリの「projects]フォルダ内にプロジェクト名どう同一のフォルダ名で作成されます．
![ゲストOS実行ファイル.JPG](https://qiita-image-store.s3.amazonaws.com/0/249420/f879a50c-1648-c00d-1d02-76d8876e7c67.jpeg)

# 参考資料
Linux プロジェクトのデプロイ、実行、デバッグ
https://docs.microsoft.com/ja-jp/cpp/linux/deploy-run-and-debug-your-linux-project
Linux プロジェクトの構成
https://docs.microsoft.com/ja-jp/cpp/linux/configure-a-linux-project#vc-directories
[メモ] Visual C++ for linux Development でOpenGL
https://qiita.com/mt08/items/5070df64e5af2285d5b5#%E3%81%8A%E3%81%BE%E3%81%91