Joyent如何对Node代码进行调试

译文
开发 前端
作为Node.js的有力后盾,Joyent与我们分享了其对于节点以及应用程序的调试方式,并就最为常见的外部部署问题作出了解答。

Node.js与JavaScript各自为用户带来强大的功能与性能表现,但二者却又拥有自己独特的使用成本。首先,JavaScript是一款相对较新的通用型编程语言;其二,Node.js堆栈所采用的错误报告与调试方式相当特殊。

[[112863]] 

当我最近与Node.js项目负责人Timothy J. Fontaine探讨这些问题时,他表示Joyent——以及其它一些Node.js用户——在处理过程中采用的办法值得我们借鉴。

“Node.js使用JavaScript并具备动态特性,”他表示,“因此当大家遇到问题时,很难准确把握到底是哪里闹出了毛病。在传统应用程序当中,一旦出现崩溃状况、我们能够找到与之相关的核心文件与符号。然而在Node.js JavaScript的V8引擎当中,如果进程卡死、我们根本没有足够的信息来弄清到底是哪一步处理过程引发了故障——这是因为全部JavaScript信息都已经不复存在。作为仅有的途径,大家只能通过添加更多日志记录或者搜索现有日志来摸索问题发生的原因。”

作为***知名度的Node.js部署问题的受害者,沃尔玛对此表示有话要说。据称经过调查,沃尔玛方面竟然发现Node.js就是导致内存泄露的罪魁祸首,不过Fontaine认为这样的情况只能算是极端性个例。他同时解释称,在大多数情况下、决定事态的关键因素在于Node.js与JavaScript的实际使用方法以及环境开发人员对二者的熟悉程度。

“在Node.js的众多特性当中,最难以把握的就是它的异步本质,”Fontaine指出。“大量内容同时处于运行当中,相比之下PHP、Python以及Ruby的调试对象则只有单一进程或者每个请求中的单一线程。因此对于JavaScript而言,即使是对堆栈进行全盘追踪都不足以达成调试目标。”

为此,Joyent公司认为大多数由Node.js部署所引发的问题都属于意料之外的突发事件以及应用程序错误,而且这一切在部署流程的早期阶段中并不容易发现。

“Node设计思路所带来的一大副产品在于,”Fontaine解释道,“JavaScript是一种动态语言,因此我们并不能从编译器当中获取静态运行状态。这一点既有积极的效果、也会引发消极影响,具体取决于大家的实际开发方式。其实我们遭遇的大部分故障用例都属于很普通的应用程序漏洞,只不过我们很难重新构建运行历史、从而再现曾经引发的问题。

为了解决调试过程中面临的这一阻碍,Joyent公司将其自家SmartOS作为开发平台。SmartOS属于OpenSloaris系统的一个分支,其DTrace技术成为该平台的***特色(除了其他开发人员之外,Joyent公司CTO Brian Cantrill也参与了该技术的开发工作)。DTrace能够在几乎不影响性能表现的前提下对应用程序的执行过程进行追踪与概括,Fontaine与其他不少技术从业者都将其视为检查Node.js运行代码的理想手段。

“大家可以在代码运行过程中查看JavaScript堆栈帧,”Fontaine解释道。“在其它环境下,我们没有办法从这个层面进行检查。在其它平台上,我们必须配合特殊标来运行Node、从而获取额外调试信息,而这会给性能带来负面影响。”

“Joyent之所以能够继续延续这种处理方式,是因为我们编写了相关工具以帮助自身处理此类问题。此外,我们还积极与其他用户接触、将这些技术成果用于帮助他人。”

SmartOS本身是一款基于CDDL许可的免费系统,但大多数人显然希望能在自己已经在使用的系统平台上获得理想的调试工具——而随着Node.js向着更完善的1.0版本迈进,Joyent方面可能也正在进一步作出探索。

英文原文:http://www.infoworld.com/t/open-source-software/how-joyent-debugs-node-code-242287

责任编辑:林师授 来源: 51cto.com
相关推荐

2017-04-18 09:27:14

Visual StudNode.js调试

2016-01-12 10:38:58

Angular.js代码调试

2021-06-15 20:59:14

Kubernetes调试容器

2012-02-02 15:14:29

Node.js

2012-12-25 13:37:29

Android代码混淆

2017-12-12 13:17:36

机器学习代码单元测试

2010-03-01 11:06:52

Python 调试器

2021-11-04 05:43:38

GoKartGo代码静态安全分析

2015-02-12 09:32:17

Node.jsJoyent

2010-02-22 10:18:29

Python代码

2011-01-20 10:33:30

Postfix

2023-01-30 08:30:09

Tomcat性能优化

2021-06-21 09:00:00

Python代码开发

2010-01-05 13:29:50

JSON对象

2010-05-11 08:58:22

mysql表字段

2010-01-20 17:48:07

C++ 函数重载

2021-09-02 22:52:16

ValueDictionary排序

2022-04-26 05:55:13

容器K8s管理debug问题

2021-09-27 16:39:10

PythonGif压缩

2021-06-15 15:03:21

MongoDBNode.jsCRUD
点赞
收藏

51CTO技术栈公众号