CMakeでビルドしている環境下でVS Codeでデバッグする

はじめに

CMakeを使ってビルドしている環境でVS Codeでデバッグしようとして、しょーもないことでハマって数時間を溶かしたので、今後の為に書き残しておく。

CMakeLists.txtを書く

これはWeb情報が充実しているのでここで説明するまでもない。今回書いたものを貼っておく。実行ファイル名とトップレベルのcppファイル名は拡張子をを除いて一致させる前提である。

2021/8/1現在、WindowsではCMakeを経由したClangが使い物にならない(Visual Studio のMSVCコンパイラを使うように勝手に動作が変更され、MSVCコンパイラは出来が悪く、大量のWarningとErrorとともに死ぬ)ので、Windows環境ではMinGWのgccを使う。当然だが、Windows環境でこの記事の内容を実行したいならgccをインストールしておく必要がある(スレッドモデルはposixがおすすめ。Linux向けに作ったマルチスレッドプログラムのソースコードを変更なしでそのまま使える)。

CMakeLists.txt
cmake_minimum_required(VERSION 3.18 FATAL_ERROR)

if (UNIX)
    set(CMAKE_CXX_COMPILER "clang++")
elseif (WIN32)
    set(CMAKE_CXX_COMPILER "g++")
endif ()
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "-Wall -Wfatal-errors -Wundef")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

# Set the project name and language.
project(SymbolRecoveryPllExtension CXX)

add_executable(main main.cpp atan2_polyApprox.cpp)

tasks.jsonの編集

デバッガ起動前にプロジェクトをビルドするための「タスク」を .vscode/tasks.jsonに記述する。ビルドは複数のコマンドが必要になるので、シェルスクリプト(Windowsの場合はバッチファイル)を作ってそれをtasks.jsonから呼び出すことにする。

まず次の内容のシェルスクリプトdoDebugBuild.sh(Windowsの場合はdoDebugBuild.bat)を用意する。最初のコマンドでMakefilebuildディレクトリに生成され、次のコマンドでビルドする。-Sオプションはソースファイルのディレクトリを、-Bオプションはビルド成果物のディレクトリを指定する。--buildオプションはMakefileのある場所を指定する。

下記はLinuxの場合

doDebugBuild.sh
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build

下記はWindowsの場合。GオプションでMinGW用のMakefileを生成するよう指示する。

doDebugBuild.bat
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -G "MinGW Makefiles"
cmake --build build

次にtasks.json"tasks"配列に次の要素を追加する。"command""args"で上述のシェルスクリプト/バッチファイルを呼び出している。"label"は後で使うので名前は重要。"command": "sh"とある箇所は必要に応じて"command": "bash"に変えてよい。

{
    "type": "cppbuild",
    "label": "C/C++: build project on Linux (debug)",
    "command": "sh",
    "args": [
        "doDebugBuild.sh"
    ],
    "options": {
        "cwd": "${workspaceFolder}"
    },
    "problemMatcher": [
        "$gcc"
    ],
    "group": {
        "kind": "build",
        "isDefault": true
    },
    "detail": "Build project with debug configuration."
},
{
    "type": "cppbuild",
    "label": "C/C++: build project on Windows (debug)",
    "command": "doDebugBuild.bat",
    "args": [],
    "options": {
        "cwd": "${workspaceFolder}"
    },
    "problemMatcher": [
        "$gcc"
    ],
    "group": {
        "kind": "build",
        "isDefault": true
    },
    "detail": "Build project with debug configuration."
}

launch.jsonの編集

.vscode/launch.json"configurations"配列に次の要素を追加する。"program"が実行ファイルのパスを指定する。Windows用の設定の miDebuggerPathは読者の環境に応じて書き換えが必要だと思う。"externalConsole"falseにしておかないとデバッグが始まらないので注意。ここで数時間ハマった。

cwdはデバッグ対象のプログラムが実行されるときのワーキングディレクトリとして使われる。数値実験用プログラムなど、ファイル入出力を伴うときはそれらのファイルがビルド成果物とは異なる(一般には上位の)ディレクトリに存在する場合が多い。そのようなときにcwdが役に立つ。

{
    "name": "(gdb) build and debug active file on Linux",
    "type": "cppdbg",
    "request": "launch",
    "program": "${workspaceFolder}/build/main",
    "args": [],
    "stopAtEntry": true,
    "cwd": "${workspaceFolder}",
    "environment": [],
    "externalConsole": false,
    "MIMode": "gdb",
    "miDebuggerPath": "/usr/bin/gdb",
    "setupCommands": [
        {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
        }
    ],
    "preLaunchTask": "C/C++: build project on Linux (debug)"
},
{
    "name": "(gdb) build and debug active file on Windows",
    "type": "cppdbg",
    "request": "launch",
    "program": "${workspaceFolder}/build/main.exe",
    "args": [],
    "stopAtEntry": true,
    "cwd": "${workspaceFolder}",
    "environment": [],
    "externalConsole": false,
    "MIMode": "gdb",
    "miDebuggerPath": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/gdb.exe",
    "setupCommands": [
        {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
        }
    ],
    "preLaunchTask": "C/C++: build project on Windows (debug)"
}

デバッグ実行

トップレベルのcppファイルが開かれたタブをアクティブにした状態でVS Codeの左側のメニューから「デバッグと実行」(🐞と▷のマーク)を押してサイドペインを開き、最上部のプルダウンメニューからLinux/Windows向けの設定を選択して実行する(▷のマークを押す)。

投稿者: motchy

An embedded software and FPGA engineer for measuring instrument.

コメントを残す