Visual Studio 2015で、LinuxのHelloWorldデバッグ(MIDebugEngine使用)


MIEngineを使って、Visual Studio 2015から、Linuxのgdbに接続して、VSのIDEのユーザインターフェースで、デバッグ。

- ラズパイでやってみた記事は[こちら VS2015でRaspberryPiデバッグ](http://qiita.com/mt08/items/1bc6dfe8663eddf552eb)
- mingw/cygwinのgcc/gdbで、ローカルでもできました(追記10/6:おまけ)
- gdbとなんかやってるぽいですね
![gdb2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/8e19d0fb-bcac-5390-afe9-456663dbbd32.png)

### 下準備 
1. Windows
 - Visual Studio 2015
 - MIDebugEngine を入れとく。 (関連記事 : [Visual Studio 2015 へ MIEngineのインストール](http://qiita.com/mt08/items/4a71bed86bdd26bf7941) )
 - PuTTY (鍵作って、linux側の ~/.ssh/authorized_keysに登録しておく。 `chmod 600 authorized_keys`じゃといけないよ
2. Linux環境
 - openssh-server
 - 開発環境: gccとかgdbとか、(build-essential)入れとく。
 - sambaいれて、Windowsのネットワークドライブにマウントできるようにしておく。=> 今回は linuxのユーザホーム`~`を`J:\ ` に マウントしました。
  

- 上でわからないことは、 ググるか、コメントでたずねると、詳しく知ってる、親切な人が... きっと...

### Windowsから、Plink.exeにて接続確認
- ↓をためして、`Hello World!`がかえってくると、OK.

```shell-session
C:\Tools\PuTTY\PLINK.EXE -i putty_private_key.ppk user01@linux_ip_address echo Hello World!
Hello World!
```

### ファイルの準備
```cpp:/home/user01/HelloWorld/HelloWorld.cpp
#include <cstdio>
int add(int x, int y)
{
        return x + y;
}
int main()
{
        int a = 5;
        int b = 4;
        int c = add(a, b);
        std::printf("Hello World %d\n", c);
        return 0;
}
```
### VSで普通にビルドして、うごかみる。
1. VS2015起動
2. File > New > Project From Existing Code...から
 - Visual C++ `[Next]`
 - Project file location: `J:\HelloWorld`
 - Project name: `HelloWorld`
 -  で `[Next]`
3.とりあえず.. 
 - `Use Visual Studio` で、
 - `[Console application project]`
 - で `[Next]`
4.  `[Next]`
5.  `[Finish]`
6. HelloWorld.cppを開いて、適当なとこに、Breakpointおいて、[F5]おして、通常動作するか確認。

- Security Alertがでたら、[ ] チェックをはずして `[OK]`

### Linux 上でビルド

- 1. ファイル確認。`ls`

```shell-session:linux-console
user01@hostname:~/HelloWorld$ cd ~/HelloWorld/
user01@hostname:~/HelloWorld$ ls -1
Debug
HelloWorld.cpp
HelloWorld.sln
HelloWorld.vcxproj
HelloWorld.vcxproj.filters
LaunchOptionsLinux.xml
user01@hostname:~/HelloWorld$
```
- 2. ビルドして、実行

```shell-session

user01@hostname:~/HelloWorld$ gcc -o HelloWorld HelloWorld.cpp -g -O0
user01@hostname:~/HelloWorld$ ls -1
Debug
HelloWorld
HelloWorld.cpp
HelloWorld.sln
HelloWorld.vcxproj
HelloWorld.vcxproj.filters
LaunchOptionsLinux.xml
user01@hostname:~/HelloWorld$ ./HelloWorld
Hello World 9
user01@hostname:~/HelloWorld$
```

## VSからデバック
### MIDebugEngineへのオプションファイルを準備
- Plinkへのパスとか、
- ppkへのパスとか、
- linux host addressとか、
- linuxユーザ名とか　うまく編集してください。

```xml:/home/user01/HelloWorld/LaunchOptionLinux.xml
<PipeLaunchOptions xmlns="http://schemas.microsoft.com/vstudio/MDDDebuggerOptions/2014"
    PipePath="C:\Tools\PuTTY\PLINK.EXE"
    PipeArguments="-i C:\Users\User01\.ssh\putty_private_key.ppk user01@linux_ip_address -batch -t gdb --interpreter=mi"
    ExePath="/home/user01/HelloWorld/HelloWorld"
    ExeArguments=""
    TargetArchitecture="X64"
    WorkingDirectory="/home/user01/HelloWorld"
    AdditionalSOLibSearchPath="">
</PipeLaunchOptions>
```

### Win:VS2015から
1. HelloWorld.cppをひらいて、ブレークポイントをはる。
2. View > Other Windows > Command Window (Ctrl+Alt+A)でコマンドウインドウを開く(下)
3. Command Windowに`Debug.MIDebugLaunch /Executable:HelloWorld /OptionsFile:J:\HelloWorld\LaunchOptionsLinux.xml` といれて...
![gdb1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ba9ecc02-6157-fccb-c13c-e35d9b44df3a.png)
4. [Enter]をおす
![gdb2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/8e19d0fb-bcac-5390-afe9-456663dbbd32.png)
5. Visual Studio 2015のUIで、デバッガがうごきます。 
 - [F10] Step Over
 - [F11] Step Into
 - Shift+[F11] Step Out
 - 変数の値を変更したり、Call Stackみたりできます。

***
- main関数のあたまにbreakpointはってもとまらない？？？
- CommandWindowからでなく、[F5]から、いけるといいんだが...
- VSで編集 => Linux側でのBuild => VSからデバッグ ... が簡単にできると...
- RasPiをホストにして、つないでみるのもよいか、と。
（次回のネタ？）
 書きました => [VS2015でRaspberryPiデバッグ](http://qiita.com/mt08/items/1bc6dfe8663eddf552eb)


### おまけ:mingwとかcygwinのgccとgdb使って、ローカルWindowsで同様にデバッグできるようです。

```xml:LaunchOptionMinGW.xml
<PipeLaunchOptions xmlns="http://schemas.microsoft.com/vstudio/MDDDebuggerOptions/2014"  
    PipePath="C:\Qt\Tools\mingw491_32\bin\gdb.exe"
	PipeArguments=" --interpreter=mi"  
    ExePath="C:\VS2015\Projects\hello-mingw\HelloWorld.exe"
	ExeArguments=""  
    TargetArchitecture="X86"
	WorkingDirectory="C:\VS2015\Projects\hello-mingw"
	AdditionalSOLibSearchPath="">  
</PipeLaunchOptions>
```
![gdb3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/c366da12-1524-dd1b-6199-92320fcc5d61.png)


<!-- https://twitter.com/masami256/status/650156169416196097 -->