Skip to content

Latest commit

 

History

History
109 lines (74 loc) · 5.66 KB

debug-using-vscode.md

File metadata and controls

109 lines (74 loc) · 5.66 KB

VS Code で C/C++ プロジェクトをデバッグする

事前準備

VS Code 左端のバー(アクティビティバー)から四角が 4 つ並んだ拡張機能のボタンを選び、検索バーに「C++」と入力する。そこで出てくる「C/C++ Extension Pack」をインストール。

デバッグ設定

macOS で gdb を使用するのはかなり面倒なので、lldb の利用を推奨。基本的なコマンド体系は gdb と同じなので安心して良い。

  1. ソースコードがあるフォルダを VS Code で開く。

  2. VS Code のアクティビティバー(左端の縦のバー)から「実行とデバッグ」を選択し、「launch.json ファイルを作成します」をクリック。メニューが出てくるのでどれかを選択(Chrome などいろいろなものがあるが、どれを選んでも良い。何も聞かれずにいきなり launch.json が作られる場合もある)。

  3. .vscode/launch.json というファイルができているので、これを例えば以下のように編集する(program は各自のインストール先に置き換える)。

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "C/C++: debug",
          "type": "cppdbg",
          "request": "launch",
          "program": "/home/denjo/gnuplot_install/bin/gnuplot", // ビルドしたバイナリへの絶対パス
          "args": ["a.gnuplot"],          // 実行時引数
          "stopAtEntry": true,            // 実行後すぐに一旦止める
          "cwd": "${workspaceFolder}",    // 実行時の作業ディレクトリ
          "MIMode": "gdb"                 // 利用するデバッガ。macOS の場合は lldb 推奨
        }
      ]
    }

補足 : ファイルのパスについて

gnuplot の場合、引数としてファイル名(ここでは a.gnuplot)を渡すことでそのファイルを読み込むことができる。この時ファイルは相対パスとみなされ、コマンドが実行されたときの作業ディレクトリ(ターミナルなら pwd で出てくるディレクトリ)を基準に解釈される。VS Code でデバッグする場合、作業ディレクトリは launch.jsoncwd で指定する。上の例では ${workspaceFolder}、すなわち VS Code で開いているディレクトリが基準になるので、そのディレクトリの直下に a.gnuplot を置けば良い。

デバッグ

  1. アクティビティバーの「実行とデバッグ」を選択し、実行ボタン(三角)を押す

  2. エディタがデバッグモードに切り替わり、上部に以下のような操作バーが出てくる。左から

    • 続行(gdb での c
    • ステップオーバー(gdb での n
    • ステップイン(gdb での s
    • ステップアウト(gdb での fin
    • 再起動(gdb での r
    • 停止(gdb での exit

    である。

    debug-bar.png

変数の表示

エディタ上で変数にマウスをホバーさせれば変数の中身が表示される。また、デバッグを開始すると開く「デバッグコンソール」に変数や式を入力するとその値を表示できる。特定の式や値の変化を監視したい場合、サイドバーの「ウォッチ式」に入力すると良い。

ポインタを配列として表示したい場合、入力すべき式は利用しているデバッガによって異なる。

例 : int* である array を長さ 10 の int の配列として表示したい場合

  • gdb : *array@10
  • lldb : *(int(*)[10])array

ブレークポイントの設置

エディタ上で行番号の左側をクリックするとその行にブレークポイントが設置できる。ブレークポイントの一覧はサイドバーにある。

行番号の左側を右クリックすると、特定の条件が満たされたときのみ止まる条件付きブレークポイントや、停止せずにログ出力を行うログポイントを設置できる。

標準入力を扱う

上記の設定ではプログラム実行中に標準入力を渡すことができない。必要な場合には以下の行を launch.json に追加する。この設定をするとターミナルアプリが起動し、そちらから入力できるようになる。

{
  "version": "0.2.0",
  "configurations": [
    {
      ...,
      "externalConsole": true    // この行を追加
    }
  ]
}

デバッガのその他の機能を使う

デバッガ(gdb, lldb)のその他のコマンドを使いたい場合は、デバッグコンソールで -exec に続けて入力すれば良い。

その他の機能

検索

いわゆる検索(grep)は以下の方法でできる。

  • Ctrl/Cmd + Shift + F : ワークスペース全体で検索
  • Ctrl/Cmd + F : 今開いているファイル内で検索

この場合コメント内のキーワード等も検索に引っかかるので、関数等を検索したい場合は次の方法を使う。

シンボル検索

プログラム中に定義されているシンボル(変数、関数など)を検索したい場合は以下の方法でできる。

  • Ctrl/Cmd + T : ワークスペース全体で検索
  • Ctrl/Cmd + Shift + T : 今開いているファイル内で検索

定義元・参照先ジャンプ

「3.18 etags コマンド + find-tag で定義へ飛ぶ」に相当。エディタ内に表示されている変数や関数の定義元・参照先を知りたい場合は、単に右クリックして対応するメニューを選べば良い。