node调试协议

node调试协议

引言

研究node调试协议(实际上是chrome调试协议)对设计和实现自己的node远程调试工具来说至关重要,它不仅被用在chrome的开发工具中,也可以用它来实现自己的web ide产品,比如调试node中运行的javascript代码。

协议的版本

chrome调试协议是调试客户端和调试目标进行调试交互的规范,该协议通过json格式的文档protocol.json给出。
目前协议稳定版本是1.2,针对不同的运行环境protocol.json分为两个不同的协议内容,一种是提供给chrome浏览器的,一种是提供给基于V8 javascript引擎的运行环境,如node。
通过https://chromedevtools.github.io/debugger-protocol-viewer/ 可以了解协议的相关信息。
目前,提供给浏览器的协议描述在:
https://chromedevtools.github.io/debugger-protocol-viewer/1-2/
提供给基于V8运行环境的在:
https://chromedevtools.github.io/debugger-protocol-viewer/v8/
为了调试node应用程序,所以我们比较关注后者。
node6.3.0发布了一个v8-inspector重大变更,支持--inspect启动标识,因此从该版本开始,可以基于chrome调试协议去调试node了。

查看node所支持的协议版本

通过如下命令启动node应用程序,如下所示:(app.js是你要运行的应用程序的入口程序)

node --inspect=9222 app.js

在浏览器中输入url:
http://127.0.0.1:9222/json/version

将得到类似如下返回内容:

node6.3

[ {  "Browser": "node.js/v6.3.0",  "Protocol-Version": "1.1",  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/45.0.2446.0 Safari/537.36",  "WebKit-Version": "537.36 (@198122)"} ]

node7.0

[ {
  "Browser": "node.js/v7.0.0",
  "Protocol-Version": "1.1"
} ]

从返回内容来看协议版本为1.1。
最好升级node到最新的稳定版,因为在node6.8中发布了一个变更,可以通过url:
http://127.0.0.1:9222/json/protocol获取到json格式的具体协议内容。
类似如下内容:

{
    "version": { "major": "1", "minor": "1" },
    "domains": [
        ......
    ]
}

协议内容

调试协议分为六个domain,分别为Schema、Runtime、Debugger、Console、Profiler、HeapProfiler。我们这里主要关注Debugger。
Debugger向开发者提供了调试javascript的的能力,如java调试一样,可以设置断点、跟踪线程栈、进行step。

Debugger域

方法

  • enable()

    针对当前页面启动调试能力,客户端在调试前必须调用该方法启动调试能力,并在得到该方法的返回后才能正式进入调试

  • disable()

    针对当前页面禁用调试能力

  • setBreakpointsActive(active:boolean)

    激活当前页面的所有断点

  • setSkipAllPauses(skip:boolean)

    使当前页不会被任何暂停事件所中断,如断点、异常、dom异常等

  • setBreakpointByUrl

    参数:
    lineNumber:integer
    url:string optional 设置断点的目标脚本url
    urlRegex:string optional 匹配正则表达式的url
    columnNumber:integer optional
    condition:string optional 设置断点条件

    返回值:
    {breakpointId:BreakpointId,locations:[Location]}

    在给定url的javascript文件中设置断点。一旦该命令得到执行,将返回断点id,和应用该断点的文件位置。url和urlRegex必须得设置一个。

  • setBreakpoint

    参数:
    location:Location
    condition:string

    返回:
    {breakpointId:BreakpointId,actualLocation:Location}

    在给定的Location处设置断点

  • removeBreakpoint(breakpointId:BreakpointId)

    删除断点

  • continueToLocation(location:Location)

    继续执行,直到到达目标位置

  • stepOver()

  • stepInto()

  • stepOut()

  • pause()

  • resume()

  • searchInContent

    参数:
    scriptId:Runtime.ScriptId 搜索目标脚本的id
    query:string 搜索内容
    caseSensitive:boolean optional 是否大小写敏感
    isRegex:boolean optional 是否使用正则表达式

    返回:
    {result:[SearchMatch]}

    在指定目标脚本里搜索字符串,该方法属于体验性方法

  • setScriptSource

    参数:
    scriptId:Runtime.ScriptId
    scriptSource:string 新的脚本内容
    dryRun:boolean optional 如果设置为true,改变不会被真正被应用。经常用来获取结果而并不真正去改变代码

    返回:
    {
    callFrames:[CallFrame], //optional 如果编辑发生了,返回新的栈帧
    stackChanged:boolean, //optional 当前调用栈是否被改变
    asyncStackTrace:Runtime.StackTrace //optional 异步的stack trace,如果有的话
    exceptionDetails:Runtime.ExceptionDetails //optional 异常信息,如果有的话
    }

    编辑脚本内容

  • restartFrame

    参数:
    callFrameId:CallFrameId 栈帧id

    返回:
    {
    callFrames:[CallFrame] //新的stack trace
    asyncStackTrace:Runtime.StackTrace
    }

    重新从某一栈帧开始执行

  • getScriptSource(scriptId:Runtime.ScriptId)

    返回:
    {
    scriptSource:string
    }

    获取脚本内容

  • setPauseOnExceptions

    参数:
    state:string 只能设置三个值:none, uncaught, all.

    定义在什么异常情况下暂定,默认是none。all为任何异常都暂停。

  • evaluateOnCallFrame

    参数:
    callFrameId:CallFrameId
    expression:string 表达式内容
    objectGroup:string optional 将结果放在哪个分组下
    includeCommandLineAPI:boolean optional 指定表达式是否应该存在命令行api,默认false
    silent:boolean optional 在静默状态下,表达式评估异常不会报告且不会造成暂定
    returnByValue:boolean optional 是否期望返回结果是json对象
    generatePreview:boolean optional 是否生成结果预览,体验性参数

    返回:
    {
    result:Runtime.RemoteObject
    exceptionDetails:Runtime.ExceptionDetails//optional
    }

    在指定栈帧评估表达式

  • setVariableValue

    参数:
    scopeNumber:integer 域序号,基于0。只运行local、closure、catch域。
    variableName:string 变量名
    newValue:Runtime.CallArgument 新的变量值
    callFrameId:CallFrameId

    指定栈帧上设置某变量的值

  • setAsyncCallStackDepth

    参数:
    maxDepth:integer 异步调用栈的最大深度,,默认为0,不去收集异步调用栈

    禁用或启用异步调用栈的跟踪

  • setBlackboxPatterns

    体验性 略

  • setBlackboxedRanges

    体验性 略

事件

  • scriptParsed

    虚拟机解析脚本时触发

    参数:
    scriptId:Runtime.ScriptId
    url:string
    startLine:integer
    startColumn:integer
    endLine:integer
    endColumn:integer
    executionContextId:Runtime.ExecutionContextId 脚本的执行上下文
    hash:string
    executionContextAuxData:object optional
    isLiveEdit:boolean optional 脚本是否来自动态改变的内容。体验性。
    sourceMapURL:string optional source map的url
    hasSourceURL:boolean optional 脚本是否存在source url

  • scriptFailedToParse

    虚拟机解析脚本失败时触发

    参数:
    scriptId:Runtime.ScriptId
    url:string
    startLine:integer
    startColumn:integer
    endLine:integer
    endColumn:integer
    executionContextId:Runtime.ExecutionContextId 脚本的执行上下文
    hash:string
    executionContextAuxData:object optional
    sourceMapURL:string optional source map的url
    hasSourceURL:boolean optional 脚本是否存在source url

  • breakpointResolved

    当一个断点在某脚本的目标位置得带应用时触发

    参数:
    breakpointId:BreakpointId
    location:Location

  • paused

    当虚拟因异常或断点或其它缘由暂停时

    参数:
    callFrames: [ CallFrame ] 虚拟机停止在哪个栈
    reason:string 原因(包括XHR, DOM, EventListener, exception, assert, debugCommand, promiseRejection, other).
    data:object optional 辅助属性
    hitBreakpoints:[string] optional hit到的断点id
    asyncStackTrace:Runtime.StackTrace optional

  • resumed

    虚拟机恢复运行时触发

类型

  • BreakpointId

    断点id
    string

  • CallFrameId

    调用栈id
    string

  • Location

    代码位置
    object
    属性:
    scriptId:Runtime.ScriptId
    lineNumber:integer
    columnNumber:integer optional

  • CallFrame

    栈帧
    object
    属性:
    callFrameId:CallFrameId
    functionName:string 函数名
    functionLocation:Location optional 体验性
    location:Location
    scopeChain:[Scope] 该帧的调用域链
    this:Runtime.RemoteObject 该帧的调用者
    returnValue:Runtime.RemoteObject optional 如果该帧处于函数返回点将得到返回值

  • Scope

    执行域
    object
    属性:
    type:string 包括:global, local, with, closure, catch, block, script
    object:Runtime.RemoteObject 代表该执行域的对象,对global和with域来说代表真正的对象,对于其他域只是该域的描述,包括了域里的属性和变量
    name:string optional
    startLocation:Location
    endLocation:Location

  • SearchMatch

    搜索匹配结果
    object
    属性:
    lineNumber:number 所在行
    lineContent:string 匹配的内容

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,864评论 6 13
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 1.上传文件,可通过FTP上传 2.安装虚拟环境,安装virtualenv pip3 install virtua...
    Py_Explorer阅读 179评论 0 0