VSCodeでNimのデバックを試してみた
今週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.json
とtasks.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フォルダに変更しています。
デバックしか使わないので、そうしています。
{
"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フォルダが作成され、拡張子ilk
とpdb
ファイルが作成されます。
※実行ファイルは、拡張子無しになりますが、まあ、デバッグだけしか使わないので、現状保留です。
上記サンプルプログラムを作成し、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