Visual Studio Code
からRemote-WSL
を使ってWSL2
上のUbuntu
に接続した状態でgdb
を使えるようにした際、いろいろはまったので、自分用のはまりポイントを公開しておきます。
あと、ついでに出来上がった設定ファイルも。
この状態で適当なcppファイルを開いたままF5
を押せば、gdbが起動します。
基本的に Windows10にVSCodeでLinuxのC++開発環境を構築 を参考にしています。
バージョンとか
- Windows 10 (21H2)
- Ubuntu 20.04 on WSL2
- gcc 9.3.0
- gdb 9.2
- Visual Studio Code 1.63.2
自分がはまった箇所。
-
ブレークポイントが無視されてしまう。
-
別のビルドタスクから設定をコピーしてきた際、
-O0
と-g
のオプションを忘れていたため。 -
ちなみに
-g
よりも詳しい情報が欲しければ-g3
などにすると良いらしい。 -
int main()
の行で止まる。 -
launch.json
でstopAtEntry
をtrue
にしていたため。 -
ところでサイトによっては
stopAtEntry
がstopOnEntry
とも書かれている。謎。 -
cout
の出力が表示されない。 -
ただの勘違い。
-
デバッグを開始するとVSCodeのターミナルのうち、
デバッグコンソール
にいろいろ表示されてしまうので勘違いしていたが、実際はターミナル
のタブに出力されていた。 -
main()
関数の終了時に'libstdc-start.c'が開けません。
というエラーが表示されてしまう。 -
main関数を抜けた後の部分のソースコードがないために表示される。無視するしかないらしい。
-
でもポップアップは邪魔。
-
Windowsのエクスプローラから
Codeで開く
を実行しても、自動ではRemote-WSL
になってくれない。1 -
Windows版のターミナルとして
wsl.exe
を設定しておく。 -
これにより、
code .
のコマンド一つでRemote-WSL
状態のVSCodeウィンドウを開くことができる。 -
~/.bash_profile
ではなく、settings.json
のenv
にもPATH
の設定が必要。 -
settings.json
に適切なPATH
設定を書かなかった場合、bashを立ち上げたときに警告が入り、環境変数PATH
がうまく設定されない。 -
一方、きちんと
PATH
を設定してbashを起動した場合、エラーは出なくなるが、echo $PATH
を確認すると、別の値に上書きされている。2 -
bashを実行するときの
PATH
と、bashの中で参照されるPATH
が異なる?
出来上がった構成
フォルダ構成
wslで開きたいフォルダの直下に.vscode
フォルダを作成し、その中に設定ファイルを格納する。
.vscode/
c_cpp_properties.json
launch.json
settings.json
tasks.json
c_cpp_properties.json
{
"configurations": [
{
"name": "WSL",
"intelliSenseMode": "linux-gcc-x64",
"compilerPath": "/bin/gcc",
"includePath": ["${workspaceFolder}/**", "/usr/include/**"],
"defines": [],
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
tasks.json
-
group
は、サイトによっては"build"
ではなく{ "kind": "build", "isDefault": true}
と書かれている。 - 私の場合、デフォルトはonline-judge-tools用に設定しているため、デフォルト設定にはしていない。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ アクティブなファイルのビルド",
"command": "/usr/bin/g++",
"args": [
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-O0", // 必須
"-g", // 必須
"-std=c++17"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": "build",
"detail": "compiler= /usr/bin/g++ std=c++-17"
},
...(他の設定のため中略)...
]
}
launch.json
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Runner: Debug Session",
"type": "cppdbg",
"request": "launch",
"args": [],
"stopAtEntry": false,
"log": true,
"cwd": "${fileDirname}",
"environment": [],
"program": "${fileDirname}/${fileBasenameNoExtension}",
"internalConsoleOptions": "openOnSessionStart",
"MIMode": "gdb",
"preLaunchTask": "C/C++: g++ アクティブなファイルのビルド",
"miDebuggerPath": "/usr/bin/gdb",
"externalConsole": false
}
]
}
settings.json
なお、PATH
の~/.local/bin
はonline-judge-tools用
{
"terminal.integrated.defaultProfile.windows": "wsl",
"terminal.integrated.profiles.windows": {
"wsl":{
"path":["C:\\Windows\\System32\\wsl.exe"]
}
},
"terminal.integrated.defaultProfile.linux": "bash",
"terminal.integrated.profiles.linux": {
"bash": {
"path":"/bin/bash",
"args":["-l"],
"env": {"PATH": "~/.local/bin:/bin:/usr/bin:/usr/local/bin" }
}
},
"files.associations": {
"iostream": "cpp",
"ostream": "cpp"
}
}
.bash_profile
-
.bashrc
を呼ぶのは、 VSCode上のターミナルで文字に色を付けて読みやすくするため。 -
settings.json
とは別に、改めてPATHが必要。 -
tasks.json
からのコマンド実行時にはsettings.json
に書いたPATH
を参照するようだが、bash
からは参照できないらしい。
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export PATH="$PATH:/home/$USER/.local/bin"
そのほか
競プロ用にonline-judge-tools
を導入しながら試行錯誤していたので、近いうちにそちら関連の備忘録も書きます。