LoginSignup
5
6

More than 5 years have passed since last update.

node.jsの中身を読む話と、debuggerが便利な話

Last updated at Posted at 2015-04-05

ことの発端

  • 自作のgrunt pluginをgulpに移植しよーと頑張っていたら、突然requireで失敗するようになった。
  • (´・ω・`)
  • nodeのrequire実装を覗いてみないと、なにが起きてるのかわからなかった
  • ってわけで、調べよう

標準モジュールを読んでみる

  • エラーログで、nodeの中のmodule.jsというでエラーが出ている旨が書いてあるのだけれど、その実ファイルはどこにあるのか。
  • → このへんはコンパイル済なので、実行している実ファイルは追えない模様

でも、ソースコードは読めるよ!

1. githubで読む

2. ローカルで読む

  • nodebrew使ってる場合、.nodebrew/src/{バージョン}/node-{バージョン}/lib/というところにsrcも残っていた
  • おそらくビルド前のコードが残っているということかと
  • ここを編集しても、実際の実行に反映されたりはしない

3. もっと深く読む

debuggerをちゃんと使おう

ざんねんながら、上記手段では原因がよくわからなかったので、ちゃんと実行時の処理を追いながら調べることに。

node debug {スクリプト名}
とやると、スクリプトを逐次実行できる。
その後は、ちまちまコマンドを入力していくと、ハイライトする部分を変えたりしながら進められる。

  • n, next: 次の行へ
  • s, step: 現在の行の関数の中へ (step in)
  • c, cont: 実行再開(ブレークポイントまで一気に)

しかしめんどくさい → node-inspector

Chrome Developer ToolだのEclipseだのAndroid Studioだのに慣れている身としては、さすがにみづらい。
というわけでnode-inspector!!

1. インストールする

  • npm install -g node-inspector

2. デバッグしたいスクリプトを--debug-brk付きで実行

  • これで、node debugの時のように、いったん実行はストップ
  • サーバーが起動して、そこからstep inとかもろもろを撃ち込めるようになるっぽい
  • (そこはnode debugではないのか!)

3. node-inspectorを実行

  • node-inspector
  • 表示されるローカルホストのURLを覚えておく
  • 場合によっては--web-port={port}のオプションをつける (8080ポートが埋まっている場合など)

4. ブラウザでURLをひらく

  • そこには、Chrome Developer Toolにそっくりなデバッグ画面が!

顛末

  • node-inspectorで追ったら患部が分かった
  • requireができなかったのは、もともとのgrunt-pluginのpackage.jsonに、mainプロパティが指定されていなかったからでした
  • ちなみにmainがなくても、index.jsが置いてあれば大丈夫だった模様
  • このへんで判明 → https://github.com/joyent/node/blob/v0.10.26/lib/module.js#L113
  • ていうかglunt pluginって、grunt.loadNpmTaskを使うから、requireは使わないのか…

できたよ

参考資料

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6