Visual Studio Code(VSCode) で C++ のデバッグ時,STL コンテナの中身が上手く表示されなかったのでそれを解決しました(英語で検索する方が多いと思うのでタイトルだけ英語にしました,記事は英語で書けません...).
注意点
- 表示できるようにしただけで,なぜ表示されないなどの仕組みを書いたわけでは無いのでご注意ください.
- macOS の方が対象です(他の OS での挙動は分かりません,ごめんなさい).ただし,参考にした GitHub の issue などは見る価値があるかもしれません.
- ただの覚書なのでかなり雑な記事になっていることをお許しください(VSCodeが初めての方だと読みづらい記事かもしれません).
- 解決方法の一つを提示するものであって,必ずしも他の方の環境で解決できるとは限りません.
環境
- macOS Mojave 10.14.2
- Visual Studio Code 1.31.1
- Debugger: LLDB-1000.0.38.2
解決方法
VSCode で C++ のデバッグ環境をやっと作れたと思ったら,std::vector の中身が見れず苦しんでいました.
VSCode のデバッガ,最適化の程度を緩くしたら変数の中身は見れるようになったのだ.けども,コンテナクラス,例えばstd::vectorが size=0 で表示される謎.
— ますぬこ (@mathnuko) 2019年2月24日
(迷走してました...)STLのコンテナ(td::vector, std::map etc..)が上手くデバッグで表示できなかったので結局CLionに戻る.issue 見てごにょごにょやってたけど結局上手くいかなかった.無念...
— ますぬこ (@mathnuko) 2019年2月24日
以下の赤枠内のように,std::vector の変数 vec
のサイズが 3 のはずですが,size=0
と表示されています.
ターミナルから直接 lldb を使ってデバッグした場合には変数の中身が見れているため(以下の画像参照),シンボリック・デバッグ情報 a.out.dSYM
はちゃんと生成できていました.そのため,問題は VSCode 側にあると思い調べていました.
解決方法が以下の issue に載っていました.他にも STL コンテナクラス(std::vector など)の中身が表示されずに困っていた方がいました.
解決方法は,
だけです(C/C++
という拡張のデバッグツールで上手く表示できない方はぜひ試してみてください).
launch.json
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [{ "name": "Launch", "type": "lldb", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", }] }
設定を launch.json
に書き加えたら,デバッグの設定を以下のように Launch
(上記のファイルの "name": "Launch"
で設定した名前を選択) に変更します(エディターの左上部分で選択できます).
あとはデバッグをスタートするだけです.以下のように std::vector の中身がちゃんと見れるようになりました.
補足
コンパイルの最適化オプション
コンパイルの最適化の度合いを上げるとデバッグ時に変数の中身が見えなくなる可能性があります.そのときは,コンパイル時の -O0
,-01
などの最適化オプションを外す(または低くする)と変数の中身を見えるようになることがあるので試してみてください.
デバッグに標準入力を渡す方法
stack overflow での以下の質問を参照.
デバッグ設定ファイル launch.json
に以下を追記してください.
"terminal": "external"
これでデバッグを開始すると,VSCode の外部でターミナルが起動し,競プロの問題などの任意の入力を与えることができるようになります.最終的な launch.json
は以下の通り.
{ "version": "0.2.0", "configurations": [{ "name": "Launch", "type": "lldb", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "cwd": "${fileDirname}", "terminal": "external", "preLaunchTask": "build debug", }
終わりに
この環境を整えるために無限に時間を溶かしていました.やっと VSCode で競プロできるぞーーー.