VSCode + wslの競プロデバッグ環境メモ


おおよそ備忘録です.C++どころかコンピュータなんもわからん.おま環満載だと思います...

 

・ここに出てくるもののバージョン

VSCode: ver1.38.1

g++(windows) 8.2.0

gdb(windows) 7.6.1

g++(wsl) 8.1.0

gdb(wsl) 8.1.0

 

CLionで競プロをしていたのですが,あまりに入力時などのレスポンスが悪かったり,もりもりとメモリを食いつぶしていくので,VSCodeに乗り換えようとしたときのメモです.

 

VSCodeで単に出力したmain.exeを実行する分には,適当にg++ man.cpp -O2 ---std=gnu++1y -o main.exe とでもして実行すればいいですが,デバッグ環境となると結構面倒なことになりました.

 あとは,デバッグするときには"-g"と"-O0"とでもしておいて...と思っていたのですがうまく行かなくて...

 

というのも,VSCodeの下でgdbデバッグをすると,標準入出力ができないようです.

        {
            "name": "(gdb) launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/main.exe",
            "args": ,
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": ,
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": (๑•﹏•๑`)\\gdb.exe",
            "setupCommands": [
                {   
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        },

externalConsole:trueにすると,標準入出力が入るという記事はググってよく出てきたのですが,こちらの環境では再現できませんでした.困る.

stopAtEntryあたりもダメそうです.

困ったのでファイルから入力を送り込もうともしたのですが,"args"に書いてもうまく行かないっぽい?("<","hoge.in"とか)

一応stopAtEntry : true, externalConsole : falseだと入力できるのですが,最後に出力したあと即終了してしまって出力を確認できない問題がどうやっても解決しなかったので...

 

 

kamiyaowl.github.io

という記事を見つけ,codeLLDBを使え,とある.

これを使うと確かにintegrate terminalが使え,オプションとしてファイルからstdinが出来る.

        { "name": "(lldb) Launch with stdin(./main.in)",
              "type": "lldb""request": "launch",
              "program": "${fileDirname}/main.exe"
              "args": [], "cwd": "${fileDirname}"
              "terminal": "integrated"
              "stdio": ["${fileDirname}/main.in"nullnull],
        }

この環境だと,デバッグ中変数の中身が一切見れない問題が起こる.(普通は見れるらしいんだけど...)ブレークポイントは動くんだけど,ソースコード単位でステップ実行ができないっぽいところもあんまり合わなかった.

 

これもやはりググるSTLまわりの変数が見れないという記事が出ていて解決法が乗っているがそもそもなんの変数も見れなくて,試してみたけどだめでした.

 

どっちを使っても微妙なので苦い顔をしている.

しゃーないのでwslを使ったやつを試してみる.あおかびさんの

qiita.com

通りに入れてみる.このへんで

sudo apt install gdb

も叩いておくと良さそう.

あとは,launch.jsonとtasks.jsonで,下の記事を参考にペタっとさせていただく.

qiita.com

 

これでもやはり見えない変数がある.-gとかそこら辺は入ってるのに.ここからはひたすら1つずつそれっぽいものを試す作業を繰り返して,結局

コンパイル時に

"-D_GLIBCXX_DEBUG"

を刺すとすべてが解決しました.STLも見れるし見えない変数もない.

 "tasks":[
    {
        "label": "build",
        "type": "shell",
        "options": {
            "shell": {
                "executable": "C:\\Windows\\System32\\wsl.exe",
            }
        },
        "command": "g++",
        "args": [
            "-std=gnu++1y",
            "-g",
            "-D_GLIBCXX_DEBUG",
            "-O",
            "-I/opt/boost/gcc/include",
            "-L/opt/boost/gcc/lib",
            "-o",
            "`wslpath",
            "'${workspaceFolder}\\main'`",
            "`wslpath",
            "'${file}'`",
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
    },
    
    ]

ぐらいをつけておけば良かったです.長かった.

 

現状ではCode-Runner(拡張機能)で,これを呼び出すことで,

(hoge.sh)

while true
do
    echo "-------------------------"
    ./main
done

F5を押すとmainを連続実行する,テストケース連続確認などに使えて

F6を押すと上のデバッグ用のオプションのついたコンパイル+デバッグ実行をする,といった環境が作れました.

f:id:lilies_lit:20191008090241p:plain

(Xが見えないのは後にもう出てこないのでおそらく問題ない挙動だと思います...)