上一期我们为大家介绍了安装Eclipse调试插件的情况,这对于还不熟悉Eclipse开发平台的用户是至关重要的,希望可以通过一步步的图片加文字说明,把Nodejs困难的地方变简单和清晰、友好和轻松。
现在正式进入要调试程序肯定要有调试代码。下面就是我们第一个测试的代码,很小的行数:
- var sys = require('sys');
- // 此乃计数器变量,Suspend(中断挂起)期间可以观察该变量的变化。
- var count = 0;
- sys.debug("开始进行调试……");
- function timer_tick() {
- count++;
- sys.debug("计数器:" + count);
- if (count === 10) {
- count += 1000;
- sys.debug("能在这里打点吗?错过10后不行啦");
- }
- setTimeout(timer_tick, 1000);
- }
- timer_tick();
该段代码是最简单清晰不过的了,就是通过一个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)); ,结果如下:
- //输出结果
- {
- print:[Function],
- puts:[Function],
- debug:[Function],
- error:[Function],
- inspect:[Function],
- p:[Function],
- log:[Function],
- exec:[Function],
- inherits:[Function]
- }
再回到Eclipse调试视图中。如下图表明链接nodejs成功,可以进行相关的调试工作。
切换至Project Explorer标签页,这里列出了所有的require()包文件和nodejs.exe <文件名>所指定的主程序文件,都是JavaScript(*.js)文件。
我们双击打开程序文件dbgtest.js,即可打开源码:
在行数上方双击那一行,就是一个打点的工作(breakpoint),程序随即被挂起,暂停工作,调试器中显示当地变量等的信息供用户观察与进一步应用。如图我们在第8行打了一个点:
首次使用Eclipse的调试界面感觉可能有些别扭,这没有关系。如果不太习惯,使用多几次就好。调试的基本内容大抵是那几回事。例如,你可以步进跟踪代码(step into,快捷键F5,但注意一点,对于步进require可能会crash挂掉,这也是情有可原的,require()是加载包的特殊方法)。下图则是调出watch的功能。
当然,通过在js源码中加入debugger的关键字来打点也是支持的(debugger非常有用的关键字!)。
- function timer_tick() {
- count++;
- debugger;
- sys.debug("计数器:" + count);
- ...........
- }
![play play](http://hi.csdn.net/attachment/201009/29/0_1285730867FtAz.gif)
前面不是说到nodejs --debug-brk另外一个的参数吗?究竟有何作用? --debug-brk也是调试的命令,只是在一开始时就是挂起nodejs程序不运行,等待调试器通知才运行。——明显与--debug边运行代码边监听调试的不同。为了避免过多的钻“牛角尖”,还是让用户们自己来试试这个参数吧:)
前面说到调试界面不以独立的C/C++程序提供,其实一方面可以很轻松地嫁接这个调试模块的到C/C++项目中。因为属于高级话题的部分,限水平和能力的缘故就不展开讨论了(可留意一下ry原文)。
结语:有了V8和Eclispe远程调试的可靠保障,nodejs的发展会越来越体现成熟,——让我们投入到美丽的SSJS世界中去吧!