Windows+Rust+ VSCodeでのデバッグ設定

## 前提
Windows10+VSCodeの環境でRustを書く上でデバッグ接続できる環境を整える。

いくつかプラグインや設定の選択肢があって迷ったけど、なんとか欲しかった環境が整ったのでそのメモ。

### 環境
Windows10
VSCode: 1.25.1
Rust: 1.29.0-nightly
rustup: 1.13.0
ツールチェイン: x86_64-pc-windows-msvc

### できるようにすること
* panic時に停止して、コールスタックを見る
* コールスタックのソースファイルや行番号の確認や、そこへのジャンプ
* ブレークポイントを置いて停止
* 停止時にローカル変数の中身を確認
* 停止後にステップ実行

## 使用したプラグインと設定

[C/C++ for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)
C++用のプラグインだが、Rustのデバッグにも使える。

### 設定ファイル
```jsonnet:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(Windows) Launch",
            "type": "cppvsdbg",
            "request": "launch",

            // 以下はテストコードをデバッグするための設定
            "preLaunchTask": "build_for_test",

            // cargo testで出力されるexeファイル名は決定的ではないので、ファイル名が変わるごとに書き換える必要がある
            // 詳しくは以下
            // https://github.com/rust-lang/cargo/issues/1924
            "program": "./target/debug/lib-1adc6a69d090234d.exe", 

            "args": ["--nocapture"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "internalConsoleOptions": "openOnSessionStart",
            "sourceFileMap":{
                // 以下は環境に合わせて変更が必要
                "c:/projects/": "${env:HOMEPATH}/.rustup/toolchains/nightly-x86_64-pc-windows-msvc/lib/rustlib/src/",
            },
            "logging": {
                "trace": false,
                "exceptions": false,
                "moduleLoad": false,
                "traceResponse": false,
                "engineLogging": false,
                "programOutput": true,
            }
        }
    ]
}
```

```jsonnet:.vscode/tasks.json
{
    "version": "0.1.0",
    "command": "cargo",
    "isShellCommand": true,
    "tasks": [
        {
            "taskName": "build",
            "isBuildCommand": true,
            "showOutput": "always",
            "problemMatcher": {
                "owner": "rust",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": [
                    {
                        "regexp": "(error|warning)(?:\\[(.*)\\])?: (.*)",
                        "severity": 1,
                        "code": 2,
                        "message": 3
                    },{
                        "regexp": "-->\\s+([^:]*):(\\d+):(\\d+)",
                        "file": 1,
                        "line": 2,
                        "column": 3
                    }
                ]
            }
        },
        {
            "taskName": "clean",
            "showOutput": "always"
        },
        {
            "taskName": "build_for_test",
            "command": "cargo",
            "args": ["test", "--no-run"],
            "isTestCommand": true,
            "showOutput": "always",
            "problemMatcher": {
                "owner": "rust",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": [
                    {
                        "regexp": "(error|warning)(?:\\[(.*)\\])?: (.*)",
                        "severity": 1,
                        "code": 2,
                        "message": 3
                    },{
                        "regexp": "-->\\s+([^:]*):(\\d+):(\\d+)",
                        "file": 1,
                        "line": 2,
                        "column": 3
                    }
                ]
            }
        }
    ]
}
```

デバッグは、「デバッグ->デバッグの開始」から開始できる。

## 他に試したプラグイン

### LLDB
https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb

* 現状、Windowsではツールチェインが`i686-pc-windows-gnu`でないと動かない。 
    * https://github.com/vadimcn/vscode-lldb/wiki/Installing-on-Windows
* ブレークポイント、ローカル変数表示、ステップ実行などはできたが、標準ライブラリ内へのジャンプはソースコードではなくアセンブリの表示だった。
* launch.jsonでcargoのtestを直接指定できるので、実行ファイル名が変わる問題を回避できる。

### WinDbg
https://marketplace.visualstudio.com/items?itemName=reznikdi.windbg-debug

* デバッグ接続自体は動いたが、標準出力が表示されなかった。チケットはあったものの放置されてる。
    * https://github.com/reedz/windbg-debug/issues/6