【VScode】WindowsとMac両方にC++のdebug環境を整える

投稿者: | 2020年5月21日

前回、MinGW環境からWSL環境に乗り換えましたが、それに伴ってエディタをAtomからVScodeに変えました。理由としてはデバックが容易というのが一番大きいです。

さて、windows側ではデバッグが動いているところまでできたので、次はMac上での環境を整えていきます。

環境

  • OS: macOS Catalina ver.10.15.4
  • VScode: ver.1.45.1
  • コンパイラ: gcc (not clang)

1.複数環境にまたがる場合の書き方

私の環境では、競技プログラミングで書いたコードはすべてOneDrive上で共有しています。また、VScodeに追加したワークスペースは、その共有しているディレクトリになっています。

そのため、windowsで環境構築したときにできたtasks.jsonやlaunch.jsonも一緒に共有されます。そのため、これらに追記する必要があります。

書き方は簡単です。tasks以下に{}をつけて最後に","をつければ新しいプロパティを書き足す事ができます。具体例としてtasks.jsonの一部を以下に示します。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label":"build on mac",
            "type":"shell",
            "command":"g++",
        },

        {
            "label": "build on windows",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "C:\\Windows\\System32\\wsl.exe",
                }
            },
            "command": "g++",
        }
    ]
}

あとは、VScodeで「どっち使う?」とプルダウンメニューが出てくるので、環境に合わせたほうを選べばちゃんと動きます。

2.c_cpp_properties.jsonを設定する

{
    "configurations": [
        {
            "name": "WSL",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "cStandard": "c11",
            "cppStandard": "c++17"
        },
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "usr/local/include/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk 1/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/local/bin/g++",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

上部分がwindowsで使う設定、下側がmacで使う設定になります。

3.tasks.jsonを設定する

{
    "version": "2.0.0",
    "tasks": [
        {
            "label":"build on mac",
            "type":"shell",
            "command":"g++",
            "args":[
                "-std=c++17",
                "-g",
                "-O0",
                "-o",
                "'${workspaceFolder}/problem.out'",
                "'${file}'",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },

        {
            "label": "build on windows",
            "type": "shell",
            "options": {
                "shell": {
                    "executable": "C:\\Windows\\System32\\wsl.exe",
                }
            },
            "command": "g++",
            "args": [
                "-std=c++17",
                "-g",
                "-O0",
                "-I/opt/boost/gcc/include",
                "-L/opt/boost/gcc/lib",
                "-o",
                "`wslpath",
                "'${workspaceFolder}\\problem.exe'`",
                "`wslpath",
                "'${file}'`",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

今度は上がmacで使う設定、下がwindowsで使う設定です。

4.launch.jsonを設定する

今回最も詰まった部分です。macOS CatalinaではMicrosoft C/C++ for Visual Studio Code Extensionが正常に動きません。ブレークポイントを素通りしたりします。私の環境でも動きませんでした。

そのため、新しく拡張機能から"codeLLDB"を入れる必要があります。

インストールが完了したらlaunch.jsonを記述します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) on Mac Launch",
            "type": "lldb",
            "request": "launch",
            "program": "${workspaceFolder}/problem.out",
            "args":[],
            "cwd": "${workspaceFolder}",
        },

        {
            "name": "(gdb) Bash on Windows Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${command:extension.vscode-wsl-workspaceFolder}/problem.exe",
            "args": [
                "<",
                "${command:extension.vscode-wsl-workspaceFolder}/problem.in"
            ],
            "stopAtEntry": false,
            "cwd": "${command:extension.vscode-wsl-workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "pipeTransport": {
                "debuggerPath": "/usr/bin/gdb",
                "pipeProgram": "${env:windir}\\system32\\bash.exe",
                "pipeArgs": [
                    "-c"
                ],
                "pipeCwd": "/"
            },
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "sourceFileMap": {
                "${command:extension.vscode-wsl-workspaceFolder}": "${workspaceFolder}"
            },
        }
    ]
}

上がmac用の設定、下がwindows用の設定です。

大きな変更点は6行目のtypeをcppdbgからlldbに変えた点です。これを変えるとVScodeが波線を引く部分があるので、それをすべて削除します。

5.試運転

試しにブレークポイントを貼ってdebugしてみます。手順は

  1. ビルドする(このとき環境にあっている方を選ぶ)。ショートカットキーはcmd+shift+b
  2. debugモードにする。(ショートカットキーはcmd+shift+d。または、VScodeの一番左側のアクティビティバーの上から4番目のアイコンをクリック)
  3. ブレークポイントを貼る
  4. デバッグモードで実行する
  5. ブレークされている確認

試しにやってみると、次のようになります。

debug with vscode on mac

cinなど標準入力がある場合は、VScodeのコンソールから入力できます。実行すると勝手にターミナルに画面が遷移するので、かゆいところに手が届くなという感想です。

6.おわりに

ブレークポイントが動かないなどなどでMacでの設定に1日かかりましたが、これでwindowsとmac両方にデバッグできる環境ができました。これやっててC問題埋めをサボっていたので、また埋めていきたいと思います。

7.参考文献

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください