DockerでNimを動かしてデバックするやり方

DockerでNimを動かしてデバックするやり方


# docker # nim

Pythonライクな構文でC言語に迫る速度を出せると巷で話題になり続けているNimに入門しました。

何かと使えると便利なDocker環境でNimをいい感じに動かせるようにしました。

カッコを付けずに速度が出せる言語を学びたかった私にはうってつけです。

やりたかったこと

  • Nimの公式Dockerイメージを使ってNimを動かす
  • ブレークポイントを貼って簡単にデバッグ出来るようにする

やったこと

Nimの公式Dockerイメージには、gcc、gdbが入っていないのでインストール

apt update && apt install -y gcc gdb

必要なVS codeのエクステンションをインストール

  1. Remote - Containers (ms-vscode-remote.remote-containers)

  2. Remote Development (ms-vscode-remote.vscode-remote-extensionpack)

設定ファイルの作成

全体のディレクトリ構成はこんな感じです。

root │ docker-compose.yml │ Dockerfile │ ├─.devcontainer │ devcontainer.json │ docker-compose.yml │ ├─.vscode │ launch.json │ tasks.json │ └─app hello.nim

.devcontainer/devcontainer.jsonはこんな感じに最後のextensionsの部分に使いたいエクステンションをしています。

// If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml. { “name”: “Existing Docker Compose (Extend)”, “dockerComposeFile”: [ “..\\docker-compose.yml”, “docker-compose.yml” ], “service”: “nim”, “workspaceFolder”: “/workspace”, “settings”: { “terminal.integrated.shell.linux”: null }, // Add the IDs of extensions you want installed when the container is created in the array below. “extensions”: [ “kosz78.nim”, “ms-vscode.cpptools” ] }

これしなくてもGUIで手動追加することは出来ますが、面倒なのでいつも使うやつは設定するのが吉です。 (なお、Extension name ではなく、identifierの方を指定する必要があるので注意です。地味に詰まりました…)

.devcontainer/docker-compose.ymlはデフォルトから変更していません。 デバッグ環境のみで使いたいデータなどなどがあれば、ここで設定するのが良いようです。

.vscode/launch.jsonにはデバッグの関連の設定を行います。

{ “version”: “0.2.0”, “configurations”: [ { “name”: “(gdb) Launch”, “type”: “cppdbg”, “request”: “launch”, “program”: ”${fileDirname}/${fileBasenameNoExtension}”, “args”: [], “preLaunchTask”: “nimbuild”, “stopAtEntry”: false, “cwd”: ”${fileDirname}”, “environment”: [], “miDebuggerPath”: “/usr/bin/gdb”, “externalConsole”: false, “setupCommands”: [{ “description”: “Enable pretty-printing for gdb”, “text”: “-enable-pretty-printing”, “ignoreFailures”: true }],
}] }

${fileDirname}はディレクトリに置き換わり、 ${fileBasenameNoExtension}は拡張しなしのファイル名に置き換わります。VSCodeイケてるな。

preLaunchTaskにはデバッグ実行前に行う処理を記載出来ます。 今回の場合はNimファイルのbuildですね。

細かい設定は勉強中です…。

.vscode/tasks.jsonにはNimのビルドの設定を記載します。 —debugger:nativeを付けてビルドすると、gdbでのデバッグが出来るとのことです。

{ “version”: “2.0.0”, “tasks”: [{ “label”: “nimbuild”, “type”: “shell”, “command”: “nim”, “args”: [“c”, “—debugger:native”, ”${file}”] }] }

という感じで設定をしたら、後はデバッグしたいファイルを開いてF5を押してあげましょう!!

ソース

Dockerfileを含むソースはGitHubに上げているので、良かったら使って見て下さい。

https://github.com/tkkm/nim-docker-debug

 

C言語にトランスパイルするのがNim言語の特徴なので、C系の言語の設定の勘所があると非常に環境構築は楽だと思うのですが、Python + PyCharmから入った人間には悩むところが多かったですがとりあえず遊べる環境は整えられました。

にむにむするぞ☆