🐥

VSCodeでNimのデバックを試してみた

2024/07/26に公開

今週7月24日に、VSCodeのNimツールが一新されました。VSCodeの拡張機能・LSP(Language Server Protocol)のnimlangserver・インストーラーのnimbleの3点が一気に更新され、補完機能やデバック機能がそこそこ使えるようになったので、記載していきます。

環境

私のPC環境はWindowsで動作させています。

  • OS: Windows11
  • Nim 2.0.8
  • vscode-nim 1.0.0 (VScode拡張機能)
  • nimlangserver 1.4.0
  • nimble 0.16.0
  • CodeLLDB 1.10.0 (VScode拡張機能)
  • LLVM 18.1.8

各ツールをインストール

1. vscode-nim 1.0.0のインストール

VSCodeを起動し、拡張機能を開きます。検索画面でnimと入力すると、nim-lang.orgが表示されると思いますので、それをインストールします。

2. nimlangserver 1.4.0のインストール

次に、補完機能のnimlangserverですが、nimlangserverで飛んだページの下位からダウンロード出来ます。
Windows環境であればnimlangserver-1.4.0-windows-i686.zipをダウンロードして解凍します。
解凍したnimlangserver.exeを、nimが存在するbinフォルダにコピーします。
※公式では、$HOME/.nimble/binにコピーとは記載されています。が、PATHが通っていれば、どっちでも良いのかも?

3. nimble 0.16.0のインストール

最後に、nimbleですが、既存のコマンドだと、VSCode起動時にエラーが表示されてしまうので、最新のnimbleコマンドに更新しましょう。
nimbleで飛んだページの下位にダウンロードファイルが存在します。
Windows環境であればnimble-windows_x64.tar.gzをダウンロードして解凍します。
解凍したnimble.exeを、nimが存在するbinフォルダにコピーします。

一応、補完機能については、これで十分です。次に、デバック機能を使えるようにするために、LLVMとCodeLLDBを入れましょう。
通常nimは、Windows環境であればmingw64のgccを使って、Cに変換されたソースをコンパイルしますが、gccだとnimのデバックが難しいらしく、clangでLLVMに変換し、デバックした方が容易みたいです。その為、以下のCodeLLDBとLLVMをインストールする必要があります。

4. CodeLLDB 1.10.0のインストール

VSCodeの拡張機能を開きます。検索画面でLLDBと入力すると、CodeLLDBが表示されると思いますので、それをインストールします。

5. LLVM 18.1.8のインストール

llvm.org(https://releases.llvm.org/)の公式ページに移動し、Windows環境であればLLVM-18.1.8-win64.exeをダウンロードします。
管理者用のコマンドプロンプト画面からLLVM-18.1.8-win64.exeを実行します。
インストーラーが起動し、「Add LLVM to the system PATH for current user」を選択し、実行します。
インストール先を指定し、実行しましょう。インストールが終了すれば、環境設定画面を開き、PATHを追加します。
設定が終われば、コマンドプロンプト画面を開き、clang -vを実行し、clang version 18.1.8と表示されるか確認します。

以上が、各種ツールのインストールになります。

VSCode側の設定について

1. VSCodeの設定処理

VSCodeを起動し、Ctrl+,で拡張機能からnim configurationを開きます。
LSP:PATHのところに、nimlangserver.exeが置かれているパスを指定しますが、nim/bin配下に置いているなら指定は要らないと思います。
※まあ、取り敢えず設定の必要は、余りないです。

2. VSCodeの各種設定ファイル

VSCode自体の設定については、私自身あまり詳しくありません。取り敢えず、vscode-nimの公式HPに記載されている手順で2つの設定ファイルを配置します。

まず、VSCodeを開き、プロジェクトフォルダ配下に、.vscodeフォルダを作成します。
.vscodeフォルダ内に以下のlaunch.jsontasks.jsonファイルを作成します。

.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
      {
          "type": "lldb",
          "request": "launch",
          "name": "nim: debug current file",
          "preLaunchTask": "nim: build current file (for debugging)",
          "program": "${workspaceFolder}/debug/${fileBasenameNoExtension}",
          "args": [],
          "cwd": "${workspaceFolder}",
      }
  ]
}

変更点は、launch.json設定ファイルの指定がbinフォルダになってましたが、debugフォルダに変更しています。
デバックしか使わないので、そうしています。

.vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
      {
          "label": "nim: build current file (for debugging)",
          "command": "nim",
          "args": [
              "compile",
              "--cc:clang",
              "-g",
              "--debugger:native",
              "-o:${workspaceRoot}/debug/${fileBasenameNoExtension}",
              "${relativeFile}"
          ],
          "options": {
              "cwd": "${workspaceRoot}"
          },
          "type": "shell",
      }
  ]
}

.vscode/tasks.json設定ファイルの変更点は、--cc:clangを追加した事です。デバック時のみclangでコンパイルし、ターミナルからのnimコマンド実行では、従来通りのmingw64のgccでコンパイルと実行が行えます。
また、tasks.json設定ファイルの指定がbinフォルダになってましたが、debugフォルダに変更しています。
デバック時しかLLVMは使わないので、そうしています。
${fileBasenameNoExtension}だと拡張子無し設定の実行ファイルが出来るのですが、windowsの実行ファイル形式への変更がわからないので放置です。
実際問題なく、デバックは動作します。

3. VSCodeからデバックを実行

下記のようなnimファイルを作成し、デバックを実行してみましょう。
echo cの行にブレイクポイントを設定し、メニュー/実行/デバックの開始、または、F5でデバックが実行されます。
デバック開始時に、自動でdebugフォルダが作成され、拡張子ilkpdbファイルが作成されます。
※実行ファイルは、拡張子無しになりますが、まあ、デバッグだけしか使わないので、現状保留です。

上記サンプルプログラムを作成し、F5を押すと、自動的に、clangでコンパイルを行い、デバック画面に切り替わります。

また、ウォッチ式は、Global変数項目を右クリックして、ウォッチに追加をすれば、ウォッチに追加されます。

4. デバックでの問題点

  • 変数については、変数__モジュール名みたい表示形式になってしまう。
  • F10で移動すると時々メモリーダンプが表示されて使えない。(ブレイクポイントを多数設置して、ジャンプで飛ぶぐらいなら出来ます)

5. nimコンソールの起動

後、謎の機能としてnimコンソールと言うのがあります。
VSCode上から、Ctrl+Shift+pを押して、「Nim: Run Selection/Line in Nim Terminal」を選択し、「nim Using nim secret command」を選択するとターミナル画面上に、Nimコンソールが起動します。

インタープリターのような動作をしますが、イマイチ使い勝手はよろしくない。

おわりに

vscode-nimのデバック機能については、まだまだ改善する部分は多々ありますが、一応はデバック時にブレイクポイントで止まるし、変数の値を見る事は可能になりました。
また、最新バージョンのnimbleコマンドについては、今後のNim2.2に取り込まれるそうです。

Discussion