VS Code で簡単なNode.jsプログラムを書いてデバッグ実行すると、例外が発生してプログラムが異常終了したときにデバッグコンソールにスタックトレースが表示されず、何が起こっているのかわからないということが起こります。
スタックトレースの表示方法はググればすぐに出てくるかなと思ったのですが、意外にも日本語・英語どちらもバチっと解決できる情報にすぐに辿り着かなかったので、今回はこれの対処方法をご紹介します。
事象
”利用可能なデバッガーがありません。’variables’を送信できません”というメッセージが表示され、スタックトレースが表示されない事象です。

日本語の情報から検索してもなかなか解決できる情報に行きつかず、ためにしにVSCodeを英語モードで実行し、英語のメッセージを表示させてググってみました。

ようやくいくつかそれっぽい情報が検索できましたが、有効な情報は2つで、かつ明確に欲しかった情報として1つありました。
2つの解決案
launch.jsonでコンソール設定を追加する
まず最初にヒットした情報をご紹介します。
VSCodeの環境設定ファイルである”launch.json”で統合ターミナルを使用する方法が記載されていました。

ここで紹介されている設定を行うと、デバッグコンソールではなく、ターミナルウィンドウにエラーの詳細情報が表示されます。
launch.jsonファイルを作成し、”configurations”要素に”console”を追加し、”integratedTerminal”を指定します。

この状態でデバッグを実行すると、ターミナルウィンドウに例外発生時の情報と関連するスタックトレースが表示されます。

これでも確かにスタックトレースが表示されて、やりたいこと(どこで発生したエラーなのか、どのルートで発生したのかを知る)は達成できるのですが、デバッグコンソール上の表示は変わらずで、何か釈然としなかったのでもう少し調査したところ、Microsoftのサイトでとても良いTipsが紹介されていました。
Uncought Exceptionが発生した箇所をBreakpointとして設定する
VSCodeにはこの設定ができるオプションが用意されており、MicrosoftのNode.jsのビギナーシリーズで紹介されていました。

初期の状態ではこのオプションは選択できないので、デバッグ実行前に少し事前準備が必要なので、そこからご紹介します。
プログラムをまっさらの状態から書いて、初めてデバッグ実行アイコンをクリックしたとき、以下のような画面になると思います。

このとき、手っ取り早いのは、「create a launch.json file」をクリックして、ファイルを自動作成します。
「Select environment」で”Node.js”を選択します。

以下のファイルが自動的に生成されますが、これはそのままでよく、「BREAKPOINTS」という領域の「Uncaught Exceptions」にチェックを入れます。

この状態でデバッグを実行すると、例外が発生した箇所でデバッガーがプログラムを停止させ、発生した例外のスタックトレースもとてもわかりやすく表示されます。
デバッガーは終了せず実行中の状態なので、このままデバッグを開始することができるというのがなんとも素晴らしい。

”利用可能なデバッガーがありません。’variables’ を送信できません”というメッセージはそもそも何か
そもそもこのメッセージが表示される理由はなんなのかというと、このメッセージが表示されたということは、デバッガー上で実行したプログラムが終了し(正常終了・異常終了にかかわらず)、デバッガーも終了した状態なので、VSCodeが連携できるデバッガーのプロセスを見つけることができなかったことを示しているだけです。
よって、このメッセージから読み取れるのは、VSCodeが「おい、デバッガー君がいねーよ」と文句言っているだけですので、あまり気にしなくても良いというのが私の理解です。
ログメッセージというのは、開発者が作成しているため、往々にして利用者には分かりづらいメッセージになる場合があります。 その理由の1つは、アプリケーションというのは複数のプログラムから構成されており、それぞれ異なる開発者が作成しているということも関係していると思われます。 各プログラムは他のプログラムと密接に連携して動作しており、あるプログラムが他のプログラムに対して期待する連携ができなかった場合、メッセージを出力する責務があるのは要求元のプログラムです。 なぜプログラムが正常に機能しなかったのかをメッセージとして出すためには、「要求先のプログラムから期待した結果が返ってこなかったので正しく動作しなかった」というメッセージを出すのが、一番合理的な場合があります。 連携先プログラムから期待した結果が返ってこなかったという事実だけがあり、その理由や原因がわからないため、このようなメッセージしか出しようがないというのが正直なところでしょう。 SIerの世界では、このようなメッセージの内容もアプリケーションの品質として捉えられ、分かりづらいメッセージ=「品質が低い」と評価されることがあるため、メッセージ自体にもかなり気を使ってシステム開発をおこなっていますが、万人にわかりやすいメッセージを考えるというのは本当に難しいですね。。
まとめ
Node.jsを勉強しつつ、開発ツールについても少しずつ慣れていこうとしている中で、さまざまな問題にぶつかっています。その都度今回のように疑問に思ったことはできるだけ自分が納得できる回答が得られるまで調べるようにしています。
調べればそれだけ自分の血肉となり、今後プログラムを作成するときにもより効率的に作ることができるようになると思うので、皆さんもそこは是非突っ込んで調べるようにすることをお薦めします。
コメント