7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WSL & VSCode な環境でGDB環境構築(自分のはまった箇所)

Last updated at Posted at 2021-12-29

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.jsonstopAtEntrytrueにしていたため。

  • ところでサイトによってはstopAtEntrystopOnEntryとも書かれている。謎。

  • coutの出力が表示されない。

  • ただの勘違い。

  • デバッグを開始するとVSCodeのターミナルのうち、デバッグコンソール にいろいろ表示されてしまうので勘違いしていたが、実際は ターミナルのタブに出力されていた。

  • main()関数の終了時に 'libstdc-start.c'が開けません。というエラーが表示されてしまう。

  • main関数を抜けた後の部分のソースコードがないために表示される。無視するしかないらしい。

  • 参考サイト: https://knuth256.com/2021/02/22/hello-world/#toc4

  • でもポップアップは邪魔。

  • WindowsのエクスプローラからCodeで開くを実行しても、自動ではRemote-WSLになってくれない。1

  • Windows版のターミナルとしてwsl.exeを設定しておく。

  • これにより、code .のコマンド一つでRemote-WSL状態のVSCodeウィンドウを開くことができる。

  • ~/.bash_profileではなく、settings.jsonenvにも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

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用に設定しているため、デフォルト設定にはしていない。
tasks.json
{
  "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

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用

settings.json
{
  "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からは参照できないらしい。
/home/$USER/.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
export PATH="$PATH:/home/$USER/.local/bin"

そのほか

競プロ用にonline-judge-toolsを導入しながら試行錯誤していたので、近いうちにそちら関連の備忘録も書きます。

  1. .code_workspaceファイルにremoteAuthorityを設定すれば自動でRemote-WSL状態になるという記事もあるが、うまく行かなかった。

  2. 例えばsettings.jsonで設定したはずの~/.local/binが消えて、~/.bash_rcで設定した/home/$USER/.local/binが含まれている。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?