node調(diào)試協(xié)議

node調(diào)試協(xié)議

引言

研究node調(diào)試協(xié)議(實際上是chrome調(diào)試協(xié)議)對設(shè)計和實現(xiàn)自己的node遠程調(diào)試工具來說至關(guān)重要,它不僅被用在chrome的開發(fā)工具中,也可以用它來實現(xiàn)自己的web ide產(chǎn)品,比如調(diào)試node中運行的javascript代碼贬堵。

協(xié)議的版本

chrome調(diào)試協(xié)議是調(diào)試客戶端和調(diào)試目標進行調(diào)試交互的規(guī)范深碱,該協(xié)議通過json格式的文檔protocol.json給出。
目前協(xié)議穩(wěn)定版本是1.2她奥,針對不同的運行環(huán)境protocol.json分為兩個不同的協(xié)議內(nèi)容瓮增,一種是提供給chrome瀏覽器的,一種是提供給基于V8 javascript引擎的運行環(huán)境哩俭,如node绷跑。
通過https://chromedevtools.github.io/debugger-protocol-viewer/ 可以了解協(xié)議的相關(guān)信息。
目前凡资,提供給瀏覽器的協(xié)議描述在:
https://chromedevtools.github.io/debugger-protocol-viewer/1-2/砸捏。
提供給基于V8運行環(huán)境的在:
https://chromedevtools.github.io/debugger-protocol-viewer/v8/
為了調(diào)試node應(yīng)用程序隙赁,所以我們比較關(guān)注后者垦藏。
node6.3.0發(fā)布了一個v8-inspector重大變更,支持--inspect啟動標識伞访,因此從該版本開始掂骏,可以基于chrome調(diào)試協(xié)議去調(diào)試node了。

查看node所支持的協(xié)議版本

通過如下命令啟動node應(yīng)用程序咐扭,如下所示:(app.js是你要運行的應(yīng)用程序的入口程序)

node --inspect=9222 app.js

在瀏覽器中輸入url:
http://127.0.0.1:9222/json/version

將得到類似如下返回內(nèi)容:

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"
} ]

從返回內(nèi)容來看協(xié)議版本為1.1芭挽。
最好升級node到最新的穩(wěn)定版,因為在node6.8中發(fā)布了一個變更蝗肪,可以通過url:
http://127.0.0.1:9222/json/protocol獲取到j(luò)son格式的具體協(xié)議內(nèi)容袜爪。
類似如下內(nèi)容:

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

協(xié)議內(nèi)容

調(diào)試協(xié)議分為六個domain,分別為Schema薛闪、Runtime辛馆、Debugger、Console豁延、Profiler昙篙、HeapProfiler。我們這里主要關(guān)注Debugger诱咏。
Debugger向開發(fā)者提供了調(diào)試javascript的的能力苔可,如java調(diào)試一樣,可以設(shè)置斷點袋狞、跟蹤線程棧焚辅、進行step。

Debugger域

方法

  • enable()

    針對當前頁面啟動調(diào)試能力苟鸯,客戶端在調(diào)試前必須調(diào)用該方法啟動調(diào)試能力同蜻,并在得到該方法的返回后才能正式進入調(diào)試

  • disable()

    針對當前頁面禁用調(diào)試能力

  • setBreakpointsActive(active:boolean)

    激活當前頁面的所有斷點

  • setSkipAllPauses(skip:boolean)

    使當前頁不會被任何暫停事件所中斷,如斷點早处、異常湾蔓、dom異常等

  • setBreakpointByUrl

    參數(shù):
    lineNumber:integer
    url:string optional 設(shè)置斷點的目標腳本url
    urlRegex:string optional 匹配正則表達式的url
    columnNumber:integer optional
    condition:string optional 設(shè)置斷點條件

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

    在給定url的javascript文件中設(shè)置斷點。一旦該命令得到執(zhí)行砌梆,將返回斷點id默责,和應(yīng)用該斷點的文件位置贬循。url和urlRegex必須得設(shè)置一個。

  • setBreakpoint

    參數(shù):
    location:Location
    condition:string

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

    在給定的Location處設(shè)置斷點

  • removeBreakpoint(breakpointId:BreakpointId)

    刪除斷點

  • continueToLocation(location:Location)

    繼續(xù)執(zhí)行傻丝,直到到達目標位置

  • stepOver()

  • stepInto()

  • stepOut()

  • pause()

  • resume()

  • searchInContent

    參數(shù):
    scriptId:Runtime.ScriptId 搜索目標腳本的id
    query:string 搜索內(nèi)容
    caseSensitive:boolean optional 是否大小寫敏感
    isRegex:boolean optional 是否使用正則表達式

    返回:
    {result:[SearchMatch]}

    在指定目標腳本里搜索字符串甘有,該方法屬于體驗性方法

  • setScriptSource

    參數(shù):
    scriptId:Runtime.ScriptId
    scriptSource:string 新的腳本內(nèi)容
    dryRun:boolean optional 如果設(shè)置為true,改變不會被真正被應(yīng)用葡缰。經(jīng)常用來獲取結(jié)果而并不真正去改變代碼

    返回:
    {
    callFrames:[CallFrame], //optional 如果編輯發(fā)生了,返回新的棧幀
    stackChanged:boolean, //optional 當前調(diào)用棧是否被改變
    asyncStackTrace:Runtime.StackTrace //optional 異步的stack trace忱反,如果有的話
    exceptionDetails:Runtime.ExceptionDetails //optional 異常信息泛释,如果有的話
    }

    編輯腳本內(nèi)容

  • restartFrame

    參數(shù):
    callFrameId:CallFrameId 棧幀id

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

    重新從某一棧幀開始執(zhí)行

  • getScriptSource(scriptId:Runtime.ScriptId)

    返回:
    {
    scriptSource:string
    }

    獲取腳本內(nèi)容

  • setPauseOnExceptions

    參數(shù):
    state:string 只能設(shè)置三個值:none, uncaught, all.

    定義在什么異常情況下暫定,默認是none温算。all為任何異常都暫停怜校。

  • evaluateOnCallFrame

    參數(shù):
    callFrameId:CallFrameId
    expression:string 表達式內(nèi)容
    objectGroup:string optional 將結(jié)果放在哪個分組下
    includeCommandLineAPI:boolean optional 指定表達式是否應(yīng)該存在命令行api,默認false
    silent:boolean optional 在靜默狀態(tài)下注竿,表達式評估異常不會報告且不會造成暫定
    returnByValue:boolean optional 是否期望返回結(jié)果是json對象
    generatePreview:boolean optional 是否生成結(jié)果預(yù)覽茄茁,體驗性參數(shù)

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

    在指定棧幀評估表達式

  • setVariableValue

    參數(shù):
    scopeNumber:integer 域序號,基于0巩割。只運行l(wèi)ocal裙顽、closure、catch域宣谈。
    variableName:string 變量名
    newValue:Runtime.CallArgument 新的變量值
    callFrameId:CallFrameId

    指定棧幀上設(shè)置某變量的值

  • setAsyncCallStackDepth

    參數(shù):
    maxDepth:integer 異步調(diào)用棧的最大深度愈犹,,默認為0闻丑,不去收集異步調(diào)用棧

    禁用或啟用異步調(diào)用棧的跟蹤

  • setBlackboxPatterns

    體驗性 略

  • setBlackboxedRanges

    體驗性 略

事件

  • scriptParsed

    虛擬機解析腳本時觸發(fā)

    參數(shù):
    scriptId:Runtime.ScriptId
    url:string
    startLine:integer
    startColumn:integer
    endLine:integer
    endColumn:integer
    executionContextId:Runtime.ExecutionContextId 腳本的執(zhí)行上下文
    hash:string
    executionContextAuxData:object optional
    isLiveEdit:boolean optional 腳本是否來自動態(tài)改變的內(nèi)容漩怎。體驗性。
    sourceMapURL:string optional source map的url
    hasSourceURL:boolean optional 腳本是否存在source url

  • scriptFailedToParse

    虛擬機解析腳本失敗時觸發(fā)

    參數(shù):
    scriptId:Runtime.ScriptId
    url:string
    startLine:integer
    startColumn:integer
    endLine:integer
    endColumn:integer
    executionContextId:Runtime.ExecutionContextId 腳本的執(zhí)行上下文
    hash:string
    executionContextAuxData:object optional
    sourceMapURL:string optional source map的url
    hasSourceURL:boolean optional 腳本是否存在source url

  • breakpointResolved

    當一個斷點在某腳本的目標位置得帶應(yīng)用時觸發(fā)

    參數(shù):
    breakpointId:BreakpointId
    location:Location

  • paused

    當虛擬因異赤挛耍或斷點或其它緣由暫停時

    參數(shù):
    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

    虛擬機恢復(fù)運行時觸發(fā)

類型

  • BreakpointId

    斷點id
    string

  • CallFrameId

    調(diào)用棧id
    string

  • Location

    代碼位置
    object
    屬性:
    scriptId:Runtime.ScriptId
    lineNumber:integer
    columnNumber:integer optional

  • CallFrame

    棧幀
    object
    屬性:
    callFrameId:CallFrameId
    functionName:string 函數(shù)名
    functionLocation:Location optional 體驗性
    location:Location
    scopeChain:[Scope] 該幀的調(diào)用域鏈
    this:Runtime.RemoteObject 該幀的調(diào)用者
    returnValue:Runtime.RemoteObject optional 如果該幀處于函數(shù)返回點將得到返回值

  • Scope

    執(zhí)行域
    object
    屬性:
    type:string 包括:global, local, with, closure, catch, block, script
    object:Runtime.RemoteObject 代表該執(zhí)行域的對象勋锤,對global和with域來說代表真正的對象,對于其他域只是該域的描述侥祭,包括了域里的屬性和變量
    name:string optional
    startLocation:Location
    endLocation:Location

  • SearchMatch

    搜索匹配結(jié)果
    object
    屬性:
    lineNumber:number 所在行
    lineContent:string 匹配的內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叁执,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卑硫,更是在濱河造成了極大的恐慌徒恋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欢伏,死亡現(xiàn)場離奇詭異入挣,居然都是意外死亡,警方通過查閱死者的電腦和手機硝拧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門径筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛假,“玉大人,你說我怎么就攤上這事滋恬×难担” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵恢氯,是天一觀的道長带斑。 經(jīng)常有香客問我,道長勋拟,這世上最難降的妖魔是什么勋磕? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮敢靡,結(jié)果婚禮上挂滓,老公的妹妹穿的比我還像新娘。我一直安慰自己啸胧,他們只是感情好赶站,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纺念,像睡著了一般贝椿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柠辞,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天团秽,我揣著相機與錄音,去河邊找鬼叭首。 笑死习勤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的焙格。 我是一名探鬼主播图毕,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眷唉!你這毒婦竟也來了予颤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冬阳,失蹤者是張志新(化名)和其女友劉穎蛤虐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肝陪,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡驳庭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饲常。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹲堂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贝淤,到底是詐尸還是另有隱情柒竞,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布播聪,位于F島的核電站朽基,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏离陶。R本人自食惡果不足惜踩晶,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枕磁。 院中可真熱鬧,春花似錦术吝、人聲如沸计济。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沦寂。三九已至,卻和暖如春淘衙,著一層夾襖步出監(jiān)牢的瞬間传藏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工彤守, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毯侦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓具垫,卻偏偏與公主長得像侈离,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筝蚕,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理卦碾,服務(wù)發(fā)現(xiàn),斷路器起宽,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,975評論 6 13
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,146評論 30 470
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法洲胖,類相關(guān)的語法,內(nèi)部類的語法坯沪,繼承相關(guān)的語法绿映,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 1.上傳文件屏箍,可通過FTP上傳 2.安裝虛擬環(huán)境绘梦,安裝virtualenv pip3 install virtua...
    Py_Explorer閱讀 181評論 0 0