2012-12-07 因追加《学习 NodeJS 第三天:打造 Nodejs 的调试环境(下)》的缘故,特此将原来的《下》篇改为《中》篇,如标题所示。
上一期我们为大家介绍了安装 Eclipse 调试插件的情况,这对于还不熟悉 Eclipse 开发平台的用户是至关重要的,希望可以通过一步步的图片加文字说明,把 Nodejs 困难的地方变简单和清晰、友好和轻松。
现在正式进入要调试程序肯定要有调试代码。下面就是我们第一个测试的代码,很小的行数:
该段代码是最简单清晰不过的了,就是通过一个 count 的累加器不断地让 nodejs 运行作累加。怎么运行这段代码?呵呵,如果尚未清楚如何执行一个最简单的 nodejs 的话还是在这里交待一下:在 CMD 命令行键入(须当前nodejs目录下)nodejs dbgtest.js。nodejs.exe 的参数是 javascript 的源码文件。但是因为现在我们是调试的情景,必须加上“--debug”的参数打开调试的接口,即 node –debug <文件名>。另外,nodejs 还支持 --debug-brk 的参数,下文再讲。
输入命令 nodejs -- debug dbgtest.js 后运行的截图如下:
如图则是成功运行 nodejs 的情况,正常情况下不断累加计数器(count++)。本身是 console 输出的地方,通过观察 console 的提示,我们可以看到 nodejs 内部已经在内容打开 5858 的端口等待远程调试器,此刻我们接着要做的就是运行 Eclipse(进入 Debug View),两者一起配合调试的工作,——这就是“远程”而非本地调试的含义。怎么看是否在 Debug 的视图(View)下呢?留意一下是否被选中即可,在 Eclipse 的右上角。
进入下一步的讲述之前,笔者觉得有必要加入一个小插曲,就是提及一下 nodejs 所支持的调试命令(Thanks to Nodejs sys对象),列举如下:
- sys.debug() 同步打印,调试的时候很有用
- sys.log() 带时间的输出信息
- sys.error() 输出信息
- sys.inspect(object, showHidden, depth) 显示一个对象的所有描述,如果 showHidden 为 false 时,只显示名称,没有省略。Depth 指定隔多长时间去递归对象,默认是两次
- sys.puts() 类似与 document.writeln(),在屏幕上打印,在末尾添加换行
- sys.print() 类似与 document.write(),在屏幕上打印,没有换行
用户测试一下各个方法,很容易了解其用途。例如 sys.puts(sys.inspect(sys,false,null)); ,结果如下:
再回到 Eclipse 调试视图中。如下图所示即表明链接 nodejs 成功,可以进行相关的调试工作。
切换至 Project Explorer 标签页,这里列出了所有的 require() 包文件和n odejs.exe <文件名>所指定的主程序文件,都是 JavaScript(*.js)文件。
我们双击打开程序文件 dbgtest.js,即可打开源码:
在行数上方双击那一行,就是一个打点的工作(breakpoint),程序随即被挂起,暂停工作,调试器中显示当地变量等的信息供用户观察与进一步应用。如图我们在第8行打了一个点:
首次使用 Eclipse 的调试界面感觉可能有些别扭,这没有关系。如果不太习惯,使用多几次就好。调试的基本内容大抵是那几回事。例如,你可以步进跟踪代码(step into,快捷键 F5,但注意一点,对于步进 require 可能会 crash 挂掉,这也是情有可原的,require() 是加载包的特殊方法)。下图则是调出 watch 的功能。
当然,通过在 js 源码中加入 debugger 的关键字来打点也是支持的(debugger 非常有用的关键字!)。
恢复 nodejs 程序的运行,就要按 绿色的箭头来恢复,快捷键是 F8(现在处于暂停所以中间的按钮是灰色的)红色按钮就是断开链接。另外如果至于如何关闭 nodejs 进程?据作者惯用的方式,就是在 DOS/win 的命令行下 ctrl+c 强行退出即可。
前面不是说到 nodejs --debug-brk 另外一个的参数吗?究竟有何作用? --debug-brk 也是调试的命令,只是在一开始时就是挂起 nodejs 程序不运行,等待调试器通知才运行。——明显与 --debug 边运行代码边监听调试的不同。为了避免过多的钻“牛角尖”,还是让用户们自己来试试这个参数吧:)
前面说到调试界面不以独立的 C/C++ 程序提供,其实一方面可以很轻松地嫁接这个调试模块的到 C/C++ 项目中。因为属于高级话题的部分,限水平和能力的缘故就不展开讨论了(可留意一下 ry 原文)。
结语:有了 V8 和 Eclispe 远程调试的可靠保障,nodejs 的发展会越来越走向成熟,——最后,让我们投入到美丽的 SSJS (Server Side JavaScript)世界中去吧!