LLDBでデバッグする

前回までのセットアップで、Visual Studio CodeでCのソースコードがビルドできるようになった。さらに便利な状況にセットアップできるのだが、まずは先に基本的な機能をすべて整えてしまそう。次はVisual Studio CodeでLLDBを使ったデバッグができるように設定する。

LLDBはLLVMプロジェクトの一環として開発されているデバッガだ。CコンパイラとしてLLVM/Clangを使う際に、デバッガとしてLLDBを使うというのは相性がよい。複数のプラットフォームで動作し、Visual Studio Codeから使えることはもちろん、CUIコマンドで使うこともできる。

Visual Studio CodeでLLDBを使う方法はいくつかあるが、最も簡単なのは「CodeLLDB」と呼ばれるVisual Studio Codeのエクステンションを使う方法だ。LLVMパッケージでインストールされるlldbコマンドを使えるようにするのは手間がかかるので、ここでは、CodeLLDBエクステンションに含まれているlldbを使う方法を取り上げておこう。

Pythonをインストール

CodeLLDBを使うにはPythonが必要になるので、まずPythonのインストールを行う。Windows版のPythonは、次のページからダウンロードできる。

ダウンロードページの上部に「Latest Python Release」といったリンクがあるので、ここで最新のリリース版を調べ、そのバージョンをインストールする。ほとんどの場合「Windows installer (64-bit)」をダウンロードすればよい。

  • Python Releases for Windows|Python.org

    Python Releases for Windows | Python.org

ダウンロードしたインストーラを実行する時は、インストーラの最初の画面で、次のように「Add Python 3.9 to PATH」のチェックを入れるのを忘れないようにする。

  • PATHに追加するためのチェックを入れてからインストールを実施

    PATHに追加するためのチェックを入れてからインストールを実施

  • インストール完了

    インストール完了

PATHに追加するチェックを忘れた場合は、いったんアンインストールしてからもう一度インストールするか、インストール後に手動で環境変数PATHを編集してPythonのパスを追加する。手間なので、忘れた場合はアンインストールしてからチェックを入れてインストールしたほうがラクだろう。

CodeLLDBエクステンションをインストール

Pythonをインストールしたら、Visual Studio Codeで「CodeLLDBエクステンション」をインストールする。Visual Studio Codeの左端になるエクステンションのアイコンをクリックし、エクステンションとして「CodeLLDB」を検索、表示されるリストからCodeLLDBを選択し、「Install」ボタンをクリックする。

  • CodeLLDBエクステンションをインストール

    CodeLLDBエクステンションをインストール

CodeLLDBのインストールで、特に手間取ることはないはずだ。

設定ファイルの作成と更新

続いて、デバッガとしてLLDBが機能するように設定ファイルを作成する。デバッガを起動するショートカットキーは「F5」だ。このキーはよく使うので覚えてしまおう。何も設定していない状態で「F5」を押すと、次のように設定が行われていないことを示すダイアログが表示される。このダイアログの「OK」ボタンを押す。

  • 「F5」→「OK」

    「F5」→「OK」

すると、次のような内容でlaunch.jsonという設定ファイルが作成される。

  • 作成されたlaunch.jsonファイル

    作成されたlaunch.jsonファイル

このファイルの内容を次のように書き換える。ファイルの保存は「Ctrl」+「S」だ。

編集後のlaunch.jsonファイル

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
            "args": [],
            "cwd": "${workspaceFolder}"
        }
    ]
}
  • launch.jsonファイルを編集して「Ctrl」+「S」で保存

    launch.jsonファイルを編集して「Ctrl」+「S」で保存

次に、先日作成したビルド用の設定ファイルであるtasks.jsonファイルも書き換える。現状は次のようになっているはずだ。

  • 作成したtasks.jsonファイル

    作成したtasks.jsonファイル

このファイルを次のように書き換える。

編集後のtasks.jsonファイル

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Clang",
            "type": "process",
            "command": "clang.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe"
            ],
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
  • tasks.jsonファイルを編集して「Ctrl」+「S」で保存

    tasks.jsonファイルを編集して「Ctrl」+「S」で保存

前回は、MicrosoftのCコンパイラとの互換性を考慮したclang-clを指定していたが、これを本来のclangへ変更したほか、デバッグ用のバイナリを生成するように-gオプションを追加してある。デバッガを使うには、デバッガ用にバイナリを生成する必要があるのだ。これでデバッガを使う準備は完了だ。

LLDBデバッガの動作を確認する

hello.cファイルをビルドしてデバッガの動作を確認しよう。まず、新しい設定でhello.cをビルドする(「Ctrl」+「Shift」+「B」)。

ビルドしたら、hello.cの6行目にブレークポイントを設定する。行番号の左側をクリックするとブレークポイントが設定される。

  • hello.cにブレークポイントを設定

    hello.cにブレークポイントを設定

この状態で、「F5」を押してデバッグを開始する。

  • 「F5」でデバッグ開始

    「F5」でデバッグ開始

次のように、設定したブレークポイントで動作が一時停止すればLLDBは動作している。

  • ブレークポイントで動作が止まるかどうか確認

    ブレークポイントで動作が止まるかどうか確認

ステップを実行すると、次のようにコードを追っていくことを確認できる。

  • ステップ実行中

    ステップ実行中

  • ステップ実行中

    ステップ実行中

ブレークポイントを設定したにもかかわらず、ブレークポイントで動作が停止しない場合は、Pythonがインストールされていないか、またはPythonがインストールされていてもPATHに追加されていない可能性がある。Pythonがインストールされていて、かつ、PATHに追加されているかを確認しよう。

デバッガが使えるととにかく便利

デバッガはC/C++開発を行う上で強力なツールとして機能してくれる。簡単なデバッグであれば使わなくてもいいかもしれないが、入り組んでくるとデバッガの活用は欠かせない。ClangとLLDBは組み合わせとしては比較的モダンだ。多くのプラットフォームで使えるし、開発も活発に進められている。ぜひツールとして使いこなしていきたいところである。

参考