コードをデバッグする

Deno は V8 インスペクタープロトコルをサポートしています。

Deno のプログラムは Chrome Devtools やこのプロトコルをサポートしているクライアント(VSCode など)を使ってデバッグできます。

デバッグ機能が有効化するには --inspect フラグや --inspect-brk フラグをつけて Deno を実行します。

--inspect フラグは任意の時点でデバッガーをアタッチできます。--inspect-brk はデバッガーがアタッチするのを待って、コードの最初の行で実行を一時停止します。

Chrome Devtools

Chrome Devtools を使ってプログラムをデバッグしてみましょう。std から静的ファイルサーバーの file_server.ts を使うことにします。

--inspect-brk フラグを使って最初の行で実行を停止します。

$ deno run --inspect-brk --allow-read --allow-net https://deno.land/std@$STD_VERSION/http/file_server.ts
Debugger listening on ws://127.0.0.1:9229/ws/1e82c406-85a9-44ab-86b6-7341583480b1
Download https://deno.land/std@$STD_VERSION/http/file_server.ts
Compile https://deno.land/std@$STD_VERSION/http/file_server.ts
...

chrome://inspect を開いて Target の隣の Inspect をクリックします。

chrome://inspect

Devtools を開いてからすべてのモジュールを読み込むまで数秒かかるかもしれません。

Devtools opened

Devtools が file_server.ts でなく _constants.ts の最初の行で実行を停止したことにお気づきかもしれません。 これは期待された挙動で、ES モジュールが V8 に評価される仕組みにより起きます(_constants.tsfile_server.ts の依存関係の最も左下にあるため最初に評価されるからです)。

この時点ですべてのソースコードが Devtools 内で利用可能になります。file_server.ts を開いてブレークポイントをそこに追加しましょう。「Sources」ペインを開いてツリーを開きます。

Open file_server.ts

よく見ると各ファイルに2つの表示があることがわかります。一つは通常の字体で、もう一つはイタリック体です。前者はコンパイル済みのソースファイル(.ts ファイルの場合には JavaScript ソースが送信されます)で、後者はファイルのソースマップです。

次に、listenAndServe メソッドの中にブレークポイントを置きます。

Break in file_server.ts

ブレークポイントを置くとただちに Devtools が自動的にソースマップファイルを開き、型を含む実際のソースコードを見て回ることができるようになります。

これでブレークポイントを設置したので、スクリプトの実行を再開してリクエストを観察できます。 Resume script execution ボタンを押してください。二度押す必要があるかもしれません!

スクリプトの実行を再開したら、リクエストを送って Devtools で確認してみましょう。

$ curl http://0.0.0.0:4500/

Break in request handling

これでリクエストの中身を確認できます。ステップごとにコードをデバッグできるようになりました。

VSCode

Deno は VSCode を使ったデバッグができます。

プラグインによる公式サポートは作業中です。 - https://github.com/denoland/vscode_deno/issues/12

現在は手動で launch.json という設定ファイルを手動で置くことでデバッガーをアタッチできます。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Deno",
      "type": "pwa-node",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "runtimeExecutable": "deno",
      "runtimeArgs": ["run", "--inspect-brk", "-A", "${file}"],
      "attachSimplePort": 9229
    }
  ]
}

注意: これにはエントリーポイントとして開くファイルが必要です。エントリーポイントを固定したい場合は ${file} をスクリプト名に書き換えてください。

ローカルのソースファイルをデバッグしてみましょう。server.ts を以下のように作成します。

import { serve } from "https://deno.land/std@$STD_VERSION/http/server.ts";
const server = serve({ port: 8000 });
console.log("http://localhost:8000/");

for await (const req of server) {
  req.respond({ body: "Hello World\n" });
}

これでブレークポイントを置けるようになりました。作成済みの設定を実行してください。

VSCode debugger

JetBrains IDEs

You can debug Deno using your JetBrains IDE by right-clicking the file you want to debug and selecting the Debug 'Deno: <file name>' option. This will create a run/debug configuration with no permission flags set. To configure these flags edit the run/debug configuration and modify the Arguments field with the required flags.

Other

Any client that implements the Devtools protocol should be able to connect to a Deno process.

Limitations

Devtools support is still immature. There is some functionality that is known to be missing or buggy:

  • autocomplete in Devtools' console causes the Deno process to exit
  • profiling and memory dumps might not work correctly