はじめに
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.txtcmake_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
)を用意する。最初のコマンドでMakefile
がbuild
ディレクトリに生成され、次のコマンドでビルドする。-S
オプションはソースファイルのディレクトリを、-B
オプションはビルド成果物のディレクトリを指定する。--build
オプションはMakefile
のある場所を指定する。
下記はLinuxの場合
doDebugBuild.shcmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build
下記はWindowsの場合。G
オプションでMinGW用のMakefileを生成するよう指示する。
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向けの設定を選択して実行する(▷のマークを押す)。