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を導入しながら試行錯誤していたので、近いうちにそちら関連の備忘録も書きます。