ちょっと話題の記事

VSCodeを使用してroot権限でデバッグ実行する

デバッグ実行するアプリをsudoで実行したい場合、**user-data-dir**オプションが必要です。
2018.07.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

VSCodeを使用したNode.jsのデバッグは、非常に快適です。ブレークボイントを置いたり、スタックや変数を確認しながらトレース実行できるのは、一回使い出したらやめられないでしょう。

しかし、あるニーズがあって、DNSプロキシーを書いていて、ちょっと詰まったのでメモです。

2 バインドエラー

最初に、下記のような、単純なUDPをListenするプログラムを書いて実行したのですが、bindに失敗していました。

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('listening', () => {
  console.log('start listening.');
});

server.on('message', (buf, rinfo) => {
  console.log(`>recv from${rinfo.address}:${rinfo.port}`);
});

server.on('error', (err) => {
  console.log(`server error:\n${err.stack}`);
  server.close();
});

server.bind(53);

コマンドラインからsudoで実行するとエラーにはなりません。

$ sudo node index.js
start listening.

また、ポート番号をを1024以上に設定しても、ちゃんとバインドできるので、単純にパーミッションエラーです。

3 user-data-dir

デバッグ実行するアプリをsudoで実行しようとして、下記のようにVCodeを起動しても効果がありません。

$sudo code .

VSCodeをsudoで起動するには、user-data-dirオプションが必要です。

$ sudo code --user-data-dir='~/.vscode-root'

user-data-dirオプションを指定して起動し、Open Folderで作業フォルダを開きます。

この状態で、デバッグ実行すると、ポート53のバインドが成功しているのが分かります。

4 最後に

ここまで方法を紹介しておいてなんですが・・・そもそもVSCodeを特権で起動することは、色々リスクを伴うので決してお勧めできません。あくまで、どうしても必要な場合に留めるべきでしょう。

5 参考リンク


Command Line Interface (CLI)
i can't run as root though i specify an alternate user data directory with the --user-data-dir argument