Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NODE中的断点调试 #1

Open
johnnychq opened this issue Mar 11, 2017 · 0 comments
Open

NODE中的断点调试 #1

johnnychq opened this issue Mar 11, 2017 · 0 comments

Comments

@johnnychq
Copy link
Owner

johnnychq commented Mar 11, 2017

node如何断点调试?运行时?多进程时?

https://nodejs.org/api/debugger.html

请先阅读完上述官方调试章节的api文档。文档中主要介绍了两种启用方式

  • --debug 方式启用调试,命令行
  • --inspect 方式启用调试,界面化

方式一:debug

官方方案

方法:node --debug app.js

--debug是node提供的最基本方式,启动后会默认开启5858端口,然后就可以侦听该端口进行调试了。尝试访问下5858提供的侦听端口服务把:http://localhost:5858

之后,侦听该端口,进行调试,方式及工具很多,官方只提供了命令行方式,

  • node debug -p <pid>
  • node debug <URI>

备注:

node debug index.js 其实是两条命令的缩写

  • node --debug app.js // 假设其pid为10010
  • node debug -p 10010

这里不细讲,重点讲基于该端口的社区方案:

社区扩展

社区提供了很多其他选择,列下比较知名的两个:

这里重点介绍下node-inspector

安装很简单:npm install -g node-inspector

使用也非常简单:node-debug app.js

但,node-debug app.js其实包含了三个过程

  1. node-inspector 启动8080web服务,访问后是一个CHROME_DEV_TOOLS界面
  2. node --debug app.js这个是最基本、核心的,启用node的--debug模式,暴露默认5858端口。
  3. 访问http://127.0.0.1:8080/?port=5858即可进行调试,node-inspector会通过socket与5858建立长连接,进行调试。

总结一下前两者:

image

方式二:inspect

方法:node --inspect app.js

其实是把社区的方案直接内置到nodejs中了,不需要安装node-inspector即可以直接用Chrome DevTools进行可视化界面调试。

此方案直到nodejs v6.3才被node内部支持,具体纳入过程可以参见:https://nodesource.com/blog/the-10-key-features-in-node-js-v6-lts-boron-after-you-upgrade

纳入后的调用及部署变得简单,对比如下:

image

通过IDE进行debug

debug原理就是上述两种,一些IDE如Webstorm的内置的debug调试也是基于上述原理,采用方式一进行, 只要配置好启动/入口JS文件即可:

image

Webstorm有两个button, 分别为启动和调试

  • 启动:用配置的 node 启动/入口JS
  • 调试:额外加上调试参数 node 启动/入口JS --debug-brk=55077 --expose_debug_as=v8debug

由于IDE的高度集成,使得调试体验非常好:

image

关于运行时调试

已经启动的服务器不想停掉,有办法进行调试吗?

image

关于多进程

--inspect方式不会有问题(缺点不提了),因为会对每个进程单独开启一个debug链接,但传统--debug就麻烦了。


只有一条:请尽可能降维为单进程后再调试。当然,多进程Debug是有方法的,只不过比较麻烦,可以参见:

https://strongloop.com/strongblog/whats-new-nodejs-v0-12-debugging-clusters/

另外,针对eggjs,如何进行调试呢?因为即使开发模式,egg也会启动主进程、worker进程及agent 3个进程。比较简单,找出woker进程的pid,运行时设置为--debug模式。其他多进程也可以按照这种方式手动设置后debug。

ps -ef | grep app_worker.js // 找到pid
kill -s USR1 [pid]

然后便可以开启node-inspector,在浏览器中Debug了。

最后

界面化调试偶尔用用即可,不要过于依赖,养成打印日志,通过日志定位、排查问题才是王道。

@johnnychq johnnychq changed the title NODE中的调试 NODE中的断掉调试 Mar 11, 2017
@johnnychq johnnychq changed the title NODE中的断掉调试 NODE中的断点调试 Mar 11, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant