pyてよn日記

一寸先は闇が人生

How to display local valiables of STL container classes when debugging C++ with LLDB on Visual Studio Code(macOS)

Visual Studio Code(VSCode) で C++デバッグ時,STL コンテナの中身が上手く表示されなかったのでそれを解決しました(英語で検索する方が多いと思うのでタイトルだけ英語にしました,記事は英語で書けません...).

注意点

  • 表示できるようにしただけで,なぜ表示されないなどの仕組みを書いたわけでは無いのでご注意ください.
  • macOS の方が対象です(他の OS での挙動は分かりません,ごめんなさい).ただし,参考にした GitHub の issue などは見る価値があるかもしれません.
  • ただの覚書なのでかなり雑な記事になっていることをお許しください(VSCodeが初めての方だと読みづらい記事かもしれません).
  • 解決方法の一つを提示するものであって,必ずしも他の方の環境で解決できるとは限りません.

環境

解決方法

VSCodeC++デバッグ環境をやっと作れたと思ったら,std::vector の中身が見れず苦しんでいました.

(迷走してました...)

以下の赤枠内のように,std::vector の変数 vec のサイズが 3 のはずですが,size=0 と表示されています.

f:id:pytwbf201830:20190225183940p:plain

ターミナルから直接 lldb を使ってデバッグした場合には変数の中身が見れているため(以下の画像参照),シンボリック・デバッグ情報 a.out.dSYMはちゃんと生成できていました.そのため,問題は VSCode 側にあると思い調べていました.

f:id:pytwbf201830:20190225184250p:plain

解決方法が以下の issue に載っていました.他にも STL コンテナクラス(std::vector など)の中身が表示されずに困っていた方がいました.

github.com

解決方法は,

  • VSCodeCodeLLDB という拡張をインストール
  • 後述の設定を launch.json に加える

だけです(C/C++ という拡張のデバッグツールで上手く表示できない方はぜひ試してみてください).

f:id:pytwbf201830:20190225184325p:plain

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" で設定した名前を選択) に変更します(エディターの左上部分で選択できます).

f:id:pytwbf201830:20190225185026p:plain

あとはデバッグをスタートするだけです.以下のように std::vector の中身がちゃんと見れるようになりました.

f:id:pytwbf201830:20190225185233p:plain

補足

コンパイルの最適化オプション

コンパイルの最適化の度合いを上げるとデバッグ時に変数の中身が見えなくなる可能性があります.そのときは,コンパイル時の -O0-01 などの最適化オプションを外す(または低くする)と変数の中身を見えるようになることがあるので試してみてください.

デバッグに標準入力を渡す方法

stack overflow での以下の質問を参照.

stackoverflow.com

デバッグ設定ファイル 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 で競プロできるぞーーー.